Status led?

Salve, mi scuso per l'assenza e per non aver potuto ringraziare nello scorso thread. Però purtroppo il tempo è sempre poco e non riesco quasi mai a lavorare con Arduino e quindi non incontro spesso problemi.

Sono qua per chiedervi una mano

const byte led = 13;   
const byte puls = 2; 
char val; 
byte statusled = LOW;

void setup() 
{
  pinMode(led, OUTPUT);   
  pinMode(puls, INPUT);
  Serial.begin(9600);
}


void loop(){
  const byte button = digitalRead(puls);
  delay(10); // debounce

  if (button == HIGH) statusled = HIGH;
  
  if (button == LOW) statusled = LOW;
  

  if( Serial.available() )      
  {
    val = Serial.read();         
  }

  if( val == 'G' ) statusled = HIGH;

  digitalWrite(led, statusled); 
 
 if( val == 'E' ) statusled = LOW;
    digitalWrite(led, statusled); 
}

Ringrazio gli utenti che mi hanno dato una mano prima.. Ma ora vorrei che il led si accendesse e rimanesse acceso anche se io non tengo premuto il pulsante e poi spegnerlo per spegnerlo vorrei ripremere il pulsante.

Capite cosa intendo? Capisco che mi sono spiegato un po' male cercherò di farlo meglio:

Premo una volta = Led (HIGH)

Premo seconda volta = Led (LOW)

