Led controller (primi passi)

ciao a tutti, mi chiamo Daniele,
affascinato dal mondo arduino sto cercando di metter in piedi un mini pannellino che, trammite pulsanti comanda alcuni LED.
Seguendo i tuttorial passo passo ho cominciato con il fare accendere un led , poi farlo lampeggiare e infine comandarlo con un pulsante..
Nei passi sucessivi sono riuscito a comandare con lo stesso pulsante l’accensione di 4 led illuminandoli ad ogni pressione.
Ora volevo unire i due progetti assieme in maniera da gestire con un pulsante l’accensione dei 4 led e con un altro l’accensione del singolo led che poi lampeggia.
unendo i due il programma mi presentava difetti:

  • non riuscivo a comandare il led singolo;
  • i 4 led si accendevano in una sequenza veloce ( si accendevano anche 2 led con una sola pressione del pulsante);
    ho provato quindi a inserire l’istruzione Serial.print per vedere che risultati avevo dalle variabili e….magia …tutto ora funziona!
    non ho modificato in alcun modo il programma ho solo aggiunto la classe serial.
    Immagino che questa crei in qualche maniera un ritardo nel ciclo del programma in quanto deve restituire un valore.
    La domanda che volevo porvi era questa:
    Si puo’ considerare stabile il mio programma? Perchè l’aggiunta di una “funzione” che risolva il problema non mi dà l’idea di una soluzione.
    Spero di essere stato chiaro nell’esporre il problema e ringrazio tutti antecipatamente per eventuali suggerimenti!
#define BUTTON 7 // pin di input a cui è collegato il pulsante
#define BUTTON_1 8 // pin di input a cui è collegato il pulsante
#define LED1 12 // LED collegato al pin digitale 12
#define LED2 11 // LED collegato al pin digitale 11
#define LED3 10 // LED collegato al pin digitale 10
#define LED4 9 // LED collegato al pin digitale 9
#define LED0 13 // LED collegato al pin digitale 13 

// Variabili

int ContatorePulsantePremuto = 0; // conta il numero di volte che il pulsante è premuto
int StatoPulsante = 0; // stato corrente del pulsante
int StatoPulsantePrecedente = 0; // stato precedente del pulsante
int StatoPulsante_1 = 0; // stato corrente del pulsante_1
int StatoPulsante_1Precedente = 0; // stato precedente del pulsante_1
int state = 0; // valore di stato del pulsante_1

void setup() {
pinMode(BUTTON, INPUT); // imposta il pin digitale come output
pinMode(BUTTON_1, INPUT); // imposta il pin digitale come output
pinMode(LED1, OUTPUT); // imposta il pin digitale come input
pinMode(LED2, OUTPUT); // imposta il pin digitale come input
pinMode(LED3, OUTPUT); // imposta il pin digitale come input
pinMode(LED4, OUTPUT); // imposta il pin digitale come input
pinMode(LED0, OUTPUT); // imposta il pin digitale come input
Serial.begin(9600); // apre la porta seriale e la inizzializza a 9600 bps
} 

