Gestione PIR

Buongiorno a tutti,
premetto:
-ho una casa a due piani e una scala interna di collegamento
-ho due luci che illuminano la scala, una al piano 0 (stato2) e una al piano 1 che gestisco tramite chiamata (client.println(“80”))
-ho installato un PIR (passa allo stato alto in caso di presenza per 4 secondi non modificabile) nelle vicinanze della scala al piano 0

la mia soluzione (attualmente installato e “quasi” funzionante) e la seguente:
-mi avvicino alla scala al piano 0, mi accende la luce sia al piano 0 che al piano 1, dopo 20 secondi spenge tutto
-pero se la luce al piano 0 e gia accesa (stato2 = 1) deve solo accendere la luce al piano 1 e dopo 20 secondi spegnere solo quella senza spegnere anche quella al piano 0.
per far ciò ho creato questo codice (ne allego la parte in argomento)

byte ValPinL = 0;
byte checkPin = 0;
byte checkLux = 0;
long start_time;
#define Attesa 20000
#define Attesa2 20300


void PIR()
{
  ValPinL = digitalRead(pirPinL);// pin entrata pir


  if (ValPinL == HIGH)// contatto entrata pir (attivo per 4 secondi al rilevamento del movimento di default non modificabile)
  {
    client.connect(server1, 811);
    client.println("80"); // connessione e accensione luci su node piano 1
    start_time = millis();
    stato2 = 1; // accensione luce piano 0
    checkPin = 1;

  }
  if ((millis() - start_time) >= Attesa && (millis() - start_time) <= Attesa2 && checkPin == 1 && checkLux == 0)
  {
    client.connect(server1, 811);
    client.println("81");// connessione e spengimento luci su node piano 1
    stato2 = 0; //spengimento luce piano 0
    checkPin = 0;
  }
  if ((millis() - start_time) >= Attesa && (millis() - start_time) <= Attesa2 && checkLux == 1)
  {
    client.connect(server1, 811);
    client.println("81");// connessione e spengimento luci su node piano 1

    checkLux = 0;
    checkPin = 0;
  }

}

che non funziona però perfettamente, ho integrato due check
byte checkPin = 0;
byte checkLux = 0;
Pero ad esempio se spengo la luce e poi passo davanti al pir, la luce resta accesa, e altre randomiche anomalie derivanti dal ridicolo codice che ho scritto :slight_smile:
Spero di essere stato chiaro,
Saluti a tutti
Ps. ovviamente chiedo, se possibile, un aiuto a ottimizzare il codice di cui sopra

nessuna reply, quindi o il codice è perfetto e non si può migliorare, o l'opposto, non so quale preferisco :slight_smile:

Ragionare a situazioni semplifica molto le cose. Implicitamente le hai già descritte, una prima situazione è quando si è in attesa che il pir rilevi del movimento. Una seconda sono le due luci che si sono accese assieme e che si devono spegnere assieme, e la terza è il caso di luce0 già accesa per cui deve solo accendersi e poi spegnersi la luce1.

Basta scrivere esattamente così come sono state descritte:

SE situazione 1  E  pir HIGH  E  luce piano 0 spenta:
    accendi luce piano0
    accendi luce piano1
    salva tempo iniziale
    situazione = 2
    
ALTRIMENTI SE situazione 1  E  pir HIGH  E  luce piano 0 accesa:
    accendi luce piano1
    salva tempo iniziale
    situazione = 3

ALTRIMENTI SE situazione 2  E  trascorsi 20s:
    spegni luce piano0
    spegni luce piano1
    situazione = 1

ALTRIMENTI SE situazione 3  E  trascorsi 20s:
    spegni luce piano1
    situazione = 1

Se poi si vuole un sensore retriggerabile che non si spenga sempre dopo 20 secondi, ma dopo 20 secondi dall'ultimo movimento rilevato, basta ricaricare sempre il tempo iniziale se pir == HIGH.

hai perfettamente ragione, ragionando schematicamente in questo modo...c'è plus facile :slight_smile:
Provato e risponde meglio :wink:
Grazie e karma per te