Ciao a tutti,
il progetto che vorrei sottoporvi è semplice ma non riesco a venirne a capo. Si tratta di questo: all'accensione il led blu si accende,premo il pulsante una prima volta il led blu si spegne e un led verde inizia a lampeggiare e fino a qui tutto bene ma quando premo il pulsante una seconda volta vorrei che il lampeggio terminasse e che si accendesse il led blu,purtroppo questo non accade. Scusate per questo sketch banale ma sono all'inizio. Vi ringrazio anticipatamente.
Guido
int semaforo_verde = 2; // led verde collegato al pin digitale 2
int semaforo_blu = 3; // led blu collegato al pin digitale 3
int puls = 4; // pulsante collegato al pin digitale 4
int val =0; // si userà val per conservare lo stato del pin di input
int stato =0; // ricorda lo stato in cui si trova il led, stato = 0 led spento, stato = 1 led acceso
void setup() {
pinMode(semaforo_verde,OUTPUT); // imposta pin 2 come outpu
pinMode(semaforo_blu,OUTPUT); // imposta pin 3 come outpu
pinMode(puls,INPUT); // imposta il pin 5 come input
}
void loop() {
val=digitalRead(puls); // legge il valore dell'input e lo conserva nella variabile VAL
if (val==1) { // controlla che l'input sia HIGH (pulsante premuto)
stato = 1 - stato; // variazione variabile stato
delay(30); // attendere che questi rimbalzi spuri si concludano
}
if (stato == 1) {
digitalWrite(semaforo_blu,LOW); // spengo semaforo blu
digitalWrite(semaforo_verde,HIGH); // accendo semaforo verde
delay(1000); // attesa
digitalWrite(semaforo_verde,LOW); // spengo semaforo verde
delay(1000); // attesa
}
else {
digitalWrite(semaforo_blu,HIGH); // accendo semaforo blu
digitalWrite(semaforo_verde,LOW); // spengo semaforo verde
}
}
Se non modifichi lo stato da qualche parte è impossibile che ti modifiche quell'else. Poi mi spieghi il perché di questo?
stato = 1 - stato;
semplicemente metti
stato=1;
Poi se tu vuoi fare quella cosa, secondo me ti conviene dichiarare un'altra variabile di tipo boolean e dentro l'if del pulsante metti un altro if che quando lo premi una volta te lo mette a true ad esempio e quando ripremi il pulsante ti verifica l'altro if che hai dentro il pulsante con la boolean e dentro quell'if metti lo stato a zero e la boolean false.
la dichiarazione tipo una cosa così
boolean cambio = false;
Anzi è molto più semplice:
al posto di fare stato = 1 nel tuo if fai stato++;
e poi al posto del tuo else metti un if che quando lo stato è uguale a 2 esegue quello che hai dentro adesso all'else
e riporti lo stato a zero o uno a seconda di cosa vuoi fare
Buonaseraaaaaaaa......
stato = 1 - stato; è come stato=!stato; (tanto tra poco qualcuno mi cazzia lo sento)
probabilmente voleva utilizzare stato per fare il toggle
Il problema mi pare sia che stato non potrà mai andare a 0: devi rilevare il passaggio da 0 ad 1 mettendo uno statoOld per comparazione
quando valOld==0 and digitalRead(puls)==1 allora {stato=!stato;valOld=1}
poi metti if (stato......
come hai già scritto
Stefano
Infatti ci vuole comunque un'altra variabile per gestire la cosa
Il mio ragionamento era quasi giusto
stato = 1 - stato; è come stato=!stato; (tanto tra poco qualcuno mi cazzia lo sento)
probabilmente voleva utilizzare stato per fare il toggle
Vedi prevedi e stravedi cazziata imminente?
In effetti stato = 1 - stato; funziona come toggle e non soffre di side effect.
Al suo posto uso sempre lo xor così: stato ^= 1; che per esteso sarebbe: stato = stato ^ 1;
Ciao.
Al suo posto uso sempre lo xor così: stato ^= 1; che per esteso sarebbe: stato = stato ^ 1;
ma alla fine chi è stato?
dai che è facile!!!
intanto prendi Blink Without Delay e fai lampeggiare un led come si deve
togliendo così quei delay() terribili e aggiungi poi un AND a
digitalWrite(ledPin, ledState);
che diventa
digitalWrite(ledPin, ledState*stato); o state del pulsante
sempre nel loop metti lo sketch Switch
https://www.arduino.cc/en/tutorial/switch
togliendo la parte led che hai già nel Blink Without Delay
MauroTec:
Vedi prevedi e stravedi cazziata imminente?
... l'entità Gpb01 mi ha "ripassato" in un altro post per un banale --i;

Grazie a tutti per le vostre osservazioni, vedo cosa posso fare.
Guido
@Guido se cercavi bene ne parlammo a gennaio qui su questo forum stessa domanda
posts #5 e #7, ma leggilo tutto che è mejo
Grazie mille pablos per la dritta,sono molto lontano dalla funzione millis,mi darò da fare.
Guido
… l’entità Gpb01 mi ha “ripassato” in un altro post per un banale --i;
<<entità>> 
gpb01 per cortesia non mi sconvolgere gli utenti, che poi, prima di scrivere gli tremano le mani e vengono fuori link che puntano al nulla. 
Comunque ci sono arrivato al link corretto http://forum.arduino.cc/index.php?topic=406964.msg2799613#msg2799613
PS: e poi mica era una cazziata quella, certo che la realtà alle volte è dura. 
By by.
Comunque le cazziate me le sono prese pure io
Anche su questo post 
Ahahahah.... dai, direi proprio che l'Entità bacchetta a ragion veduta.
..... poi io sono abbastanza irriverente e a volte anche approssimativo 