Buzzer e led problemi di programmazione

Ciao a tutti!
Sto cercando di programmare un buzzer con 4 led ed un pulsante, il risultato finale del progetto sarebbe che una volta schiacciato il pulsante per la quarta volta, acceso l'ultimo led a sinistra il buzzer si attivi ma tramite la programmazione ciò non accade e non capisco dove sia l'errore.. spero qualcuno possa darmi una mano.
Vi ringrazio.

Gio.


int stato = 1;
int button = 2;
int buzzer = 7;
int led = 6;
void setup() {
  pinMode(button, INPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(led, OUTPUT);
  pinMode(buzzer, OUTPUT);
}

void loop() {
  {
    if (digitalRead(button) == HIGH) {
      stato++;
      if (led == HIGH) {
        digitalWrite(buzzer, HIGH);
        delay(200);
      }
      if (stato > 6) stato = 1;
      delay(200);
    }
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(led, LOW);
    digitalWrite(buzzer, LOW);
    digitalWrite(stato, HIGH);
  }
}


Forse non hai copiato tutto il programma

@Salvorhardin ho controllato e c'è tutto quello che ho scritto..

Quel programma, così come è, è illeggibile, non te ne rendi conto?

Prima di inserirlo, assicurati di averlo correttamente indentato nell'IDE (questo lo si fa premendo ctrlT su un PC o cmd T su un Mac, sempre all'interno del IDE) ... vedrai, dopo averlo correttamente indentato, che ci sono graffe inutili e lo potrai seguire meglio ... :roll_eyes:

Guglielmo

1 Like

@gpb01 Guglielmo perdonami sto imparando e sono agli inizi, non sapevo nemmeno l'esistenza del termine indentato😂

Concordo in pieno

Forse sì, c'è tutto
Ma non si capisce

... nessun problema, ma ... riprendi il tuo codice nel IDE, fai come ti ho scritto (così te lo indenta correttamente) e poi correggi il tuo post iniziale (utilizzando il bottone a forma di piccola matita :pencil2: che si trova in basso del tuo post) mettendo il codice ben indentato :wink:

Grazie,

Guglielmo

Senza offesa, ma... perché ad ogni riga di codice segue una riga vuota? Sembra quando scrivevo a scuola i temini e per farli sembrare più lunghi mettevo righe vuote :grin:
Per favore togli anche quelle inutili righe vuote

int stato = 1;
const byte button = 2;
const byte buzzer = 7;

