Pessoal, estou iniciando agora com o arduino...e essa duvida aqui é muito pertinente da minha parte...
void setup()
{
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
pinMode(7, INPUT);
}
void loop()
{
int b = digitalRead(7);
if (b==HIGH){
digitalWrite(11, HIGH);
}
else {
digitalWrite(11,LOW);
}
while (b==HIGH){
digitalWrite(10, HIGH);
}
}
Analisando esse codigo...Ao apertar o botao eu nao deveria acender o led 11 e o led 10 e após soltar o botão, apagar os leds? Não é o que acontece, ao apertar os dois acendem, ao tirar...nada acontece! Os leds nunca apagam, parece que nunca sai do loop while! Ajuda!
A minha duvida é na verdade que sempre que eu uso WHILE o loop NUNCA TERMINA, mesmo sabendo que a variavel já não tá assumindo o valor que tá na condição do while, simplesmente o LOOP NUNCA SAI!! ajuda porfavor!
int i = 0;
while(i < 10){
digitalWrite(13, HIGH);
delay(100);
digitalWrite(13, LOW);
delay(100);
i++;
}
Nao especificas em que parte colocaste isto no codigo.Vou presumir que foi na loop(){}
A resposta é simples o avr arranca e entra na loop e logo ai encontra um while que ira correr 10 vezes e depois sai,so que logo de seguida entra dentro dele novamente pois o while esta na loop.Ele é tao rapido que entao nao das conta que ele terminou o while pois assim que sai corre-o de novo.
void loop()
{
int b = digitalRead(7);
if (b==HIGH){
digitalWrite(11, HIGH);
}
else {
digitalWrite(11,LOW);
}
while (b==HIGH){
digitalWrite(10, HIGH);
}
Estas a prever o debouncing do botao?
Sabes que quando um while é avaliado verdade ele nunca é libertado?
Se sim como pensas que iras sair deste while
while (b==HIGH){
digitalWrite(10, HIGH);
Se isto for verdade que ira ser quando premires o botao ira ficar aqui sempre e nao ira sair ate que preciones o reset!!!
Nao queres antes um if ai?
no entanto podes fazer melhor que isso em termos de eficiencia de codigo
O while irá executar enquanto b for igual a HIGH certo? E quando ele deixa de ser igual a HIGH? Nunca neste nexte exemplo.
A maneira correta de fazer o que você isto seria ou:
void loop()
{
int b = digitalRead(7);
if (b==HIGH){
digitalWrite(11, HIGH);
}
else {
digitalWrite(11,LOW);
}
if (b==HIGH){ // <<<<<<<<<<<<<<< if no lugar de while
digitalWrite(10, HIGH);
}
}
ou
void loop()
{
int b = digitalRead(7);
if (b==HIGH){
digitalWrite(11, HIGH);
}
else {
digitalWrite(11,LOW);
}
while (digitalRead(7)==HIGH){ // <<<<<<<<<<<<<<<< digitalRead no lugar de b, ou colocar um novo digitalRead dentro do while para atualizar o valor de b
digitalWrite(10, HIGH);
}
}
Tudo depende do comportamento esperado.
Ainda tem a questão que a saída 10 nunca assume o valor LOW