Natalino: controllare le luci dell’albero di Natale con Arduino

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.

[code lang=”arduino”]

///////////////////////////////////////////////////////////////////////////////
// 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]