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?
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.
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);
}
}
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).