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.
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);
}
}
[/code]






