
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 #includevoid 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 #includevoid 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 #includeint 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

Per quanto riguarda le applicazioni il limite è forse la fantasia, infatti anche quelle citate sono solo ipotesi, mentre il cuore dell’articolo mi sembra più che altro il sistema per comunicare con RTC, per questo mi sento di dire che la differenza fra il sistema proposto e quelli in commercio, citati all’inizio dell’articolo, secondo me sta nell’impostazione della data e dell’ora: un temporizzatore commerciale permette di selezionare l’orario (non è detto anche la data 😉 ) facilmente mentre qui mi sembra che i dati siano impostati da programma. In questo senso è un pò “rigido” perché occorre programmare il micro in funzione dell’applicazione. Un primo upgrade potrebbe essere quello di gestire un display ed una tastiera per inserire manualmente (e leggere) l’orario. Forse è difficile, ma se ci sono 8 relé si può pensare al display con le informazioni relative ad otto “funzionalità” di accensione/spegnimento.
Ciao, la verità è che cerco di essere generico in quanto quello che presento è la base per realizzare il proprio sistema di automatizzazione personalizzato.
Ad esempio, può essere gestito in maniera analoga a questo.
Certo non credo che possa essere utile programmare l’accensione di un dispositivo per il 2020, ma non si sa mai ;D
Ottima l’idea di utilizzare un display ed una tastiera (credo che un tastierino numerico sia ottimo).
Saluti,
Ivan
Ciao Ivan
Ottimi come sempre i tuoi articoli, che trattano di nuove possibilità di automazione.
Un’ottima cosa sono i tuoi esempi di programmi che credo siano di ottimo aiuto a quelli che iniziano ad avvicinarsi al mondo Arduino.
Perché non c’è niente di più frustrante nell’avere un’idea ma non riuscire a scrivere il programma che permetta, di realizzarla.
Personalmente ho imparato molto da esempi di codice trovati in rete, anche se devo dire che a volte, magari per errori dovuti alla codifica della pagina HTML hanno degli errori non facilmente riconoscibili.
Per quanto riguarda il resto dell’articolo forse avrai visto bene un esempio di shield, ma come hai detto giustamente tu di moduli RTC Real Time Clock con DS1307 se ne trovano molti in rete.
Un saluto
Adriano
Grazie Adriano 🙂
Ho realizzato la shield per arduino uno tramite la quale è possibile collegare il DS1307 E la board dei relè ad Arduino.
La trovi in allegato 🙂
Ciao a tutti.
Sono un nuovo appassionato di Arduino alle prime armi.
Ho trovato molto interessante l’articolo. Vorrei sperimentarlo con il relay ma io ho in dotazione un RTC1302. Qualcuno sa indicarmi se esiste un progetto?
Alberto
Opps!
Scusa Ivan, non avevo letto bene!
Hai visto anche il mio commento riguardo il modulo bluetooth tipo HC-05?
http://it.emcelettronica.com/progetto-controllo-remoto-bluetooth-dispositivi-ed-illuminazione-con-arduino#comment-35297
Hai per caso fatto esperienze con il modulo HC-06, specialmente sulla possibilità di impostarli come MASTER?
Ciao Ivan
io sto cercando un circuito del genere che mi permetta di attivare un relè per 1 o 2 sec, questo per far partire la mia lavatrice tramite dei pulsanti per impostare l’ora. Come posso fare? Grazie
Salve,
non ne capisco molto di elettronica, ma mi serve un congegno del genere, che mi alimenta dei carichi a cascata…
fino a quanti Amper si possono gestire con questo sistema…????
Ciao a tutti,scusa se magari chiederó una cosa cretina ,mi faresti un esempio chiaro di cosa e come immettere la data e l’ora in formato exa? per favore ti sarei grato.
Salve, mi potete dire come accedere all’allegato zip?
Grazie
Ciao a tutti
Complimenti per il progetto, ma non riesco a trovare i file fitocad di cui parli. Dove sono?
grazie e a presto
Allegato OK 🙂
Grazie! 🙂
Buongiorno, mi serviva un programma con Arduino che mi piloti un relay che nell’arco di tempo impostato chiuda il contatto NO per alimentare un utilizzatore. Ho trovato il suo programma e sembrava che facesse al caso mio, purtroppo non riesco a farlo funzionare in quanto impostata l’ora di start e di end non restituisce nessun segnale come uscita. Inoltre ho utilizzato tutti i suoi componenti tranne l’RTC DS1307. Quello che ho acquistato io è leggermente diverso ma ha i soliti contatti. Il mio intento era quello di partire dal suo progetto per poi arrivare, tramite alcune modifiche a pilotare due relay in orari separati. Grazie e buona giornata.