Realizziamo un temporizzatore per i nostri dispositivi elettrici [fai-da-te]

banner

In questo articolo è possibile seguire tutti i passi necessari per realizzare un dispositivo che permette di automatizzare l’accensione e lo spegnimento dei propri apparecchi elettrici. Ad esempio, nel caso in cui si ha la necessità, o si voglia risparmiare sul costo delle bolletta, tramite questo dispositivo è possibile scegliere se tenere accesi dei dispositivi che normalmente restano accesi anche quando non è necessario. In commercio esistono diverse soluzioni già pronte per questo scopo, delle quali la più diffusa è sicuramente il temporizzatore meccanico (costo circa 10-15 euro, dipende dalla marca e dal negoziante che lo vende) che permette di impostare gli orari in cui la presa presente nella scatoletta stessa debba erogare corrente. La soluzione migliore e più versatile per un MAKER è quella di costruire da sè (DIY) un dispositivo che abbia le seguenti caratteristiche:

  • Sistema basato e gestito da Arduino (microcontrollore Atmel Atmega328)
  • Data e ora gestiti dal RTC DS1307. Così facendo l’ora esatta viene sempre aggiornata anche in mancanza di alimentazione grazie alla batteria tampone di cui è dotata.
  • Possibilità di programmare l’accensione e lo spegnimento di 8 dispositivi tramite l’ausilio di una board con 8 relè.

Ecco un elenco con indicato il necessario per realizzare questo progetto:

  • Arduino (io ho utilizzato la board Arduino UNO, ma può essere utilizzata qualunque versione di Arduino) ;
  • Board 8 relè;
  • RTC – DS1307
  • 2 Resistenze da 1K (pullup)
  • 1 Oscillatore da 32.768Mhz
  • 1 Porta batteria tampone per circuiti stampati
  • 1 Batteria tampone da 3V
  • Cavetteria varia;
  • Breadboard
  • Se si vuole, anche se non è strettamente necessario si può costruire questa shield per Arduino UNO di mia realizzazione tramite la quale è facile interfacciare direttamente tutti i componenti necessari a realizzare questo progetto in maniera semplice e veloce e senza utilizzare fili volanti. Trovate Schema Elettrico, File Fidocad e CS in allegato.

Riguardo la relè board non c’è molto da dire, soltanto che permette di essere collegata direttamente ad Arduino (in questo caso; ovviamente può essere utilizzata con i più svariati microcontrollori e PIC con logica TTL) senza il bisogno di crearsi un circuito che comprende i relè, i foto-accoppiatori, i diodi e le resistenze dato che è tutto incluso sulla board RTC DS1307 Il Real Time Clock (RTC) DS1307 è un orologio/calendario a basso consumo che implementa anche 56 bytes di memoria SRAM non volatile, con batteria di backup. Il circuito fornisce informazioni su secondi, minuti, ore, giorno, mese e anno. La data del fine mese è riconosciuta automaticamente per quei mesi con meno di 31 giorni, inclusi anche gli anni bisestili. L'orologio può operare sia in modalità 24-ore sia in modalità 12-ore con indicazione AM/PM. Il DS1307 possiede internamente un circuito per il riconoscimento automatico dei problemi di alimentazione, nel qual caso devia l'alimentazione sulla batteria di backup continuando a funzionare regolarmente. E' presente anche un clock di uscita con frequenza selezionabile tra i valori 1Hz, 4.096Khz, 8.192Khz e 32.768Khz; tale segnale può risultare utile come riferimento di sincronizzazione. Inoltre, sempre tramite registro interno, è possibile impostare tale uscita al valore logico 1 oppure 0, permettendo così di eseguire funzioni di test. Per collegare il DS1307 bisogna seguire il seguente schema:

Se non si vuole realizzare la shield per Arduino UNO che ho proposto, il circuito può essere realizzato su una breadboard nel seguente modo:

E’ evidente che i componenti necessari allo scopo sono pochi e facilmente collegabili tra di loro. La shield per Arduino UNO che ho proposto è già predisposta per effettuare il collegamento con una board di 8 relè, ma nel caso in cui non si voglia utilizzare la shield, è possibile eseguire direttamente i collegamenti nel seguente modo:

PIN 2 DI ARDUINO - PIN 1 INPUT SCHEDA RELE'
PIN 3 DI ARDUINO - PIN 2 INPUT SCHEDA RELE'
PIN 4 DI ARDUINO - PIN 3 INPUT SCHEDA RELE'
PIN 5 DI ARDUINO - PIN 4 INPUT SCHEDA RELE'
PIN 6 DI ARDUINO - PIN 5 INPUT SCHEDA RELE'
PIN 7 DI ARDUINO - PIN 6 INPUT SCHEDA RELE'
PIN 8 DI ARDUINO - PIN 7 INPUT SCHEDA RELE'
PIN 9 DI ARDUINO - PIN 8 INPUT SCHEDA RELE'
PIN 5V DI ARDUINO - PIN VCC SCHEDA RELE'
PIN GND DI ARDUINO - PIN GND SCHEDA RELE'

