Home
Accesso / Registrazione
 di 

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.

AllegatoDimensione
Temporizzatore con Arduino e DS1307.rar502.9 KB

 

 

Scrivi un commento all'articolo esprimendo la tua opinione sul tema, chiedendo eventuali spiegazioni e/o approfondimenti e contribuendo allo sviluppo dell'argomento proposto. Verranno accettati solo commenti a tema con l'argomento dell'articolo stesso. Commenti NON a tema dovranno essere necessariamente inseriti nel Forum creando un "nuovo argomento di discussione". Per commentare devi accedere al Blog
ritratto di Gianluca Angelone

Per quanto riguarda le

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.

ritratto di Ivan Scordato

Ciao, la verità è che cerco

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

ritratto di adrirobot

Ottimi esempi di programmazione

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

ritratto di Ivan Scordato

Grazie Adriano :) Ho

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 :)

ritratto di adrirobot

Shield di collegamento e modulo bluetooth

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-illuminazi...
Hai per caso fatto esperienze con il modulo HC-06, specialmente sulla possibilità di impostarli come MASTER?

 

 

Login   
 Twitter Facebook LinkedIn Youtube Google RSS

Ultimi Commenti