Progettino natalizio ideato da me e realizzato da mio fratello Giulio: controllo dell’accensione luci dell’albero di Natale con Arduino, in due modalità:
- Giorno: l’albero si accende solo se rileva il passaggio di una persona (con un PIR infrarossi)
- Notte: l’albero si accende in modo fisso e si spegne ad un orario predefinito (con un timer che bypassa il PIR
Il tutto è abbastanza semplice e permette anche di risparmiare sull’elettricità, visto che di giorno le luci rimangono spente quando non c’è nessuno a guardarle !
Ecco i componenti utilizzati:
- Arduino UNO
- Board relé 4 vie (per accendere e spegnere gli attacchi luci)
- Sensore PIR infrarossi hc-sr501 (per rilevare il movimento)
- RTC (real time clock) basato su ds1307 (per tenere il tempo e azionare il timer)
Schema di collegamento:
Alle uscite di ogni relé va attaccata la fase di ciascun attacco luci che vogliamo controllare, mentre il neutro sarà comune.
Attenzione: sulla scheda relé scorrono 220V, quindi collegate le prese solo DOPO che tutto sarà pronto e magari isolato in una scatola!
Una volta collegato, passiamo alla programmazione. Qui di seguito il semplice sketch che abbiamo utilizzato, sicuramente migliorabile.
- Requisiti: libreria RTClib
/////////////////////////////////////////////////////////////////////////////// // Natalino: Christmas tree lights control with PIR sensor and RTC clock // Credits: Alessandro and Giulio Grechi // Contacts: http://grechi.it alessandro@grechi.it // Version: 0.1.1 /////////////////////////////////////////////////////////////////////////////// #include <Wire.h> #include "RTClib.h" RTC_DS1307 rtc; unsigned long time=0, tt=0; int Hmin; int Hon; int Hoff; DateTime now; void setup () { Serial.begin(57600); Wire.begin(); rtc.begin(); pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(7, INPUT); digitalWrite(2, HIGH); digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); Hon=18; //Switch On hour Hoff=01; //Switch off hour } void loop () { if(millis()-tt > 3000){ now = rtc.now(); Hmin = now.hour(); tt = millis(); } int pir = digitalRead(7); if (pir || Hmin >= Hon || Hmin <= Hoff ) { digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, LOW); time = millis(); } else if (!pir && (millis()-time > 25000)){ digitalWrite(2, HIGH); digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); } }