gestione luci con relè

Graze Paolo! esperimento riuscito!

Adesso passo al mio vero obiettivo che è quello di fare in modo, utilizzando un PIR, che dopo x secondi di "non movimento nella stanza", spegna la lampadina.

Sto utilizzano questo sensore PIR http://www.robot-italy.com/product_info.php?products_id=1558 L'ho collegato il relè come da istruzioni... funziona ma adesso vorrei che arduino di default accenda la lampadina attraverso il relè e che dopo 60 secondi di inattività la spegna. Ho trovato questo sketch e ho cercato di adattarlo... ma è evidente che non ho fatto un buon lavoro... perché in questo modo fa un controllo ogni 60 secondi... mentre vorrei che facesse controlli ogni secondo e che solo dopo 60 secondi dall'ultimo movimento spegnesse la luce :(

const unsigned int PIR_INPUT_PIN = 4; //pin PIR const unsigned int BAUD_RATE = 9600; int outPin = 7; // pin relè

class PassiveInfraredSensor{ int _input_pin;

public:

PassiveInfraredSensor(const int input_pin){ _input_pin = input_pin; pinMode(_input_pin, INPUT); }

const bool motion_detected() const{ return digitalRead(_input_pin) == HIGH; } };

PassiveInfraredSensor pir(PIR_INPUT_PIN);

void setup(){ Serial.begin(BAUD_RATE); pinMode(outPin, OUTPUT); // out pin relè digitalWrite(outPin,HIGH); //accendo di default la luce }

void loop(){

if (pir.motion_detected()){ digitalWrite(outPin, LOW); //spengo relè Serial.println("No Motion detected");

} else{ Serial.println("MOTION DETECTED"); } delay(60000); }

Mi aiutate?

zuzzurro: perché in questo modo fa un controllo ogni 60 secondi...

  }
 delay(60000);
 }

Questa parte di codice mette un delay di 60 secondi :)

mentre vorrei che facesse controlli ogni secondo e che solo dopo 60 secondi dall'ultimo movimento spegnesse la luce :(

Se non sbaglio, e qui interverranno i saggi, l'esempio Blink without Delay contenuto nell'ide ti metterà sulla buona strada. Devi creare una variabile contatore che conti il tempo da quando il sensore pir non rileva movimento e quando il contatore supera i 60sec fai fare le tue cosine al relè.

Grazie Daniela, ho dato un'occhiata all'esempio che hai citato e mi sono reso conto che effettvamente l'utilizzo del delay non è adatto a mio scopo. D'altra parte però l'esempio usa delle funzioni un po' ostiche per le mie scarsissime conoscenze di programmazione.... HELP!

in effetti il delay ti arresta lo sketch, se hai altre cose da fare nel frattempo, tutto resta bloccato, devi usare un millis()

unsigned long previousMillis = 0; long timer = 60000; //60 sec

