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

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 
https://it.emcelettronica.com/blog/18420
Contatti: [email protected]
*/

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

Allegato

Temporizzatore con Arduino e DS1307

Scarica subito una copia gratis
Tags:, , ,

14 Commenti

  1. Avatar photo Gianluca Angelone 26 Dicembre 2013
  2. Avatar photo Ivan Scordato 28 Dicembre 2013
  3. Avatar photo adrirobot 29 Dicembre 2013
  4. Avatar photo Ivan Scordato 29 Dicembre 2013
    • Avatar photo albertoragno 10 Giugno 2019
  5. Avatar photo adrirobot 29 Dicembre 2013
  6. Avatar photo Davide Japan 28 Agosto 2015
  7. Avatar photo Franck.Tabbacchiera 26 Novembre 2015
  8. Avatar photo Bordin Pierluigi 31 Gennaio 2016
  9. Avatar photo francesco.84 23 Febbraio 2016
  10. Avatar photo apatrik 8 Gennaio 2017
  11. Avatar photo Emanuele Bonanni 10 Gennaio 2017
  12. Avatar photo apatrik 10 Gennaio 2017
  13. Avatar photo Andrea Pacciani 7 Agosto 2021

Rispondi a Ivan Scordato Annulla risposta

Seguici anche sul tuo Social Network preferito!

Send this to a friend