void setup() {

@nid69ita mi spiace ma sono agli inizi

@gpb01 fatto.. spero così vada bene

Si va bene ... e ... non ti accorgi che hai delle graffe inutili ?

void loop() {
  {
   ...
   ...
  }
}

... perché? basta quella dopo il loop() e la sua corrispondente alla fine, non serve creare un inutile ulteriore blocco :roll_eyes:

In ogni caso così com'è, quel programma non funziona ... NON è così che si verifica la pressione (e il rilascio ... che tu non verifichi) di un pulsante ed occorre anche tenere conto dei rimbalzi dei contatti ... :roll_eyes:

Guglielmo

@gpb01 cercherò di stare più attento riguardo alle graffe... Ma di solito le graffe non vanno messe dopo un "if" per dargli il comando? Come posso ovviare al problema riguardo al buzzer?

digitalWrite(stato, HIGH);

Queste due righe sono sintatticamente corrette, ma errate dal punto di vista logico.
La prima condizione è sempre falsa, perché confronti led (cioè 6) con HIGH (cioè 1). Con la seconda cerchi di scrivere su un pin identificato dalla variabile stato.

O ti studi come si usa un pulsante, ovvero come si rileva il fatto che tu hai premuto e lasciato il pulsante, oppure usi una delle tante librerie già fatte ... es. la button2.

Considera che, non sapendo fare le cose, spesso si trovano già fatte tra le centinaia di LIBRERIE Arduino che esistono ... basta cercare ...

Guglielmo

Stato lo fai andare da 1 a 6
I tuoi led sono dal pin 3 al pin 6
Ovviamente qualche conto non torna.
Stato deve andare da 3 a 6 e quindi accendi il led indicato da stato oppure da 1 a 4 ma in questo caso devi accendere il led stato+2

Per i buzzer fai tutto al fondo. Al posto di digitalWrite(buzzer, LOW);
fai if stato vale 6 accendi buzzer altrimenti lo spegni

if(6==stato)
{ digitalWrite(buzzer, HIGH);
} 
else
{ digitalWrite(buzzer, LOW) ;
} 

@nid69ita grazie tante per la pazienza e la comprensione proverò al più presto ad applicare il codice in questo modo!

Alcuni consigli, a parte l'indentazione che hai corretto (ma la graffa "anomala" no).

Primo, i numeri dei pin che usi sono valori costanti quindi meglio indicarli con "const" (in questo modo non potrai modificarli inavvertitamente). Inoltre hanno valori bassi, per ottimizzare il codice meglio usare "byte" e non "int".

Secondo, per convenzione tutti gli identificativi di costanti o simboli si mettono in maiuscolo, per consentire di distinguere ad occhio cosa è modificabile e cosa no. Quindi non "buzzer" ma "BUZZER". Per dire, "HIGH" che usi, è appunto una costante e come tale infatti è in maiuscolo.

Terzo, quando hai a che fare con elementi identici come appunto i 4 LED, meglio usare un array ("const byte" quindi) per definirli, è molto più compatto e soprattutto gestibile con indici ed anche dei "for()".

Riassumo quindi il tutto in questo codice, ho preso il tuo e "adattato" anche nel funzionamento, ovviamente vedi cosa ho cambiato, come potrebbe funzionare (non l'ho provato, devi farlo tu!), e se hai domande o dubbi, scrivi.

const byte BUTTON = 2;
const byte BUZZER = 7;
const byte LED[] = {3, 4, 5, 6};
int led = -1; // -1 significa "nessun led acceso"

void setup() {
  Serial.begin(9600);
  pinMode(BUTTON, INPUT);
  pinMode(LED[0], OUTPUT);
  pinMode(LED[1], OUTPUT);
  pinMode(LED[2], OUTPUT);
  pinMode(LED[3], OUTPUT);
  pinMode(BUZZER, OUTPUT);
  digitalWrite(BUZZER, LOW);
}

void loop() {
  if (digitalRead(BUTTON) == HIGH) {
    if (led < 3) {
      led++;
      Serial.println(led);
      for (int i=0; i<4; ++i) digitalWrite(LED[i], i == led);
      if (led == 3) {
        Serial.println("BUZZER ON");
        digitalWrite(BUZZER, HIGH);
        // Cosa deve fare poi??? Per ora ricomincia...
        led = -1;
      } else
        digitalWrite(BUZZER, LOW);
    }
    // Debounce, poi attendi il rilascio del tasto
    delay(100);
    while (digitalRead(BUTTON) == HIGH)
      delay(50);
  }
}

PS: tra l'altro una volta arrivato al quarto LED ed attivato il buzzer, cosa deve fare?

1 Like

@docdoc grazie grazie mille!! Mi hai dato una risposta più che esaustiva!! Numero 1! Ho riletto più volte il codice come lo hai scritto tu ed effettivamente è più logico.. proverò al più presto! Il mio intento era proprio quello di riuscire ad attivare l'ultimo led assieme al buzzer per vedere se ero abbastanza pratico ma mi sbagliavo.. grazie ancora!!

Bene, sono contento di averti aiutato. Ma mi raccomando, cerca di capire bene le modifiche che ho fatto, e chiedi se qualcosa non la capisci o se hai bisogno di fare qualche modifica e non risci.

Ad esempio, se volessi non far accendere solo un LED per volta ma lasciare accesi tutti i precedenti (quindi invece di vedere acceso solo il secondo lasciare acceso anche il primo, e così via), cosa dovresti modificare nel codice secondo te?

1 Like

@docdoc
for (int i=0; i<4; ++i) digitalWrite(LED[i] = HIGH);
sicuro starai ridendo perché non c'ho preso per niente :joy::joy:
Comunque si mi hai aiutato molto e ho analizzato ciò che mi hai scritto!!