Ciao, il codice che hai postato ha qualche problema, il debounce non è un debounce perchè leggi e aspetti senza effetturare la lettura di controllo, ti consiglio di usare la libreria bounce (c'è un esempio nell'ide se non ricordo male e comunque lo trovi sul sito se non dovesse esserci nell'ide).
Poi le verifiche della variabile val le sposterei all'interno dell'if Serial.available() e lascerei alla fine una sola digitalwrite.
Ah anche l'indentazione usata è abbastanza fuorviante sembra fatta apposta per indurre in errore chi legge il codice :cold_sweat: l'ultima digitalwrite sembra essere all'interno dell if ma in realtà non lo è e si capisce dall'assenza di parentesi graffe, con codice semplice non è un problema ma se il codice si complica alle volte si diventa matti

Ciao

Ti ringrazio per la risposta! Proverò ad aggiustarlo e farti sapere!

Ragazzi sto provando di tutto ma non riesco a far tenere in "memoria" lo stato al led. Help

Lasciando perdere al momento la parte del serial (ed il fatto che dopo le condizioni degli IF le istruzioni da eseguire se la condizione è true andrebbero messe fra {} ogni istruzione su una riga col suo bel ; in modo che il codice sia corretto ed anche leggibile da altri... ed anche il debounching) togli il secondo if (quello che ti porta lo statusled a LOW se il pulsante è LOW)... altrimenti appena lasci il pulsante lo status si porta a LOW ed il led si spegne.

Metti un solo IF che se il pulsante è premuto (presumo sia connesso in modo da dare HIGH quando lo premi) ti inverte lo stato del led e poi va a fare il digitalwrite sulla porta del led. Tutto qui. Quando lo premi, se lo stato è on passerà ad off e se è off passerà ad on.

La gente è in grado di fare cose complesse, come guidare una vettura su un percorso di montagno e poi si perde nelle cose semplici.

Analizza il problema, analizza come lo affronti tu, immedesimati nella stupidità del microcontroller e cerca una soluzione a questa.

Mi passi la bottiglia.

Sequenza:
Bottiglia? identificabile dalla forma, identificabile dal contesto.
contesto è == cena, pranzo o simili, si tratta di bottiglia di una bevanda, bevanda ancora da identificare.
Controllo presenza bottiglia: esiste solo una bottiglia nelle mie immediate vicinanze,
scartare tutti gli altri controlli
eseguire l'azione.
Controllo presenza bottiglia: ci sono due bottiglie, una di acido muriatico e una di aranciata
individuazione bottiglia da conteso: contesto cena,pranzo o simili, bottiglia = bottiglia di aranciata.
eseguire azione

Si tratta di tantissime condizioni if nidificate che eseguiamo in modo inconsapevole, esempio
a tavola un bambino ci chiede; mi passa la bottiglia? a tavola ci sono bottiglie di vino, acqua, birra, e aranciata.
noi scartiamo subito che la bottiglia di vino e di birra e chiediamo; acqua o aranciata, ma se vicino a noi abbiamo solo la bottiglia di acqua, non è necessario chiedere.

La nostra mente esegue dei cicli da cui si può decidere di uscire, e noi possiamo anche sospendere qualche ciclo per iniziarne o continuarne uno lasciato in sospeso. Eseguiamo in modo non cosciente una quantità straordinaria di if con alta velocità

Noi abbiamo anche tanti timer a cui connettiamo delle routine di interrupt, ma alla volte la routine di interrupt o il timer fallisce e ci dimentichiamo il figlio a scuola. Si vede che gli altri timer con relativi interrupt era stati scelti con priorità più elevata e questo non è buono
nostro figlio richiede la massima priorità.

Ora non prendete tutto alla lettere e non comportatevi come automi pensando che possa essere un modo infallibile, cioè non fate spack di star trek. :stuck_out_tongue:

Ciao.

fabpolli:
Ciao, il codice che hai postato ha qualche problema, il debounce non è un debounce perchè leggi e aspetti senza effetturare la lettura di controllo, ti consiglio di usare la libreria bounce (c'è un esempio nell'ide se non ricordo male e comunque lo trovi sul sito se non dovesse esserci nell'ide).

@ fabpolli un ritardo dopo una lettura di un pulsante funziona benissimo come debounce. Eviti di leggere un LOW dopo un HIGH dato dal saltellare dei contatti prima che si sono fermati.

@ Holla
pensavi a qualcosa come questo?

Ciao Uwe

MauroTec:
La gente è in grado di fare cose complesse, come guidare una vettura su un percorso di montagno e poi si perde nelle cose semplici.

Analizza il problema, analizza come lo affronti tu, immedesimati nella stupidità del microcontroller e cerca una soluzione a questa.

Mi passi la bottiglia.

Sequenza:
Bottiglia? identificabile dalla forma, identificabile dal contesto.
contesto è == cena, pranzo o simili, si tratta di bottiglia di una bevanda, bevanda ancora da identificare.
Controllo presenza bottiglia: esiste solo una bottiglia nelle mie immediate vicinanze,
scartare tutti gli altri controlli
eseguire l'azione.
Controllo presenza bottiglia: ci sono due bottiglie, una di acido muriatico e una di aranciata
individuazione bottiglia da conteso: contesto cena,pranzo o simili, bottiglia = bottiglia di aranciata.
eseguire azione

Si tratta di tantissime condizioni if nidificate che eseguiamo in modo inconsapevole, esempio
a tavola un bambino ci chiede; mi passa la bottiglia? a tavola ci sono bottiglie di vino, acqua, birra, e aranciata.
noi scartiamo subito che la bottiglia di vino e di birra e chiediamo; acqua o aranciata, ma se vicino a noi abbiamo solo la bottiglia di acqua, non è necessario chiedere.

La nostra mente esegue dei cicli da cui si può decidere di uscire, e noi possiamo anche sospendere qualche ciclo per iniziarne o continuarne uno lasciato in sospeso. Eseguiamo in modo non cosciente una quantità straordinaria di if con alta velocità

Noi abbiamo anche tanti timer a cui connettiamo delle routine di interrupt, ma alla volte la routine di interrupt o il timer fallisce e ci dimentichiamo il figlio a scuola. Si vede che gli altri timer con relativi interrupt era stati scelti con priorità più elevata e questo non è buono
nostro figlio richiede la massima priorità.

Ora non prendete tutto alla lettere e non comportatevi come automi pensando che possa essere un modo infallibile, cioè non fate spack di star trek. :stuck_out_tongue:

Ciao.

WoooW! E' fantastica la tua spiegazione non avevo mai pensato così durante la programmazione! Grazie infinite Mauro sono certo che mi tornerà utile!

pensavi a qualcosa come questo?
http://www.arduino.cc/en/Tutorial/Switch

Si avevo in mente proprio questo però aggiungendo il controllo da device android!

uwefed:
@ fabpolli un ritardo dopo una lettura di un pulsante funziona benissimo come debounce. Eviti di leggere un LOW dopo un HIGH dato dal saltellare dei contatti prima che si sono fermati.

Ciao Uwe

Ciao Uwe,
ovviamente quello che dici è corretto, ma dopo la pausa non dovrebbe essere riletto lo stato e confrontato con quello letto prima della pausa per verificare che siano uguali e non si è trattato di un rimbalzo?

Ciao