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)