Salve, io volevo creare un circuito per poter accendere la luce della cucina tramite un sensore PIR, però, prima di andare a toccare la corrente di casa ho fatto un circuito di prova con un led e un sensore di movimento, ho cercato sia in internet e sia sul forum ma nessun post ha risolto i miei problemi.
Nel mio circuito il led dovrebbe accendersi se rileva un movimento, rimanere acceso per un certo periodo, poi dovrebbe rispegnersi finche non rileva un ulteriore movimento; il problema è che il led si accende anche senza rilevare un movimento.
Vi posto il codice che ho creato:
int StatoSensore = 0;
void setup(){
Serial.begin(9600); //init seriale
pinMode(1, INPUT); //config porta 1 ingresso PIR
pinMode(10, OUTPUT); //config porta 10 uscita LED
}
void loop(){
StatoSensore = digitalRead(1); //leggo i dati del PIR
if (StatoSensore == HIGH){ //sensore attivo
Serial.println("MOTION DETECTED"); //scrivi su seriale
digitalWrite(10, HIGH); //accendi led
delay(1000); //aspetta un secondo
digitalWrite(10, LOW); //spegni led
}
else {
digitalWrite(10, LOW);
}
delay(250); //aspetta 1/4 di secondo
}
Come hai collegato il PIR ? Vedo che leggi quando il pin va HIGH ... lo tieni normalmente LOW con una resistenza di pull-down o ... lo lasci flottante (... da non fare MAI) ?
Certo che puoi farlo e ... lascia stare la funzione delay(), che è una funzione bloccante per il codice e ... impara ad usare opportunamente la millis() ...
Studiati bene QUESTO link e subito dopo QUESTO ... dovrebbero chiarirti come fare ...
Mmm ... ti manca qualche controllo e c'è invece qualche cosa in più ...
Guarda questo :
byte StatoSensore = 0;
unsigned long previousMillis = 0;
unsigned long interval = 10000; //tempo timer
void setup(){
Serial.begin(9600); //init seriale
pinMode(2, INPUT); //config porta 1 ingresso PIR
pinMode(10, OUTPUT); //config porta uscita LED
}
void loop(){
StatoSensore = digitalRead(2); //leggo i dati del PIR
if (StatoSensore == HIGH){ //sensore attivo
Serial.println("MOTION DETECTED"); //scrivi su seriale
digitalWrite(10, HIGH); //accendi led
previousMillis = millis(); //ricorda il momento in cui lo hai acceso
}
else {
if (millis() - previousMillis > interval) {
digitalWrite(10, LOW); //intervallo di tempo passato, spegni il led
}
}
delay(25); //aspetta 1/4 di secondo
}
... per inciso ... StatoSensore te l'ho dichiarato byte ... inutile usare un int (2 bytes) quando ne basta 1 ... ricorda che la SRAM è sempre poca ...
Quale sensore PIR hai usato ? ... perche' la funzione che vorresti tu (tempo resettabile) la maggior parte dei PIR ce l'ha gia a bordo, attivabile tramite un jumper ... ma bisogna sapere quale sensore hai, per vedere se c'e' o no ...
Etemenanki:
Quale sensore PIR hai usato ? ... perche' la funzione che vorresti tu (tempo resettabile) la maggior parte dei PIR ce l'ha gia a bordo, attivabile tramite un jumper ... ma bisogna sapere quale sensore hai, per vedere se c'e' o no ...
E ... secondo te, così che impara (... oltre a comprare i PIR con la temporizzazione incorporata) ??? ] ] ]
gpb01:
E ... secondo te, così che impara (... oltre a comprare i PIR con la temporizzazione incorporata) ??? ] ] ]
A comperare i PIR giusti
Scherzi a parte, la mia domanda era intesa anche in un'altro senso ... se aveva un PIR con il temporizzatore incorporato (esattamente come quello che ha linkato, a proposito :P) allora per fare uno sketch che funzioni (cioe', che possa resettare il tempo su un secondo impulso), bisogna per forza che regoli il tempo di uscita dal PIR il piu corto possibile, e comunque sempre inferiore al tempo che vuole ottenere tramite software, altrimenti il tempo "software" gli scadrebbe prima che il PIR torni a riposo, e non potrebbe usare un secondo impulso per resettare il timer software, perche' in quelle condizioni il secondo impulso avverrebbe comunque dopo il termine del tempo software ...
... ti salvi il momento in cui il PIR scatta e lo metti difatti in previousMillis, poi, nell'IF controlli se la differenza tra i millis() attuali e quelli salvati hanno superato il tempo da te scelto (interval). La cosa, come hai studiato nei link che ti ho dato, funziona sempre ... anche dopo l'overflow di millis()
Etemenanki:
Scherzi a parte, la mia domanda era intesa anche in un'altro senso ... [... omissis ...]
Attento, se guardi bene il codice, il tempo in realtà lo comincia a contare quando il contatto si riapre, perché ... fino a quando è chiuso, continua ed entrare nel "if (StatoSensore == HIGH){" e quindi, ad ogni giro, aggiorna previousMillis.
Solo quando StatoSensore sarà LOW il tempo verrà realmente contato