Gestire 2 led con millis ed interruttore

Magari su Tinkercad funziona, ma nella realtà l'interruttore collegato così può dare problemi:

1 Like
int chiaveBatt; // Variabile dello stato dell'interruttore
int sA=0; //Variabile dello stato del sistema spia attesa
int sB=0; //Variabile dello stato del sistema spia IR
int spiaAtt=9;
int spiaIR=8;
unsigned long t1, t2;

void setup() {
  t1 = millis();
  t2 = millis();
  pinMode(spiaAtt, OUTPUT); //spia attesa
  pinMode(spiaIR, OUTPUT); //spia IR
  pinMode(7, INPUT); //chiave batterie

}

void loop() {
chiaveBatt = digitalRead(7); //Verifica se l'interruttore batterie è stato acceso

switch (sA) {
    case 0:
        if (chiaveBatt) {
            t1 = millis();
            digitalWrite(spiaAtt, HIGH);
            sA = 1;
        }
    break;

    case 1:
       if (chiaveBatt) {
           if (millis()-t1 >= 125000) {
               digitalWrite(spiaAtt, LOW);
               sA = 2;
           }
       } else {
          digitalWrite(spiaAtt, LOW);
          sA = 0;
       }
    break;

    case 2:
        if (!chiaveBatt) sA = 0;
    break;
  }
  
}

Grazie a tutti!! Funziona ed ora posso passare allo step successivo!

Io continuerei con questo sketch non aggiungendo nulla ma migliorando
il codice 360°.

Ad esempio:

// Costanti
const byte PIN_LED_ATT = 9;
const byte PIN_LED_IR = 8;
// Variabili
bool chiaveBatt; // Variabile dello stato dell'interruttore
byte sA=0; // Variabile dello stato del sistema spia attesa
byte sB=0; // Variabile dello stato del sistema spia IR
// Variabili timer
uint32_t t1;  // commento
uint32_t t2;  // commento

Ciao.

Tenendo sempre in sospeso il consiglio di Maurotec ovvero quello di migliorare il codice con le "costanti" (vorrei farlo al completamento del mio primo sketch) chiedo se sono sulla giusta strada con la sequenza di istruzioni che leggete sotto:

  1. chiave batteria ON;
  2. chiave di banco ON (è ON solo se batterie ON);
  3. led collegato alla chiave di banco si accende solo se sono trascorsi 20 sec dall'accensione delle batterie e solo con chiave di banco ON;
  4. led collegato alla chiave di banco si accende contestualmente all'accensione della chiave di banco solo dopo che sono trascorsi 20 secondi dall'accensione delle batterie e si accende/spegne contestualmente all'accensione/spegnimento della cihave di banco.
    Il mio dubbio è che il led in un certo qual modo si accende dopo 20 secondi dall'accensione delle batterie a prescindere dallo stato della chiave di banco.
  5. se ho chiave di banco ON e led ON e metto chiave batterie OFF allora il led si spegnerà.

Ringrazio in anticipo il vostro prezioso aiuto.

Le scritte sugli archi sono gli eventi o le condizioni. L'arco 2→3 dovrebbe chiamarsi timeout20s. L'arco 1→3 è errato perché il LED si accende (stato 3) anche se key banco non è ancora chiusa. Dovrebbe piuttosto esserci un arco 3→1 su condizione !key banco. E poi naturalmente un arco 3→0 su condizione !key batt.


Rimangono sempre possibili altre soluzioni pensando al tutto come un circuito fatto di contatti / porte logiche / temporizzatori:

L'equivalente ladder a contatti:

786543

In riferimento alla risposta di Claudio ho rivisto la sequenza logica e l'ho rimodulata come da foto allegata. Praticamente il led (stato 3) si accende/spegne contestualmente all'accensione/spegnimento della key banco ma solo se sono passati 20 secondi dall'accensione della key batt. In sostanza ho "legato" il tempo all'interruttore e non alla spia.
Interessanti anche le altre soluzioni postate da Claudio per scrivere il codice e realizzare il circuito.
Ancora una volta grazie..