Bene, dopo aver parlato della parte Hardware, adesso vi presento la parte Software. Prima di tutto, dato che il circuito con il DS1307 è stato appena assemblato e la batteria tampone è stata appena inserita, bisognerà impostare la data e l’orario caricando su Arduino il seguente sketch:

// di seguito includo la libreria per la comunicazione su bus I2C
#include 
 

void setup()
{
  // inizializzo la libreria
  Wire.begin();
 
  // adesso, inizializzo la comunicazione con il DS1307. 
  // L’indirizzo del DS1307 di default è 0x68
  Wire.beginTransmission(0x68);

  // il primo byte stabilisce il registro
  Wire.write((byte)0x00);
  // imposto il tempo e la data in esadecimale
  Wire.write((byte)0x00); // 1° byte SECONDI impostabili da 0x00 a 0x59
  Wire.write((byte)0x10); // 2° byte MINUTI impostabili da 0x00 a 0x59
  Wire.write((byte)0x80 | 0x10); // 3° byte ORE impostabili da 0x00 a 0x24
  Wire.write((byte)0x01); // 4° byte GIORNO della settimana impostabile da 0x01 a 0x07
  Wire.write((byte)0x21); // 5° byte GIORNO del mese impostabile da 0x00 a 0x31
  Wire.write((byte)0x03); // 6° byte MESE impostabile da 0x00 a 0x12
  Wire.write((byte)0x12); // 7° byte ANNO impostabile da 0x00 a 0x99
  Wire.endTransmission();
}
 
void loop()
{
  delay(100);
}

Perfetto! Adesso che sono state impostate la data e l’ora è possibile controllarli in qualsiasi momento. Infatti, gestire l’orario con un chip esterno permette di concentrare le risorse dell’Arduino su altri processi e allo stesso tempo di impiegare in modo veloce e semplice il bus I2C per recuperare le informazioni di tempo e data con una precisione assicurata. Con il codice di seguito è possibile recuperare queste informazioni:

// di seguito includo la libreria per la comunicazione su bus I2C
#include 
 
void setup()
{
  // inizializzo la comunicazione seriale
  Serial.begin(9600);
 
  //inizializzo la libreria
  Wire.begin();
 
  // adesso, inizializzo la comunicazione con il DS1307. 
  // L’indirizzo del DS1307 di default è 0x68
  Wire.beginTransmission(0x68);
  // il primo byte stabilisce il registro
  Wire.write((byte)0x00);
  // imposto l’orario e la data
  Wire.write((byte)0x00); // 1° byte SECONDI da 0x00 a 0x59
  Wire.write((byte)0x10); // 2° byte MINUTI da 0x00 a 0x59
  Wire.write((byte)0x80 | 0x10); // 3° byte ORE da 0x00 a 0x24
  Wire.write((byte)0x01); // 4° byte GIORNO della settimana da 0x01 a 0x07
  Wire.write((byte)0x21); // 5° byte GIORNO del mese da 0x00 a 0x31
  Wire.write((byte)0x03); // 6° byte MESE da 0x00 a 0x12
  Wire.write((byte)0x12); // 7° byte ANNO 0x00 a 0x99
  Wire.endTransmission();
}
 
void loop()
{
  // inizzializzo la trasmissione partendo dall'indirizzo 0x00
  Wire.beginTransmission(0x68);
  Wire.write((byte)0x00);
  Wire.endTransmission();
 
  // richiedo 7 byte dal dispositivo con indirizzo 0x68
  Wire.requestFrom(0x68, 7);
  // recupero i 7 byte relativi ai corrispondenti registri
  byte secondi = Wire.read();
  byte minuti = Wire.read();
  byte ora = Wire.read();
  byte giorno_sett = Wire.read();
  byte giorno_mese = Wire.read();
  byte mese = Wire.read();
  byte anno = Wire.read();
 
  Serial.print("Ora corrente: ");
  Serial.print(ora, HEX);
  Serial.print(":");
  Serial.print(minuti, HEX);
  Serial.print(":");
  Serial.println(secondi, HEX);
 
  Serial.print("Giorno della settimana: ");
  Serial.println(giorno_sett, HEX);
 
  Serial.print("Data corrente: ");
  Serial.print(giorno_mese, HEX);
  Serial.print("/");
  Serial.print(mese, HEX);
  Serial.print("/");
  Serial.println(anno, HEX);
  Serial.println();
 
  delay(1000);
}

Il codice che stabilisce quando il relè deve essere eccitato, invece, è il seguente:

/*
2013-11-20
Applicazione realizzata da Ivan Scordato, tutto il materiale 
disponibile sul sito EMC ELETTRONICA 

http://it.emcelettronica.com/blog/18420

Contatti: ivanwebmaster@rocketmail.com
*/

// di seguito includo la libreria per la comunicazione su bus I2C
#include 

