Primi sketch....primi problemi

Ciao ragazzi, con questa quarantena ho ricominciato a studiare programmazione dopo più di 15 anni (da scuola). Ho letto e visto diverse guide e piano piano sto facendo diversi esercizi per cercare di allargare le conoscenze. Ho iniziato con il far lampeggiare con tempistiche diverse due Led, accendendoli con due pulsanti. Tutto funzionava perfettamente, ma essendo compilato con i Delay, mi sono subito reso conto del limite che ha un programma scritto in questo modo (rimane bloccato per i tempi del Delay). Quindi volevo rifare lo stesso esercizio, ma utilizzando il contatore millis. E qui nasce il manicomio.....
Ora ho provato con un solo Led e quindi un solo pulsante. Funziona... ma a "cavoli" suoi, e cioè premo il pulsante parte il lampeggio, premo rimane fisso...premo si spenge...premo rimane fisso... insomma fa come vuole.

Potete farmi capire cosa sto sbagliando??
Grazie infinite

int ledRed = 10;
int pulsante1 = 2;
int ledState = LOW;
int lettura1 = LOW;
int pulState1 = LOW;
long interval = 1000;
unsigned long preMillis = 0;

void setup(){

  pinMode(ledRed, OUTPUT);
  pinMode(pulsante1, INPUT);
  digitalWrite(ledRed, ledState);
  
}

void loop(){
 
  unsigned long curMillis = millis();


  lettura1 = digitalRead(pulsante1); // leggo pulsante
 

if (lettura1 == HIGH){                   // trasformo pulsante1 in interruttore e salvo lo stato in pulState1
      
  if (pulState1 == LOW){
    pulState1 = HIGH; 
   }else{
    pulState1 = LOW;
  }
}

if(pulState1 == HIGH){     //attiva funzione di lampeggio di ledState, in base allo stato di pulState1

   if (curMillis - preMillis > interval) {
      preMillis = curMillis;
    if (ledState == LOW) {
      ledState = HIGH;
      Serial.print("Conteggio: ");
      Serial.println(curMillis);
    } else {
      ledState = LOW;
    }

    digitalWrite(ledRed, ledState);         //comanda la scrittura del led in base allo stato di ledState
    
   }
   
}
delay(50);
}

il tuo programma è inutilmente complesso, con variabili e condizioni non strettamente necessarie

comunque andrebbe bene, anzi: probabilmente funziona benissimo

ti faccio una domanda:
se premi a led acceso, quale parte delprogramma spegnerebbe il led al termine di un lampeggio che non esiste più?

e poi un'altra:
hai messo debounce e pull-down?

continua così, che un incoraggiamento te lo meriti

In aggiunta, per trasformare un ingresso pulsante in un interruttore, occorre testare la variazione rispetto alla lettura precedente, non il livello continuo alto o basso, altrimenti la variabile pulstate1 continua ad invertirsi ad ogni ciclo di loop per tutto il tempo che il pulsante rimane premuto.

if (lettura1Prec==LOW  &&  lettura1==HIGH) {  // se variazione LOW->HIGH
    pulstate1 = !pulstate1;                   // allora inverto
}
lettura1Prec = lettura1;  // aggiorno lettura precedente per prossimo giro

Poi una nota sui commenti, dovrebbero fornire informazioni, non descrivere l'ovvio:

lettura1 = digitalRead(pulsante1); // leggo pulsante <--nessuna info utile

lettura1 = digitalRead(pulsante1); // leggo HIGH se premuto <-- info che aiuta

Metti un condensatore da 100...220nF (100000...220000pF) in parallelo al pulsante.

Salvorhardin:
il tuo programma è inutilmente complesso, con variabili e condizioni non strettamente necessarie

comunque andrebbe bene, anzi: probabilmente funziona benissimo

ti faccio una domanda:
se premi a led acceso, quale parte delprogramma spegnerebbe il led al termine di un lampeggio che non esiste più?

e poi un'altra:
hai messo debounce e pull-down?

continua così, che un incoraggiamento te lo meriti

Come posso farlo meno complesso?
Se ho capito bene la domanda del se premo a Led acceso, effettivamente non ho inserito inserito una condizione qualora "pulState1" è in LOW. Aggiunta ma non è cambiato nulla.
Si ho messo una resistenza 100k i pull-down

Claudio_FF:
In aggiunta, per trasformare un ingresso pulsante in un interruttore, occorre testare la variazione rispetto alla lettura precedente, non il livello continuo alto o basso, altrimenti la variabile pulstate1 continua ad invertirsi ad ogni ciclo di loop per tutto il tempo che il pulsante rimane premuto.

if (lettura1Prec==LOW  &&  lettura1==HIGH) {  // se variazione LOW->HIGH

pulstate1 = !pulstate1;                  // allora inverto
}
lettura1Prec = lettura1;  // aggiorno lettura precedente per prossimo giro



Poi una nota sui commenti, dovrebbero fornire informazioni, non descrivere l'ovvio:


lettura1 = digitalRead(pulsante1); // leggo pulsante <--nessuna info utile

lettura1 = digitalRead(pulsante1); // leggo HIGH se premuto <-- info che aiuta

Per come l'ho scritto, la variabile pulState1 si inverte solo se lettura1 è HIGH, no?
Ho cancellato la parte mia e provato quanto mi hai consigliato, ma continua sempre a fare lo stesso difetto.
Chiaro il concetto dei commenti :wink:

Datman:
Metti un condensatore da 100...220nF (100000...220000pF) in parallelo al pulsante.

Ora non ho condensatori per provare, ma lo scopo sarebbe evitare il rimbalzo?

Grazie a tutti per le risposte.

Sì.

RISOLTO!!
Prendendo spunto da quanto mi avete consigliato, ho aggiunto un "else" alla if dello stato del pulsante.
Ora funziona correttamente.