loop() unsigned long currentMillis = millis(); if(sensore rileva persona) { //accendi la luce previousMillis = currentMillis; //se nel frattempo passa qualcuno il contatore riparte da 60 sec }

if(currentMillis - previousMillis >= timer) { //spegni la luce

}

ciao

ehhhh… io ho visto l’esempio che ha citato Daniela… ma al momento non sono in grado di utilizzare i mills() per fare quello che vorrei
se qualche buona anima mi potesse aiutare…

mentre scrivevi ho messo 2 righe di esempio al post precedente

non mi funziona, mi da sempre MOTION DECETCION... dove sbaglio???

const unsigned int PIR_INPUT_PIN = 4; //pin PIR const unsigned int BAUD_RATE = 9600; const unsigned int outPin = 7; // pin relè

unsigned long previousMillis = 0; long timer = 60000; //60 sec

class PassiveInfraredSensor{ int _input_pin;

public:

PassiveInfraredSensor(const int input_pin){ _input_pin = input_pin; pinMode(_input_pin, INPUT); }

const bool motion_detected() const{ return digitalRead(_input_pin) == HIGH; } };

PassiveInfraredSensor pir(PIR_INPUT_PIN);

void setup(){ Serial.begin(BAUD_RATE); pinMode(outPin, OUTPUT); // out pin relè digitalWrite(outPin,HIGH); //accendo di default la luce con il relè

}

void loop(){ unsigned long currentMillis = millis();

if (pir.motion_detected()){ previousMillis = currentMillis; //se nel frattempo passa qualcuno il contatore riparte da 60 sec } if(currentMillis - previousMillis >= timer) { digitalWrite(outPin, LOW); //spengo Serial.println("No Motion detected");

} else { Serial.println("MOTION DETECTED"); } delay(200); }

intanto devi togliere l'else e il delay 2000 poi non c'era niente che l'accendeva

const unsigned int PIR_INPUT_PIN = 4; //pin PIR const unsigned int BAUD_RATE = 9600; const unsigned int outPin = 7; // pin relè

unsigned long previousMillis = 0; long timer = 60000; //60 sec

class PassiveInfraredSensor{ int _input_pin;

public:

PassiveInfraredSensor(const int input_pin){ _input_pin = input_pin; pinMode(_input_pin, INPUT); }

const bool motion_detected() const{ return digitalRead(_input_pin) == HIGH; } };

PassiveInfraredSensor pir(PIR_INPUT_PIN);

void setup(){ Serial.begin(BAUD_RATE); pinMode(outPin, OUTPUT); // out pin relè digitalWrite(outPin,HIGH); //accendo di default la luce con il relè

}

void loop(){ unsigned long currentMillis = millis();

if (pir.motion_detected()) { digitalWrite(outPin, HIGH); //accendo previousMillis = currentMillis; //se nel frattempo passa qualcuno il contatore riparte da 60 sec } if(currentMillis - previousMillis >= timer) { digitalWrite(outPin, LOW); //spengo Serial.println("No Motion detected");

}

}

non mi resta facile capire così al volo la classe che hai fatto, ma questo funziona di certo facciamo prima :)

const int led = 7; 
const int in = 4; 

unsigned long previousMillis = 0;
extern unsigned long timer0_millis;
long timer = 60000;

void setup()
{
 pinMode(led, OUTPUT);
 pinMode(in, INPUT);
 Serial.begin(9600); 
}

void loop()
{
 unsigned long currentMillis = millis();

 if (digitalRead(in) == HIGH) 
   {
    digitalWrite(led, 1); 
    previousMillis =  currentMillis; //se nel frattempo passa qualcuno il contatore riparte da 60 sec
   }
  
 if(currentMillis - previousMillis >= timer)
   {
     digitalWrite(led, 0); 
     timer0_millis = 0;     
   }   
 }

mi rimane sempre accesa la lampada... non si spegne mai nemmeno dopo i 60 sec di inattivitià...

OMG, ma quando fai upload dello sketch la lampada si spegne? resta spenta?

funziona se metto if (digitalRead(in) == LOW)… però al mimino movimento il PIR riaccende la lampadina

