Problema con semplice codice...

Ciao a tutti... qualcuno potrebbe guardare il codice che riporto qui sotto?
Tutto funziona quasi come vorrei.... e' il quasi che non va' bene pero'.

In poche parole il codice dovrebbe usare 4 pulsanti bistabili ( spero che sia corretto definirli così ).
Il pulsante numero 1 dovrebbe fare da consenso.
Il pulsante numero 2 dovrebbe innescare il processo.
Un contatore dovrebbe contarmi i cicli, fino ad un numero stabilito ed interrompere la routine.
Il pulsante numero uno, se disattivato, dovrebbe interrompere la routine ( una sorta di stop di emergenza ).
Il discorso e' che lo sketch mi conta fino a 5 ( secondi ) e poi interrompe la routine ( come previsto ). Il contatore si dovrebbe azzerare... e rischiarando dovrei essere in grado di contare altri 5 secondi... cosa che non succede... non riesco ad azzerare... e quando inserisco il codice per azzerare... la routine non si interrompe dopo i 5 secondi.

Cosa strana che non anche capito... per cercare di fare un po' di debug... ho aggiunto alcune linee di codice per usare il serial monitor... solo che la stessa dichiarazione SERIAL.BEGIN mi manda in malora tutto il funzionamento del programma... che reagisce in modo strano...

Guardate sotto il codice... sicuramente ci deve essere qualche errore grossolano... :slight_smile:

const int RELAY1 = 5;         // Il PIN del RELAY e' il 5
const int RELAY2 = 6;         // Il PIN del RELAY e' il 6
const int RELAY3 = 7;         // Il PIN del RELAY e' il 7
const int RELAY4 = 8;         // Il PIN del RELAY e' il 8

const int BUTTON1 = 1;       //  Il PIN dove ' collegato il pulsante
const int BUTTON2 = 2;       //  Il PIN dove ' collegato il pulsante
const int BUTTON3 = 3;       //  Il PIN dove ' collegato il pulsante
const int BUTTON4 = 4;       //  Il PIN dove ' collegato il pulsante


int val1 = 0;                //  La costante dove si conserva lo stato del pulsante
int val2 = 0;                //  La costante dove si conserva lo stato del pulsante
int val3 = 0;                //  La costante dove si conserva lo stato del pulsante
int val4 = 0;                //  La costante dove si conserva lo stato del pulsante

int contatore = 0;            //  Contatore


void setup()
{
  pinMode (RELAY1, OUTPUT);    // La Variable RELAY1 e' un OUTPUT
  pinMode (RELAY2, OUTPUT);    // La Variable RELAY2 e' un OUTPUT
  pinMode (RELAY3, OUTPUT);    // La Variable RELAY3 e' un OUTPUT
  pinMode (RELAY4, OUTPUT);    // La Variable RELAY4 e' un OUTPUT
  
  pinMode (BUTTON1, INPUT);  // La Variabile BUTTON1 e' un INPUT
  pinMode (BUTTON2, INPUT);  // La Variabile BUTTON2 e' un INPUT
  pinMode (BUTTON3, INPUT);  // La Variabile BUTTON3 e' un INPUT
  pinMode (BUTTON4, INPUT);  // La Variabile BUTTON4 e' un INPUT

  //Serial.begin(9600);
}

void loop ()
{
  val1 = digitalRead ( BUTTON1 ); // Scrivo la stato del pulsante sulla variabile val1
  val2 = digitalRead ( BUTTON2 ); // Scrivo la stato del pulsante sulla variabile val2
  val3 = digitalRead ( BUTTON3 ); // Scrivo la stato del pulsante sulla variabile val3
  val4 = digitalRead ( BUTTON4 ); // Scrivo la stato del pulsante sulla variabile val4
  
  // funzione IF

//Serial.println(contatore);
//delay(500);
  
if ( val1 == HIGH)
  {  
  
        if (( val1 == HIGH) && ( val2 == HIGH ) && ( contatore < 5 ))
        {
        digitalWrite ( RELAY1, HIGH ); // Se il pulsante e' premuto si accende il RELAY1
        //Serial.println(contatore);
        delay ( 1000 );
        contatore++;
            if (val1 == LOW)
            {
              digitalWrite ( RELAY1, LOW ); // Se il pulsante e' premuto si spegne il RELAY1
              contatore == 0;
            }
         }
  
        else
        {
        contatore == 0;
        digitalWrite ( RELAY1, LOW);
        
   
        }
        }
//contatore == 0;
}