void loop() {
StatoPulsante = digitalRead(BUTTON); // legge il valore dell’input e lo conserva 

if (StatoPulsante != StatoPulsantePrecedente) { // compara lo stato del pulsante attuale con il precedente
if (StatoPulsante == HIGH) { // se lo stato è cambiato incrementa il contatore
// se lo stato corrente è alto, il pulsante è passato da off a on
ContatorePulsantePremuto++; 

switch (ContatorePulsantePremuto) {
case 1: // controlla se il pulsante è stato premuto una volta
Serial.println(“on”); // stampa sulla console “on”
Serial.print(“numero di volte tasto premuto: “); // stampa sulla console “numero di volte tasto premuto:”
Serial.println(ContatorePulsantePremuto, DEC); // stampa il numero di volte che il pulsante è stato premuto
digitalWrite(LED1, HIGH); // accende il LED
Serial.println(“off”); // stampa sulla console “off”
break;
case 2: // controlla se il pulsante è stato premuto due volte
Serial.println(“on”); // stampa sulla console “on”
Serial.print(“numero di volte tasto premuto: “); // stampa sulla console “numero di volte tasto premuto:”
Serial.println(ContatorePulsantePremuto, DEC); // stampa il numero di volte che il pulsante è stato premuto
digitalWrite(LED1, HIGH); // accende il LED
digitalWrite(LED2, HIGH); // accende il LED
Serial.println(“off”); // stampa sulla console “off”
break;
case 3: // controlla se il pulsante è stato premuto tre volte
Serial.println(“on”); // stampa sulla console “on”
Serial.print(“numero di volte tasto premuto: “); // stampa sulla console “numero di volte tasto premuto:”
Serial.println(ContatorePulsantePremuto, DEC); // stampa il numero di volte che il pulsante è stato premuto
digitalWrite(LED2, HIGH); // accende il LED
digitalWrite(LED3, HIGH); // accende il LED
Serial.println(“off”); // stampa sulla console “off”
break;
case 4: // controlla se il pulsante è stato premuto quattro volte
Serial.println(“on”); // stampa sulla console “on”
Serial.print(“numero di volte tasto premuto: “); // stampa sulla console “numero di volte tasto premuto:”
Serial.println(ContatorePulsantePremuto, DEC); // stampa il numero di volte che il pulsante è stato premuto
digitalWrite(LED3, HIGH); // accende il LED
digitalWrite(LED4, HIGH); // accende il LED
Serial.println(“off”); // stampa sulla console “off”
break;
}
}
} 

// salva lo stato corrente nella variabile che indica lo stato precedente per il loop successivo
StatoPulsantePrecedente = StatoPulsante; 

// controlla se il pulsante è stato premuto quattro volte se vero indica che è finito il ciclo
// il led lampeggia 2 volte per 50 millisecondi
// vengono inizializzate nuovamente le variabili
// si riavvia il ciclo 

if (ContatorePulsantePremuto > 4) {
Serial.println(“fine ciclo”);
digitalWrite(LED4, LOW); // accende il LED
digitalWrite(LED3, LOW); // accende il LED
digitalWrite(LED2, LOW); // accende il LED
digitalWrite(LED1, LOW); // accende il LED
delay(50);
for (int x=0; x<10; x++) { // lampeggia per 10 volte
digitalWrite(LED1, HIGH); // accende il LED
delay(50); // aspetta 50 millisecondi
digitalWrite(LED1, LOW); // spegne il LED
delay(50); // aspetta 50 millisecondi
}
// inizializzazione delle variabili
ContatorePulsantePremuto = 0;
StatoPulsante = 0;
StatoPulsantePrecedente = 0;
Serial.println("mi riavvio"); // stampa sulla console "mi riavvio" 

}

StatoPulsante_1 = digitalRead(BUTTON_1); // legge il valore dell'input e lo conserva

if ((StatoPulsante_1 == HIGH) && (StatoPulsante_1Precedente == LOW)) {
state = 1 – state;
delay (15);
}
Serial.print("valore di state: "); // stampa sulla console "numero di volte tasto premuto:"
Serial.println(state, DEC); // stampa il numero di volte che il pulsante è stato premuto 

StatoPulsante_1Precedente = StatoPulsante_1; // memorizza il valore precedente 

Serial.print("valore statopulsante1precedente: "); // stampa sulla console "numero di volte tasto premuto:"
Serial.println(StatoPulsante_1Precedente, DEC); // stampa il numero di volte che il pulsante è stato premuto 

if (state == 1) {
digitalWrite(LED0, HIGH); // accendi il led0
delay(300); // attendi 300ms
digitalWrite(LED0, LOW); // spegni il led0 poi aspetta 200ms
delay(200);
} else {
digitalWrite(LED0, LOW);
delay (10);
}

}

Per favore modifica il tuo post ed includi il codice nell'apposito tag CODE che si ottiene premendo l'icona # sopra all'area di inserimento del messaggio altrimenti così è alquanto illeggibile.

Scusatemi,
grazie leo!

n3v3r:
Immagino che questa crei in qualche maniera un ritardo nel ciclo del programma in quanto deve restituire un valore.

Sì. Difatti normalmente con i pulsantini si ha quel problema detto "rimbalzo" ossia letture errate date dal "salto" dei contatti.
Per evitare ciò e non ricorrere ad hw esterno si usa un antirimbalzo software, detto anche anti-debounce. Basta mettere un piccolo delay tra la prima lettura e la seconda lettura di conferma:

if (digitalRead(pin) == HIGH) { //pressione
  delay(50); //piccolo ritardo
  if (digitalRead(pin) == HIGH) { //è ancora premuto, non era una falsa lettura
    ......tuo codice....
  }
}

Nel tuo caso prova così:

StatoPulsante = digitalRead(BUTTON); // legge il valore dell’input e lo conserva 

if (StatoPulsante != StatoPulsantePrecedente) { // compara lo stato del pulsante attuale con il precedente
  delay(50); //ritardo
  if (StatoPulsante == HIGH) { // se lo stato è cambiato incrementa il contatore
    // se lo stato corrente è alto, il pulsante è passato da off a on
    ContatorePulsantePremuto++;

La domanda che volevo porvi era questa:
Si puo’ considerare stabile il mio programma? Perchè l’aggiunta di una “funzione” che risolva il problema non mi dà l’idea di una soluzione.

Un programma non è mai finito. Ti viene sempre voglia di ritoccare qualche piccola cosa.
A parte questo, prova togliendo le scritture seriale e facendo come ti ho detto, per vedere di risolvere il problema.