Io vorrei che funzionasse in modo tale che l’accensione dell lampadina rimanga manuale attraverso il pulsante classico (ecco perché avevo impostato di default digitalWrite(outPin,HIGH):wink:
mentre l’Arduino provveda solo a spegnerla automaticamente dopo 60 sec di inattività nella stanza.

ahhhhhhh .....scusa, avevo capito male, pensavo che il pir dovesse accenderla come servizio di cortesia e spegnerla dopo un po' di inattività capito, mmm ci devo pensare un attimo

ma il pulsante diciamo manuale entra in arduino? perchè se non ci entra la vedo dura la realizzazione pratica

hai un relè sempre chiuso che si apre dopo 60 sec ok e poi chi la riaccende? se il contatto del rele si trova in serie alla lampada una volta aperto ... chi lo richiude che è comandato da arduino? il tuo interruttore manuale non l'accenderà più perchè il relè lo tiene spento

nella pratica io vorrei utilizzare i normali pulsanti Vimar da muro per accendere le luci di una stanza, poi siccome mia moglie non spegne mai una luce in qualsiasi stanza in cui entra... vorrei che Arduino le spegnesse al posto mio dopo x secondi di inattività nella stanza.

è fattibile?

si usando 2 deviatori uno quello a muro e uno il tuo relè nel cassetto a parete devi avere un interruttore a 3 fili (deviatore) se ne hai 2, devi aggiungere 1 filo e cambiare il frutto vimar, ma poi lo schema elettrico lo sai fare?

Al momento no... sto utilizzando Arduino da una settima ed ho poche conoscenze di programmazione e elettronica/impianti elettrici Gli esperimenti che sto facendo, da neofita e con molti aiuti, sarebbero orientati ad acquisire più conoscenze possibili per poter realizzare con l'aiuto di una amico che lavora nel settore un mini impianto di domotica per la nuova casa che devono ancora iniziare a costruire e siamo ancora allo stadio iniziale di progettazione, quindi è il momento giusto. Ovviamente non faccio io gli impianti ma una ditta che si occuperà dell'intero impianto elettrico, io devo capire solo come funziona fare un po' di esperimenti, studiare la fattibilità di alcune soluzioni e far predisporre l'impianto in base al mio progetto di domotica.

Mi piacerebbe fare: - controllo luci - controllo caldaia - allarme fughe gas - allarme acqua - controllo irrigazione - poco altro....

domani compro una scatola con placca a tre frutti della Vimar (serie Idea), uno o due deviatori (a tre fili) e due coperture finte, in una delle quali cercherò fare un buco circolare per fare entrare dentro il PIR SE-10... così faccio qualche esperimento più vicino alla realtà

Intanto ti ringrazio per la pazienza e la disponibilità e ti faccio i miei complimenti perché sei veramente molto bravo!

Grazie di tutto... a domani.

qui nella seconda pagina http://www.bbaba.altervista.org/electronic/schemi.php

trovi punto luce INTERROTTO e punto luce DEVIATO il sistema deviato, è quello che dovresti avere tu: un comando dev1 è il manuale e il dev2 sarebbe il relè

Vantaggio: se arduino si sfascia, l'impianto continuerà a funzionare regolarmente col solo interr manuale Svantaggio: in alcuni casi per tenere la luce spenta il relè sarà perennemente eccitato, in altri sarà diseccitato Svantaggio: come fa arduino a sapere che la luce è accesa e la deve spegnere? ti serve un sensore o un relè a bobina 220 il cui contatto ausiliario inserito in una porta input di arduino

A questo punto secondo me le opzioni sono: - usare il pir come servizio di cortesia, appena entri si accende e si spegnerà dopo un periodo di inattività

  • fare entrare in arduino un pulsante di comando (il tuo comando a muro senza 220 ovviamente), fare entrare il contatto pir e uscita un relè, quando premi il pulsante (a muro) arduino comincerà a contare il pir farà da controllore di presenza, il relè sarà attivo solo quando è necessario.

  • l'altro sistema descritto prima che secondo me è uno spreco di risorse e un po' una porcata :)

ciao

  • fare entrare in arduino un pulsante di comando (il tuo comando a muro senza 220 ovviamente), fare entrare il contatto pir e uscita un relè, quando premi il pulsante (a muro) arduino comincerà a contare il pir farà da controllore di presenza, il relè sarà attivo solo quando è necessario.

  • l'altro sistema descritto prima che secondo me è uno spreco di risorse e un po' una porcata

Hai ragione questo mi sembra il sistema più ragionevole. Ma... è possibile portare il segnale di un pulsante Vimar (tipo questo http://www.elettrico.info/shop/product_info.php?cPath=1_82_75&products_id=VI.16004 ) in ingresso su Arduino per l'accensione luci?

Mi sorge un dubbio... visto che mi sembra piuttosto problematico, quello che chiedo è una cosa normale? a me sembra di si, perché accendere le luci in automatico, il primo giorno è una figata... alla lunga diventa antipatico perché inevitabilmente devi stabilire un ritardo in ingresso, altrimenti si accenderebbe ogni volta che passi vicino anche se non vorresti entrare in quella stanza, e poi non hai più l'indipendenza da Arduino. Se qualcosa va in tilt rimani senza luci finché non scopri e ripari il tutto... non mi semra una grande idea.