Ti mancano i debounce
https://www.arduino.cc/en/Tutorial/Debounce

cosè il debounce

togli quegli int e sostituiscili con byte se la variabile non supera il valore 255 [tutta ram sprecata]

Cosa strana che non anche capito... per cercare di fare un po' di debug... ho aggiunto alcune linee di codice per usare il serial monitor... solo che la stessa dichiarazione SERIAL.BEGIN mi manda in malora tutto il funzionamento del programma... che reagisce in modo strano...

const int BUTTON1 = 1;       //  Il PIN dove ' collegato il pulsante

i pin 0 e 1 sono usati dalla seriale (nel tuo caso serial monitor) è normale se usi uno di quei pin ad avere anomalie sulla stampa monitor seriale e/o esecuzione del programma... anzi se impostato come output dal sistema e tu lo usi con un buttons verso GND/+5v senza R di protezione fai un c.c. con rischio di danneggiare il micro,

Grazie! Allora vedo di integrare questi debounce....
ma ė davvero necessario nel caso io usi dei pulsanti tipo "interuttore"?
Il primo conteggio me lo gg

Se io uso allora come imput i pulsanti 13, 12, 11. 10 dovrei andare meglio? E sopratutto dovrei essere in grado di usare il monitor seriale?

Ciao e grazie

Puoi usare dei debounce "hardware", senza incasinare il software ... se hai 4 ingressi, ti servono 4 condensatori da 100nF (collegati fra i pin di ingresso e la massa) e 4 resistenze da 100 ohm o valori simili (collegate in serie fra il pin ed il pulsante o interruttore)

Ciao ancora...

ho riveduto il circuito e il codice seguendo i vostri consigli.

Pero' ho ancora dei problemi...

Allora... ho dovuto invertire la logica del codice... quando schiaccio il pulsante... il LED verde mi si accende... il segnale e' in LOW, il codice prima funzionava che LED acceso... segnale HIGH... comunque... anche se non ho capito bene perché' ho arginato cambiando il codice.
Non usando il PIN1 ho avuto accesso anche al monitor seriale...
Adesso il mio problema... e' che quando schiaccio il pulsante 1 e il pulsante 2, in teoria, mi si dovrebbe accendere un LED BLU e attivare un conteggio fino a 5 secondi... per poi spegnersi...
Il proble0ma e' che il contatore non conta... e il segnale OUTPUT rimane in LOW ( led spento ).

Vi scrivo sotto il codice... e vi allego il disegno del circuito......

const int RELAY1 = 5;         // Il PIN del RELAY e' il 5
const int RELAY2 = 6;         // Il PIN del RELAY e' il 6
const int RELAY3 = 7;         // Il PIN del RELAY e' il 7
const int RELAY4 = 8;         // Il PIN del RELAY e' il 8

const int BUTTON1 = 10;       //  Il PIN dove ' collegato il pulsante
const int BUTTON2 = 11;       //  Il PIN dove ' collegato il pulsante
const int BUTTON3 = 12;       //  Il PIN dove ' collegato il pulsante
const int BUTTON4 = 13;       //  Il PIN dove ' collegato il pulsante


int val1 = 0;                //  La costante dove si conserva lo stato del pulsante
int val2 = 0;                //  La costante dove si conserva lo stato del pulsante
int val3 = 0;                //  La costante dove si conserva lo stato del pulsante
int val4 = 0;                //  La costante dove si conserva lo stato del pulsante