int start_h=00; // ora in cui si deve attivare il relè
int start_m=00; // minuto in cui si deve attivare il relè
int start_s=00; // secondo in cui si deve attivare il relè
int end_h=00; // ora in cui si deve disattivare il relè
int end_m=00; // minuto in cui si deve disattivare il relè
int end_s=00; // secondo in cui si deve disattivare il relè
  // per comodità eseguo la conversione
 // dell'orario di accensione in secondi
int start_secondi = start_s+ start_m*60 +start_h*60*60;
  // per comodità eseguo la conversione
 // dell'orario di spegnimento in secondi
int end_secondi = end_s+ end_m*60 +end_h*60*60;
int releacceso=0;
 
void setup()
{
    pinMode(2, OUTPUT);    // PIN DOVE E' COLLEGATO IL RELE'
    
  // inizializzo la comunicazione seriale
  Serial.begin(9600);
 
  // inizializzo la libreria
  Wire.begin();
 
  // adesso, inizializzo la comunicazione con il DS1307. 
  // L’indirizzo del DS1307 di default è 0x68
  Wire.beginTransmission(0x68);
  // il primo byte stabilisce il registro
  Wire.write((byte)0x00);
  // imposto l’orario e la data
  Wire.write((byte)0x00); // 1° byte SECONDI da 0x00 a 0x59
  Wire.write((byte)0x10); // 2° byte MINUTI da 0x00 a 0x59
  Wire.write((byte)0x80 | 0x10); // 3° byte ORE da 0x00 a 0x24
  Wire.write((byte)0x01); // 4° byte GIORNO della settimana da 0x01 a 0x07
  Wire.write((byte)0x21); // 5° byte GIORNO del mese da 0x00 a 0x31
  Wire.write((byte)0x03); // 6° byte MESE da 0x00 a 0x12
  Wire.write((byte)0x12); // 7° byte ANNO 0x00 a 0x99
  Wire.endTransmission();
}
 
void loop()
{
  // inizzializzo la trasmissione partendo dall'indirizzo 0x00
  Wire.beginTransmission(0x68);
  Wire.write((byte)0x00);
  Wire.endTransmission();
 
  // richiedo 7 byte dal dispositivo con indirizzo 0x68
  Wire.requestFrom(0x68, 7);
  // recupero i 7 byte relativi ai corrispondenti registri
  byte secondi = Wire.read();
  byte minuti = Wire.read();
  byte ora = Wire.read();
  byte giorno_sett = Wire.read();
  byte giorno_mese = Wire.read();
  byte mese = Wire.read();
  byte anno = Wire.read();
     // di seguito la variabile per convertire l'ora corrente in secondi
  int Secondigiorno = secondi+ minuti*60 +ora*60*60;
     // stampo sul monitor seriale la data corrente
  Serial.print("Ora corrente: ");
  Serial.print(ora, HEX);
  Serial.print(":");
  Serial.print(minuti, HEX);
  Serial.print(":");
  Serial.println(secondi, HEX);
 
  Serial.print("Giorno della settimana: ");
  Serial.println(giorno_sett, HEX);
 
  Serial.print("Data corrente: ");
  Serial.print(giorno_mese, HEX);
  Serial.print("/");
  Serial.print(mese, HEX);
  Serial.print("/");
  Serial.println(anno, HEX);
  Serial.println();
   delay(1000);
   
   // QUI' IMPOSTO I PARAMETRI DI ACCENSIONE DEL RELE' 
   if (Secondigiorno >=start_secondi &&  Secondigiorno < end_secondi){
digitalWrite(2, HIGH); // eccito il relè collegato al pin2
    delay(1000);
releacceso = 1;
}
else 
if (releacceso = 1){
digitalWrite(2, LOW); // stacco il relè collegato al pin2
    delay(1000);
 releacceso = 0;}   
}

Alcuni esempi di applicazione possono essere i seguenti:

  • Automatizzare l'accensione e lo spegnimento di fonti di illuminazione, come ad esempio i lampioni del proprio giardino;
  • Impostare l'accensione della macchinetta del caffè, così da trovarla calda ogni mattina;
  • Risparmiare sul costo della bolletta, programmando quando determinati dispositivi devono restare accesi, come ad esempio un Router;

Spero che questo progetto possa essere utile a qualcuno. Lo scopo di questo articolo è quello di sperimentare con l'RTC, molto utile per mille applicazioni. Dopo aver visto un esempio di applicazione in questo articolo, si è capaci di realizzare qualsiasi dispositivo che necessita di tener traccia del tempo, come ad esempio un timer o una sveglia. In allegato una cartella compressa nella quale è presente tutto il materiale necessario per creare questo dispositivo. Cosa ne pensate? Pensate che questo progetto possa essere migliorato? Se si, Come? Quale potrebbe essere un suo ulteriore utilizzo? Sono a disposizione nei commenti per ogni approfondimento.

5 Comments

  1. Ivan Scordato 28 dicembre 2013
  2. adrirobot 29 dicembre 2013
  3. Ivan Scordato 29 dicembre 2013
  4. adrirobot 29 dicembre 2013
  5. Gianluca Angelone 26 dicembre 2013

Leave a Reply