Programação em linguagem C - Parte 2
Anderson M. Amaral
Agosto - 2017
A "solução" proposta considerando apenas o que foi discutido até agora não é totalmente satisfatória:
void setup() {
Serial.begin(9600); // Inicia o envio de dados via comunicacao serial
pinMode(2, INPUT); // Configura o pino 2 como entrada
}
void loop() {
int buttonState = DigitalRead(2); // Le a tensao no pino 2
Serial.print("O estado do botao e "); //Envia o valor da variavel via serial
Serial.println(buttonState); // Envia o valor do estado do botao
delay(100);
}
Serial.print("O estado do botao e "); //Envia o valor da variavel
Podemos refrasear as ideias acima como (pseudo-código):
SE o botão estiver pressionado,
ENTÃO deve-se escrever "pressionado" na serial.
CASO CONTRÁRIO o botão não estará pressionado,
ENTÃO deve-se escrever "não pressionado" na serial.
Do ponto de vista prático, as ideias acima podem ser implementadas usando if
ou if-else
.
Estrutura geral
if(condição){
\* então executa este bloco *\
}
condição
for verdadeira o código imediatamente abaixo será executado.0
.Podemos também estar interessados em descrever o que o programa realiza quando a condição
não é verdadeira.
if(condição){
\* então executa este bloco *\
} else {
\* caso contrario, então executa este bloco *\
}
if
pode ser satisfeita quando a condição é um número para retornar o estado do botão quando ele está pressionado ou não . Não utilizem relações lógicas como ==
.Lembrando que para imprimir um texto: Serial.print(text);
void setup() {
Serial.begin(9600); // Inicia o envio de dados via comunicacao serial
pinMode(2, INPUT); // Configura o pino 2 como entrada
}
void loop() {
int buttonState = DigitalRead(2); // Le a tensao no pino 2
/* Inserir cod aqui */
delay(100);
}
Há alguns tipos de comparação que podem ser realizadas.
Operador | Significado |
---|---|
== |
é igual a |
!= |
não é igual a |
<= |
menor ou igual |
>= |
maior ou igual |
< |
menor que |
> |
maior que |
1+1==2
é true
, enquanto -3>5
é false
Exercício: modifiquem a condição no if
do programa anterior para obter o mesmo resultado de antes porém usando uma comparação. Faça de mais de uma maneira.
Exemplo:
SE tenho sede E tem água,
ENTÃO beber água.
SE tenho sede E não tem água,
ENTÃO comprar água. Beber a água.
Note que as ações acima só serão executadas quando tenho sede
for true
.
A
e B
duas afirmações lógicas (ex.: A
representa o resultado da expressão x>15
), podemos construir condições lógicas para controlar a execução de partes do programa.!
), e (&&
), ou (||
)Negação (!A
)
A |
!A |
---|---|
true |
false |
false |
true |
E (A&&B
)
A |
B |
A&&B |
---|---|---|
false |
false |
false |
true |
false |
false |
false |
true |
false |
true |
true |
true |
OU (A||B
)
A |
B |
A||B |
---|---|---|
false |
false |
false |
true |
false |
true |
false |
true |
true |
true |
true |
true |
switch-case
Uma outra possibilidade de controlar as ações do programa por meio de uma expressão é no ambiente case
. No exemplo abaixo, o programa reage diferentemente quando var
assume os valores 1
ou 2
. Caso var
seja outro valor, segue-se para o caso default
switch (var) {
case 1:
//do something when var equals 1
break;
case 2:
//do something when var equals 2
break;
default:
// if nothing else matches, do the default
// default is optional
break;
}
case X:
, e cada caso finaliza quando se chega a linha break;
goto
goto
. Não é necessário e a compreensão do programa pode ficar terrível! Não falarei sobre ele aqui. Para alguns detalhes, ver arduino.cc/en/Reference/Gotofor
Uma forma de mandar o sinal de controle é montar uma sequência de valores indicando qual a cara do sinal
int delays[9] = {100, 100, 100, 200, 200, 200, 100, 100, 100};
array
, ou uma sequência de dados numéricos.delays[0]==100
, delays[2]==100
, delays[3]==200
.Podemos acessar sequencialmente os dados acima usando um loop for.
int i;
for(i=0; i<9; i++){
Serial.println(delays[i]);
}
for
:i=0
i<9
i++
i++
corresponde ao código i=i+1
;for
e estão mais suscetíveis a problemas.Ex.: while
while(condição){
/*Executa código*/
}
Verifica se a condição é válida no início do loop
Ex.: do-while
do
{
/*Executa código*/
} while (condição);
Tais abordagens costumam ser piores por não se ter um conhecimento exato do que está sendo realizado em cada loop. No caso do for
, sabe-se exatamente quando o loop inicia e quando termina.
Reimplementem o aviso de SOS usando while e do-while.