Accendere un led con una sequenza di tasti

Buongiorno,

inizio dicendo che non sono molto pratico di form e sfortunatamente nemmeno di Arduino ahime ;)

Spero di aver rispettato il regolamento.

Ho provato a cercare un pò ovunque quello che mi serve ma non ci sono riuscito.

Come da oggetto, vorrei accendere un led cliccando in sequenza una serie di tasti.

Per esempio, tre tasti che cliccati nella sequenza 1, 2, 3 mi diano la possibilità di accendere il led, se cliccati in altre sequenze tipo 1, 3, 2 tengano il led spento.

Credo che serva inserire una variabile nel codice, ma non ci sto riuscendo.

Qualcuno potrebbe aiutarmi con un esempio per favore?

Grazie in anticipo

Crea una variabile int (intera) che inizi a 0 con dei doppi if (usando && and logico) Se hai premuto 1 e la variabile è a 0 la metti a 1 altrimenti a 0 if( digitalRead(pin1)==HIGH && var==0) var=1; else var=0; Se hai premuto 2 e la variabile è a 1 la metti a 2 altrimenti a 0 Se hai premuto 3 e la variabile è a 2 la metti a 3 altrimenti a 0 dopo questi semplicemente ti chiedi se var==3 allora accendi il led, altrimenti lo spegni

Quali tasti ?

Dei pulsanti o attraverso la tastiera del Pc ?

Grazie mille nid69ita. Peccato che mi dia un errore di compilazione, quindi credo che io stia commettendo qualche errore banale.

Scusami per non aver specificato brunello22, intendevo dei semplici tasti e nonn quelli del computer.

int LED = 13;
int  B1 = 9;                 
int  B2 = 8;  
int  B3 = 7;  
int var=0;

void setup() {
 pinMode(LED, OUTPUT);       
 pinMode(B1, INPUT);  
 pinMode(B2, INPUT);  
 pinMode(B3, INPUT);  

}
void loop() 
{ if (digitalRead (B1) == HIGH && var==0)
  {  var=1;  }
if (digitalRead (B2) == HIGH && var==1)
   { var=2;  }
if (digitalRead (B3) == HIGH && var==2)
   {  var=3; }
if ( var==3)
{  digitalWrite(LED, HIGH); 
   delay(5000);   }
else   var==0;
   { digitalWrite(LED, LOW);     }
}

Quando posti del codice mettilo all’interno dell’apposito tag code (identificato dal bottone </>)
L’errore è qui:

else var==0;
{digitalWrite(LED,LOW);}

ma anche se risolvi in mettendo l’if il codice comunque credo sia errato, se l’intento è accendere il led, attendere 5 secondi e poi spegnerlo allora tutta la parte dell’else va eliminata il codice inserito dopo il delay Es.

delay(5000);
var=0;
digitalWrite(LED, LOW);

Scusami fabpolli, la prossima volta inserirò il codice all’interno del tag.

E comunque non ho capito qual’è l’errore? :frowning:

Si, vorrei accendere il led, attendere 5 secondi e poi spegnerlo. Potresti aiutarmi gentilmente?

Grazie ancora.

stefanodaimler:
Scusami fabpolli, la prossima volta inserirò il codice all’interno del tag.

NO, così non va … in conformità al regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra). Grazie. :slight_smile:

Guglielmo

stefanodaimler: Scusami fabpolli, la prossima volta inserirò il codice all'interno del tag.

E comunque non ho capito qual'è l'errore? :(

Si, vorrei accendere il led, attendere 5 secondi e poi spegnerlo. Potresti aiutarmi gentilmente?

Grazie ancora.

La risposta è già nel post precedente, basta che copi ed incolli la parte dopo il delya che già hai ed elimini l'else

Scusami Guglielmo. Credo di aver rimediato ora.

fabpolli, sei davvero gentilissimo ma sfortunatamente continua a darmi "errore durante la compilazione" anche con il tuo suggerimento

che errore ti da' ?

stefanodaimler: Scusami Guglielmo. Credo di aver rimediato ora.

perfetto ! Grazie,

Guglielmo

L’errore che mi da è: Errore durante la compilazione per la scheda Arduino/Genuino Uno.

Prova così:

const byte pinLED = 13;
const byte pinB1 = 9;                 
const byte pinB2 = 8;  
const byte pinB3 = 7;  
int var=0;

void setup() 
{ delay(1000);
  Serial.begin(9600);
  Serial.println("setup");
  pinMode(pinLED, OUTPUT);       
  pinMode(pinB1, INPUT);  
  pinMode(pinB2, INPUT);  
  pinMode(pinB3, INPUT);  

}
void loop() 
{ if (digitalRead(pinB1)==HIGH) 
  { if(var==0) var=1; else var=0;   // oppure più sintetico:     var=(var==0?1:0);
  }
  if (digitalRead(pinB2)==HIGH)
  { if(var==1) var=2; else var=0;    // oppure più sintetico:     var=(var==1?2:0);
  }
  if (digitalRead(pinB3)==HIGH)
  { if(var==2) var=3; else var=0;
  }
  if (var==3)
  { Serial.println( F("led acceso") );
    digitalWrite(pinLED, HIGH); 
    delay(5000);   
    var=0;
  }
  else   
  { Serial.println( F("led spento") );
    digitalWrite(pinLED, LOW);     
  }
  delay(100);  // per debounce dei pulsanti
  Serial.print( F("var: ") ); Serial.println( var );
}

Ti ho aggiunto anche un pò di stampa messaggi verso il pc (serial monitor) per debuggare/verificare cosa succede.

nid69ita mi sa che ti sei dimenticato di azzerare la variabile var a 0, così il led non si spegne dopo 5 secondi ma solo dopo che è stato premuto qualche tasto ;)

