Controle de fases – switch case

  • INTRODUÇÃO

O modelo de programação chamado controle de fases é, em minha opinião, uma das ferramentas mais versáteis para o projeto de um programa usando o Arduino ou outra plataforma qualquer.

Isso porque o controle de fases permite uma separação de instruções e tarefas dentro do programa de acordo com o tipo de operação ou estado (fase) que está em execução.

Esse é o tipo de necessidade muito comum em várias aplicações, desde aplicações de jogos até aplicações de controles de processos e automatização.

Para o leitor entender do que estou falando, vou apresentar um exemplo onde o controle de fases pode ser utilizado: uma máquina automática de café.

Neste exemplo de aplicação vamos ter as seguintes fases ou estados:

A – máquina parada;

B – aquecendo a água;

C – esperando o copo;

D – fazendo o café;

E – esperando retirar o copo;

Para cada fase, o programa tem uma tarefa ou tem que esperar alguma interferência externa para passar para a próxima fase.

Vamos aprender agora como montar uma estrutura básica de um controle de fases no Arduino (ou qualquer outra plataforma).

 

  • MÁQUINA DE ESTADOS

A máquina de estados é um tipo de representação de lógica muito usada em programação. Ela descreve os estados possíveis para uma rotina de programa e também as condições para manter o estado atual ou para mudar para o próximo estado.

A máquina de estado para nosso exemplo de máquina automática de café está descrita na figura abaixo:

maquinaEstados1

As figuras ovais representam os estados possíveis dentro do programa.

As linhas com setas indicam a permanência no estado atual ou mudança para um próximo estado.

No caso do estado inicial A, a condição para mudança para o estado B é que o botão da máquina de pedido de café seja pressionado. Enquanto o botão não é pressionado, o programa permanece no estado A “aguardando” a condição de botão pedido café.

Ao desenhar o diagrama de máquina de estados para um programa que estamos desenvolvendo, conseguimos ter uma visão geral de como o programa deve funcionar e podemos prever todas as fases e as condições para que o ciclo de trabalho da máquina (ou do jogo) fique completo para atingir o seu objetivo.

Uma das vantagens do uso de controle de fases neste tipo de aplicação é que evitamos a ocorrência de eventos inesperados dentro de um programa.

Por exemplo, imagine que nossa máquina de café já iniciou a produção de um cafezinho e alguém aperta novamente o botão de pedido de café. Neste caso o programa deve ignorar este novo pedido e completar o ciclo atual.

No controle de fases o botão de pedido de café só é monitorado na fase A. Cada fase tem suas próprias tarefas sendo executadas e podemos escolher qual fase monitora qual sinal de forma bem fácil.

 

  • SWITCH CASE

Em linguagem de programação C (usada no Arduino e em vários outros processadores) a forma de implementar o controle de fases é com a instrução SWITCH CASE.

O SWITCH CASE é uma instrução que seleciona um grupo de instruções para ser executado dependendo de uma variável.

switch case1

Para transformar o SWITCH CASE em um controle de fases, usamos a variável de controle para mudar de fases dentro do programa. Em cada grupo de instruções colocamos as funções que desejamos que o programa execute em cada fase.

Para nosso exemplo, na fase A (estado A) podemos definir o grupo 1 de instruções com apenas a função que monitora o botão de pedido de café e a variável de controle fica com o valor 0.

Quando o botão de pedido de café é pressionado, mudamos o valor da variável para 1 e o programa começa a executar o grupo 2 de instruções.

 

  • IMPLEMENTAÇÃO

O uso da instrução SWITCH CASE não é complicado para ser entendido, mas sua estrutura básica tem que ser respeitada para que funcione conforme o desejado.

Abaixo temos um esquema de construção da estrutura do SWITCH CASE que contém todos os detalhes importantes para serem seguidos:

esquema

É importante notar que o valor da variável entre parênteses define qual o grupo de instruções será executado a cada vez que a instrução é executada.

Podemos ter quantas fases (grupos de instruções) quantas forem necessárias. E o número de instruções em cada grupo pode variar conforme a necessidade.

Ao final de cada grupo de instruções é necessário colocar a instrução BREAK.

Quando não colocamos a instrução BREAK, a sequência de execução das instruções continua para o próximo grupo e o controle de fases não funciona conforme o esperado.

O esquecimento da instrução BREAK não causa um erro na compilação do programa para o Arduino. Portanto é obrigação do programador conferir se todas as fases são terminadas com a instrução BREAK.

 

  • MÁQUINA AUTOMÁTICA DE CAFÉ

Para o leitor conseguir visualizar a utilização prática do controle de fases com o uso da instrução SWITCH CASE, vamos mostrar um exemplo de programa para Arduino que hipoteticamente controla uma máquina automática de café.

Apesar de parecer um controle muito complexo, vocês vão ver como o programa fica realmente bem simples com a utilização de controle de fases.

O diagrama abaixo mostra como seria uma máquina de café como esta do exemplo.

maquinaCafe

O botão serve para o usuário pedir um café iniciando o ciclo da máquina.

O bloco de aquecimento é responsável por aquecer a água a 100◦. Este bloco deve ter um sensor de temperatura que é ligado à entrada analógica A0 do Arduino.

O bloco que faz o café recebe a água aquecida e faz a mistura com o café em pó e despeja no copo.

O sensor copo detecta se existe um copo posicionado abaixo do bloco faz café.

O sinal sonoro serve para informar o usuário que o café está pronto e ele deve retirar o copo.

 

  • CÓDIGO

O código completo para automatização da máquina de café está transcrito abaixo:

 

codigo1

Como pode ser visto no código acima o programa da máquina de café é extremamente simples. Dentro da rotina principal loop ( ) temos apenas uma função de delay com tempo de 10ms e o controle de fases com o SWITCH CASE.

A função de delay serve para cadenciar a execução do programa em intervalos de 10ms. Isso quer dizer que a cada 10ms vamos executar uma das fases do SWITCH CASE.

Com este tempo ficamos com o programa mais imune a ruídos nos sinais de entrada e também a contagem de tempo fica muito fácil de ser feita.

Nossa variável de controle de fases é faseMC (Maquina de Café). É esta variável que define qual grupo de instruções será executado cada vez que executamos o SWITCH CASE.

Iniciamos com faseMC=0 e assim as instruções entre as linhas 41 e 46 são executadas neste estado e a entrada ligada ao botão de pedido de café é monitorada pela instrução “if” da linha 41.

Quando alguém aperta o botão de pedido de café, a instrução “if” deixa executar as instruções das linhas 43 e 44. Na linha 43 ligamos a saída de aquecimento para iniciar o aquecimento da água. Na linha 44 passamos o valor da variável faseMC para 1.

Com faseMC=1 passamos a executar as instruções entre as linhas 49 e 55.

Neste grupo de instruções ficamos monitorando a temperatura da água (entrada analógica A0). Quando a temperatura atinge 100◦, desligamos a saída de aquecimento e passamos a variável faseMC para 2 e passamos a executar a fase 2.

Na fase 2 esperamos ter copo posicionado na saída de café. Quando o sensor de copo identifica que há copo, as instruções das linhas 60 a 62 são executadas.

Na linha 60 ligamos a saída que libera a válvula que faz a água passar pelo pó de café e despeja o café no copo.

O volume de café produzido nesta máquina é controlado pelo tempo que a válvula fica ligada. Vamos controlar este tempo com a variável tempoFazCafe. Então na linha 61 zeramos o valor desta variável. E finalmente na linha 62 passamos o valor da variável faseMC para 3 e passamos a executar a fase 3.

A fase 3 (linhas 67 a 74) faz a contagem o tempo para produção do café. Nesta hora vamos lembrar que as fases são executadas sempre a intervalos de 10 ms. Ao incrementar o valor da variável tempoFazCafe na linha 67, estamos contando intervalos de 10 ms.

Na linha 68 comparamos o valor da variável tempoFazCafe com 500 para temos um tempo de 5 segundos (500*10ms= 5000ms= 5 segundos). Ao atingirmos este valor desligamos a saída que libera a válvula para parar de fazer café (linha 70).

Na linha 71 estamos ligando a saída que atua o sinal sonoro (beep) para informar ao usuário que o café está pronto e ele deve retirar o copo.

Na linha 72 vamos passar o valor da variável faseMC para 4 e passamos a executar a fase 4.

Na fase 4 simplesmente ficamos esperando que o operador retire o copo para desligarmos o sinal sonoro e voltar o controle de fases para a fase inicial (faseMC=0).

A última fase do SWITCH CASE é a fase default. Esta fase não é obrigatória para o funcionamento do programa.

O compilador não dá erro se deixarmos de colocá-la no programa. Mas o uso da fase default é uma das boas práticas de programação que podemos adotar em todas os nossos projetos. Vou explicar porque.

O que acontece se o valor da variável de controle de fases estiver com um valor que não é igual a nenhuma das fases descritas no programa?

Por exemplo, em nosso programa se colocarmos a variável faseMC=10. O que será que vai acontecer já que não temos nenhuma fase 10 em nosso SWITCH CASE?

O resultado é indeterminado. Normalmente nosso programa trava em uma situação como esta. E o pior de tudo é que é muito difícil identificar o problema. Principalmente em um programa com muitas linhas de código.

Para evitar este tipo de travamento que existe a fase default. A fase default é executada sempre que o valor da variável de controle não é igual a nenhuma das fases descritas.

Em nosso caso colocarmos apenas uma instrução na fase default: faseMC=0 (linha 86).

Desta forma nosso programa não vai travar em uma fase indeterminada. Se por algum problema nossa variável faseMC ficar com um valor diferente de todas as fases descritas, forçaremos seu valor para 0 e reiniciamos na fase inicial.

Nossa máquina automática de café pode ser controlada perfeitamente com este programa bem simples.

Construir uma máquina como está pode ser bem complicado, mas podenos simular seu funcionamento com leds e chaves de forma bem fácil.

Para simular a leitura de temperatura pode ser usado um potenciômetro ligado à entrada analógica A0.

O melhor de testar o código com um simulador é que fica muito fácil fazer alterações e melhorias no programa. E sempre podemos aprender mais.

 

2 comentários sobre “Controle de fases – switch case

  1. Caro José Cândido
    Excelente trabalho.
    Sou iniciante no estudo de programação com arduino. Neste momento estou trabalhando em um projeto de um programador horário semanal com opção de se fazer o acionamento de uma carga em vários períodos do dia e em vários dias escolhidos da semana e este artigo sobre o uso da função “Switch Case” foi muito esclarecedor e vai me ajudar muito a reduzir o tamanho do sketch do meu programa através da redução do uso do If além de dar mais agilidade no processamento. Você está de parabéns.

    Curtir

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s