7 - Desviando o fluxo do programa

Criar uma Loja Virtual Grátis
7 - Desviando o fluxo do programa

7 – DESVIANDO DO FLUXO DO PROGRAMA

 

Agora só falta saber com fazer o "SE o carro bater..."

Existe uma instrução cuja sequencia será executada apenas SE uma condição existir:

      if (condição) { ... instrução 1 ; instrução 2 ; instrução 3 ; ... ; }

onde a condição é a informação que o sensor sentiu a batida (alterou seu estado ) e as instruções 1, 2, 3, ... serão as reações do carro.

Precisamos de uma variável para saber se o estado do sensor é positivo (1 ou HIGH) ou negativo (0 ou LOW). Chamamos, por exemplo de "bateE" o sensor da esquerda e "bateD" o da direita e vamos nomeá-los na área de inicialização do programa

Vamos ligar os NC (pino normalmente fechado) das chaves de fim de curso (sensores) no pólo negativo (-) e o NO (pino normalmente aberto) no pólo positivo (+). Veja o desenho do chassi.

Então, normalmente, o pino central está em LOW (-). No choque o pino muda o contato para o HIGH (+). Esta informação será levada a um dos pinos do Arduino, que deverá estar ajustado para receber (INPUT) a informação.

Então, SE a informação mudar de (- ou 0 ou LOW) para (+ ou 1 ou HIGH) significa que aquele sensor levou um choque contra o obstáculo.

No setup devemos informar ao Arduino quais pinos estarão ligados aos sensores. Pelo esboço do chassi do carro, o esquerdo está ligado ao pino A0 (zero) da placa e o direito no A1 (que também podem ser chamados de pinos 14 e 15)

Agora acrescentamos ao programa já feito:

int bateE; //variável que indica o estado do sensor esquerdo

int bateD; //variável que indica o estado do sensor direito

...

void setup() {

pinMode(A0, INPUT);  // entrada de sinal do sensor esquerdo no pino A0

pinMode(A1,INPUT):   // entrada de sinal do sensor direito no pino A1

...

}

no loop temos que fazer as variáveis assumirem os valores do sensor para verificar SE bateu

void loop() {

bateE = digitalRead(A0); //bateE é 1 se NC normal. Muda para 0 se acionado o NO na trombada

bateD = digitalRead(A1); // a mesma coisa para o bateD (serão números 1 e 0)

 

O comando digitalREad(A0) faz a leitura (Read) no pino A0 e apresenta o resultado digital (0 ou 1) que será atribuído a variável bateE.

Nosso misterioso "SE bateu do lado esquerdo ......... ôpa.... Como fazemos isso?" da página anterior vai ficar assim?

if (bateE == 1) { // inicia o desvio do fluxo caso tenha batido à esquerda

as instruções de desvio ...

} // fim do if

O mesmo para a condição de bater à direita...

Reescrevendo nosso loop:

 

void loop() { // inicio do programa de comando do carro ########################

avançar(); // chama a subrotina que avança o carro

 

if (bateE == 1) { // inicia o desvio do fluxo caso tenha batido à esquerda

recuar(); // chama a subrotina que recua o carro

delay(2000); // tempo de recuo. Experimental, mude se o movimento não ficar bom

direita(); //chama a subrotina que desvia à direita

delay(2000); // tempo de recuo. Experimental, mude se o giro for muito ou pouco

} // fim do if

 

if (bateD == 1) { // inicia o desvio do fluxo caso tenha batido à direita

recuar();

delay(2000);

direita(); //chama a subrotina que desvia à esquerda

delay(2000);

} // fim do if

 

} //fim do loop #####################################################

Compare nosso loop com o fluxograma do item "6-Parecia fácil..."

Não foi necessário colocar mais uma chamada para "avançar" pois o loop volta para o inicio, onde já existe a instrução.

ATENÇÃO: veja que usamos dos sinais de igual   = =  pois:

            x = 1  faz a variável "x" assumir valor 1

            x = = 1 verifica se o valor de x é 1

Este é um erro que costuma derrubar  programadores , assim como esquecer de ; ou { }, etc

 

EXERCÍCIO (ou "lição de casa")

Faça uma lista das palavras e sinais que fazem parte da linguagem C++ e o que significam.

(não despreze este exercício, poderá se arrepender quando não lembrar a estrutura da comunicação e tiver que procurar)