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.


///////////////////////////////////////////////////////////////////////////////
// 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);
 }
}