Ti ho aggiunto anche un pò di stampa messaggi verso il pc (serial monitor) per debuggare/verificare cosa succede. [/quote]

Stavolta il codice non ha problemi ma non funziona ancora e dal monitor seriale sembra non cambi la variabile; resta sempre a zero e quindi il led resta sempre spento..

Ho provato ad uno ad uno tutti i tasti e ricontrollato tutti i collegamenti, ma non trovo alcun problema di collegamenti o hardware

pensandoci anche i varie if in quel modo sono sbagliati, infatti non premendo nessun pulsante l'else imposta la variabile sempre a zero, penso che si dovrebbe cambiare in questo modo:

if (digitalRead(pinB1)
{
   if (var==0) {var=1} else {var=0}
}
ecc. ecc.

mentre dopo il delay

scrivere:
var=0;

-zef-: nid69ita mi sa che ti sei dimenticato di azzerare la variabile var a 0, così il led non si spegne dopo 5 secondi ma solo dopo che è stato premuto qualche tasto ;)

Si, hai ragione, zef ! Ed anche gli if non van tanto bene. Ho modificato il mio post precedente.

stefanodaimler: Ho provato ad uno ad uno tutti i tasti e ricontrollato tutti i collegamenti, ma non trovo alcun problema di collegamenti o hardware

Vedi sopra, non ho provato il codice, ho modificato il mio post precedente. P.S. per i led.... hai messo vero delle adeguate resistenze per OGNI led ?!?

nid69ita: Vedi sopra, non ho provato il codice, ho modificato il mio post precedente. P.S. per i led.... hai messo vero delle adeguate resistenze per OGNI led ?!?

Grazie mille. Adesso il codice funziona, ma solo a volte. Nel senso che da monitor seriale riesco a vedere che il tasto viene sempre letto e di conseguenza cambia la variabile, ma spesso la stringa successiva riporta la variabile a 0..

Ho provato anche con diverse resistenze ai tasti, ma il risultato non cambia.

Non ho idea di quale possa essere il problema. A volte va e a volte no.

Ho notato anche che schiacciando i 3 pulsanti contemporaneamente il led si accende e questo non dovrebbe accadere in quanto sarebbe come forzare la password.

Il led è soltanto uno, ma non credo ci siano problemi al led in questo caso.

Grazie comunque per il supporto

stefanodaimler: Grazie mille. Adesso il codice funziona, ma solo a volte. Nel senso che da monitor seriale riesco a vedere che il tasto viene sempre letto e di conseguenza cambia la variabile, ma spesso la stringa successiva riporta la variabile a 0..

Ho provato anche con diverse resistenze ai tasti, ma il risultato non cambia.

Non ho idea di quale possa essere il problema. A volte va e a volte no.

Ho notato anche che schiacciando i 3 pulsanti contemporaneamente il led si accende e questo non dovrebbe accadere in quanto sarebbe come forzare la password.

Come comando da eseguire ogni volta che si preme un pulasnte, alla fine ho aggiunto un

delay(50);

e non so se tecnicamente è corretto, ma ora sembra vada bene ogni volta.

Non sono comunque riuscito a risolvere il problema dei pulsanti premuti in contemporanea.

Inoltre ho notato che premendo il primo pulsante 2 volte di seguito, o dopo il pulsante 2, a volte la varibile torna a 0 e a volte resta ad 1 come vorrei che accadesse. Cioè quando la variabile è a 1 o a 2, premendo il primo pulsante, non sempre la variabile va a 1, ma a volte va a 0