Ciao a tutti!
Scusatemi ho fatto ricerche in rete ma non riesco a capire dove sbaglio.
Ho un void loop() ad un certo punto del programma vorrei che il programma si fermasse fino a che non sente un segnale in ingresso da un pin. Ho usato la resistenza di pullup.
Questo è la parte che non comprendo:
int stato = digitalRead(4);
while (stato == HIGH);//attende che i1 termostato sia chiuso
{
delay (1000);
}
se no faccio il ponte tra gnd e pin 4 il programma si ferma, però quando faccio il ponte non riparte.
Se ponticello gnd e pin4 il programma non si ferma.
dove sbaglio?
Hai detto di aver usato un resistore di pullup, quindi l'ingresso normalmente è HIGH e diventa LOW quando lo porti a GND.
Il while deve perciò attendere lo stato LOW per procedere, rimanendo in loop con HIGH.
Il problema è che all'interno del while devi leggere l'ingresso e non al di fuori di esso:
while (stato == HIGH); //attende che il termostato sia chiuso
{
int stato = digitalRead(4);
delay(1000); // ritarda la lettura successiva - a cosa serve?
}
Nel while deve essere il modo che la variabile che viene usata nel while venga in qualche modo modificata.
Se come nel Tuo esempio controlli la variabile stato ma non la modifichi mai il ciclo non si ferma mai.
2 considerazione
Non ha senso mettere un delay() nel while. Rallenti solo la risposta dello sketch rispetto al evento e con eventi corti rischi anche di non accorgerne.
Chiedo scusa se magari sto dicendo una ca...volata, ma "while" non resta in loop finche' la variabile non diventa "false" (cioe' 0) ?
Se e' cosi, allora in teoria, per fermare l'esecuzione finche' l'ingresso diventa GND, dovrebbe essere sufficente una cosa del genere
while (digitalRead(4)) {}
cioe', dato che l'ingresso e' tenuto alto (true), lo leggo direttamente nel while, cosi finche' rimane alto il tutto si blocca nel while, e quando lo mette a massa lo vede "false" ed esce dal while e prosegue con il resto del programma ... o sbaglio ?
(ovviamente la riga con il while dovrebbe essere richiamata da una sub solo quando si vuole fermare il programma, altrimenti si blocca li ogni volta che il loop ci passa e l'ingresso e' ad 1 ... a meno che non sia proprio quello che vuole fare ...)
Grazie a tutti
Ho messo la stringa che ha postato Etem,
ed adesso funziona!
Ho imparato una cosa nuova!
Sto facendo per divertimento un programma per una lavatrice,il comando mi serviva per aspettare che la resistenza scaldasse l'acqua e quando il termostato e in temperatura continua il ciclo di lavaggio.
Nuovamente grazie a tutti