int StatoOutput1 = 0;         // Stato Output Relay1
int contatore = 0;            //  Contatore
//digitalWrite ( RELAY1, LOW );


void setup()
{
  pinMode (RELAY1, OUTPUT);    // La Variable RELAY1 e' un OUTPUT
  pinMode (RELAY2, OUTPUT);    // La Variable RELAY2 e' un OUTPUT
  pinMode (RELAY3, OUTPUT);    // La Variable RELAY3 e' un OUTPUT
  pinMode (RELAY4, OUTPUT);    // La Variable RELAY4 e' un OUTPUT
  
  pinMode (BUTTON1, INPUT);  // La Variabile BUTTON1 e' un INPUT
  pinMode (BUTTON2, INPUT);  // La Variabile BUTTON2 e' un INPUT
  pinMode (BUTTON3, INPUT);  // La Variabile BUTTON3 e' un INPUT
  pinMode (BUTTON4, INPUT);  // La Variabile BUTTON4 e' un INPUT

  Serial.begin(9600);
}

void loop ()
{
  val1 = digitalRead ( BUTTON1 ); // Scrivo la stato del pulsante sulla variabile val1
  val2 = digitalRead ( BUTTON2 ); // Scrivo la stato del pulsante sulla variabile val2
  val3 = digitalRead ( BUTTON3 ); // Scrivo la stato del pulsante sulla variabile val3
  val4 = digitalRead ( BUTTON4 ); // Scrivo la stato del pulsante sulla variabile val4
  StatoOutput1 = digitalRead ( RELAY1 ) ; // Scrivo lo stato del Output Relay1

  
  // funzione IF

Serial.print ("CONTATORE=");
Serial.println(contatore);
Serial.print ( "VAL1=");
Serial.println(val1);
Serial.print ( "VAL2=");
Serial.println(val2);
Serial.print ( "RELAY1=");
Serial.println(StatoOutput1);
Serial.println(""); 
delay(1500);
//val1==LOW;
//delay(9000);
 
if ( val1 == HIGH)
  {  
  
        if (( val1 == LOW) && ( val2 == LOW ) && ( contatore < 5 ))
        {
        digitalWrite ( RELAY1, HIGH ); // Se il pulsante e' premuto si accende il RELAY1
        //Serial.println(contatore);
        //delay ( 1000 );
        contatore++;
            if (val1 == HIGH)
            {
              digitalWrite ( RELAY1, LOW ); // Se il pulsante e' premuto si spegne il RELAY1
              //contatore == 0;
            }
         }
  
        else
        {
        //contatore == 0;
        //digitalWrite ( RELAY1, LOW);
        
   
        }
        }
//contatore == 0;
}

Ok. Come nella migliore tradizione, 3 secondi dopo aver postato il messaggio ho trovato l'errore....
Adesso il codice conta... pero' ho ancora un problema...
Ho notato che succede quanto segue:
Schiaccio il pulsante1, non conta [ ok ]
Schiaccio il pulsante2, e comincia a contare [ ok ], si accende il LED BLU.
Il contatore arriva a 5 e il LED blu si spegne [ok ].
Nel momento che rilascio il pulsante1, il LED blu si spegne per un secondo, e poi si riaccende, per spegnersi ancora subito dopo.
Nel ELSE ho attivato messo a LOW il segnale di output e azzerato il contatore per poter ricominciare la sequenza.

Perche' mi si riaccende il LED BLU per un secondo?

Ciao

A me sembra che hai totalmente ignorato il fattore debounce! sia da programma che da circuito.jpg, non hai nemmeno letto che cos'è .... perchè se lo avessi almeno letto, avresti capito che il problema nasce durante la pressione e il rilascio

Il debounce non serve quando il programma richiede una pressione punto e basta per eseguire un azione, serve quando lo stesso pulsante deve fare 2 cose differenti a seconda del suo stato