Interruttore automatico

Per illuminare un garage in situazione di scarsa luce sta cercando di utilizzare un crepuscolare (questo) ed un radar (questo) per accendere la luce solo se rileva una presenza.
il programma:

/*
   File:    RCWL0516_garage_02
   Date:    24/06/2024  - 19/12/24
   Version: 0.2
   Arduino IDE Version: 1.8.19
   RWCL-0516
   Uso con Attiny 85
   Caricato ed inserito: OK
   Versione 12 V
*/

int rcwlPin = A1;
int luce = A2;
int rele = A3;
int value = 0;
int foto = 0;

void setup() {
  pinMode (rcwlPin, INPUT);  //Define rcwlPin as INPUT
  pinMode (luce, INPUT);  //Define rele as OUTPUT
  pinMode (rele, OUTPUT);
}

void loop() {
  value = digitalRead(rcwlPin); //Read rcwlPin value
  foto = digitalRead(luce); //Read rcwlPin valu

  delay(100);
  if ((value != LOW) && (foto == HIGH)) {
      digitalWrite(rele, HIGH);
      delay(1000);
  } else {
    digitalWrite(rele, LOW);
  }
}

funziona, ...ma come si accende la fonte luminosa il crepuscolare comanda lo spegnimento per troppa luce! .. ed il ciclo ricomincia.

Qualcuno ha idea su come variare il programma (se possibile) per ottenere che la luce rimanga accesa se si rileva una presenza?

Grazie
Enrico

PS: buone feste a tutti.

I nomi delle variabili che hai usato non sono molto chiari sulla funzione delle variabili stesse: ad esempio value cosa significa? Immagino sia il modulo radar, ma qual'è lo stato in cui c'è presenza oppure no?

L'uscita del relé deve essere attiva se non c'è luce e viene rilevata la presenza di una persona, ma poi dovrebbe rimanere attiva per un tempo utile che io ad esempio andrei a resettare ogni volta che viene nuovamente rilevata una persona.

Ovviamente, il rilevamento della quantità di luce presente deve essere effettuato solo prima di accendere la luce! Una volta accesa, deve essere ignorato fino alla scadenza del tempo impostato. Con millis(), poi, viene meglio, perché puoi facilmente reimpostare il tempo di partenza ogni volta che viene rilevato un movimento.

Movimento?
  Sì:
    È buio, oppure millis()-t_acc<=durata?
      Sì: t_acc=millis()

millis()-t_acc<=durata?
  sì: acceso
  no: spento

OK, variato come suggerito, il risultato non è esattamente quanto desiderato (accensione anche in presenza di luce, ma credo dipenda dalla sensibilità del crepuscolare) però accettabile;... ma dopo diversi "cicli" di accensione, questa non avviene più! Tolgo l'alimentazione e la riaccendo .... tutto funziona!
Da cosa può dipendere?
Il programma variato è:

int rcwlPin = A1;
int luce = A2;
int rele = A3;
int value = 0;
int foto = 0;
int att_time = 5000;
int count_time = 0;

void setup() {
  pinMode (rcwlPin, INPUT);  //Define rcwlPin as INPUT
  pinMode (luce, INPUT);     //Define crepuscolare as INPUT
  pinMode (rele, OUTPUT);    //Define rele as OUTPUT
}

void loop() {
  value = digitalRead(rcwlPin); //Read rcwlPin value
  delay(10);
  if (value >= 1 ) { // = accendi movimento   != LOW
    count_time = millis();

    foto = digitalRead(luce); //valuta crepuscolare
    delay(10);

    if (((millis() - count_time) <= att_time) && (foto == HIGH)) {
      digitalWrite(rele, HIGH);
    }
    return;
  } else {
    digitalWrite(rele, LOW);
  }
}

Enrico

Qui perdi informazione. Hai dichiarato count_time di tipo int (16 bit con segno), mentre la funzione millis restituisce un unsigned long (32 bit senza segno) che quindi viene troncato.

Le variabili att_time e count_time devono essere unsigned long (o, uguale, uint32_t).

I nomi delle variabili e delle costanti sono ancora incomprensibili e incongruenti fra loro.

Grazie; fatto.

Spiacente, non capisco l'appunto.

Grazie comunque.
Enrico

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.