Spegnere led o relè con ritardo

Salve a tutti. Sono alle prime armi e mi scuso in anticipo se scrivo delle inesattezze. Sto usando due pulsanti con la libreria oneButton. Entrambi servono per comandare due relè (al momento sostituiti con due led). Sono utilizzati all'interno di due funzione static void click1() e static void click2(). Nella click2(), sono presenti due if che verificano se il rele è acceso o spento. Ora avrei la necessità d'inserire un ritardo allo spegnimento del relè di 10 secondi.
Ho provato ad implementare una funzione millis() ma non ci sono riuscito. Potete aiutarmi? Grazie in anticipo.

static void click1() {
  int ledMute = digitalRead(8);
  digitalWrite(8, LOW);
 
  u8x8.display();
  u8x8.clearDisplay();

  int ledOff = 0;
  digitalWrite(4, !digitalRead(4));
  
  ledOff = digitalRead(4);

  if (ledOff == LOW) {

    EEPROM.update(0, ledIngressi);
    EEPROM.update(1, ore);
    EEPROM.update(2, minuti);
    delay(200);

    //Funzione spegnimento

    int valPot = analogRead(A0);

    int percVolume = map(valPot, 0, 1023, 0, 99);

    valoreVolume();

    u8x8.setFont(u8x8_font_8x13_1x2_r);
   
    u8x8.setCursor(2, 5);
    
    u8x8.print("ATTENDERE...");
   

    while (percVolume >= 10) {
     
      digitalWrite(led_down, HIGH);
      valPot = analogRead(A0);
      percVolume = map(valPot, 0, 1023, 0, 100);

      valoreVolume();
    }

    u8x8.display();
    u8x8.clearDisplay();
    u8x8.setFont(u8x8_font_8x13_1x2_r);
   
    u8x8.setCursor(0, 4);
    u8x8.print("  <<<  OFF  >>> ");
    
    delay(5000);
    u8x8.clearDisplay();
    
  }

  //Fine funzione spegnimento

  if (ledOff == HIGH) {
    
    switch (ledIngressi) {
      
      u8x8.setFont(u8x8_font_8x13_1x2_r);
      case 1:
        
        u8x8.setFont(u8x8_font_8x13_1x2_r);
        u8x8.draw2x2String(3, 4, "PHONO");
        break;
      case 2:
        
        u8x8.setFont(u8x8_font_8x13_1x2_r);
        u8x8.draw2x2String(2, 4, "  CD  ");
        break;
      case 3:
        u8x8.setFont(u8x8_font_8x13_1x2_r);
        u8x8.draw2x2String(2, 4, " AUX1 ");
        
        break;
      case 4:

        
        u8x8.setFont(u8x8_font_8x13_1x2_r);
        u8x8.draw2x2String(2, 4, " AUX2 ");
        break;
      default:
        break;
    }
  }
}

Purtroppo non è così semplice

Per scrivere programmi con ritardi non bloccanti serve di ripensare l'intero programma, non la sola funzione interessata

Devi fare un po' di ricerche
Casomai se non trovi nulla di interessante stasera ti indico io qualcosa

Ciao, secondo me serve vedere tutto il codice. Tra l'altro parli di click2 e posti solo click1.
Quale rele e quale clickX deve avere il ritardo ? Non si capisce molto dalla tua spiegazione (almeno per me).

Consiglio di togliere tutte quelle righe vuote (esempio sopra), che sono inutili, allungano solo il programma e non fanno vedere subito tutte le righe.

1 Like

Inoltre:
int ledMute = digitalRead(8);
ledOff = digitalRead(4);

ledMute e ledOff sono bool.

Grazie per la risposta. Prima di chiedere aiuto sul forum avevo fatto diverse ricerche ma tutte che riguardano la pressione più o meno lunga del pulsante. Inoltre mi sono sbagliato sul pulsante che utilizzo. Infatti è click1(). Comunque è una funziona che il programma chiama quando si preme il pulsante di spegnimento oppure il telecomando associato

?? DigitalRead() ritorna un int non un bool.

Ciao, ale.

Si
Ma i valori possibili sono o 0 o 1
Quindi il casting a bool non cambia nulla

Questa è la mia prima applicazione. Sono andato un po' per tentativi e sicuramente il codice non è dei migliori. :blush: Per 40 anni ho venduto componenti elettronici ma di programmazione conosco pochissimo. Poiché è lo stesso pulsante che accende e spegne, non sapendo come fare, ho messo una if che verifica lo stato del PIN che comanda il relè. Se il PIN è basso, fa qualcosa e entra in un ciclo while che aziona un motore a cui è collegato un potenziometro, finché il valore letto non rientra nel range, il motore gira. Io volevo mettere un ritardo sullo spegnimento, prima del ciclo while.