Terminare un lampeggio al click di un pulsante

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 :wink: 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

:smiley: 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

pablos:
ma alla fine chi è stato?

dai che è facile!!!
intanto prendi Blink Without Delay e fai lampeggiare un led come si deve
https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
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
Arduino - Switch
togliendo la parte led che hai già nel Blink Without Delay

E la ricetta è pronta :smiley:

MauroTec:
:smiley: Vedi prevedi e stravedi cazziata imminente?

... l'entità Gpb01 mi ha "ripassato" in un altro post per un banale --i;
:slight_smile:

cam9500:
... l'entità Gpb01

Guglielmo

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à>> :grin:

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. :grin:

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. :wink:

By by.

Comunque le cazziate me le sono prese pure io :grin: Anche su questo post :grin:

Ahahahah.... dai, direi proprio che l'Entità bacchetta a ragion veduta.
..... poi io sono abbastanza irriverente e a volte anche approssimativo :slight_smile:

cam9500:
Ahahahah.... dai, direi proprio che l'Entità bacchetta a ragion veduta.
..... poi io sono abbastanza irriverente e a volte anche approssimativo :slight_smile:

:slight_smile: :slight_smile: