Progetto Modulo RTC 2.0

Avevamo già parlato di un progetto con un modulo RTC, l’ articolo che avevo scritto qui mostrava una prima release, forse più semplice per alcuni ma con qualche difetto di gioventù o meglio con un ottimizzazione del HW e del FW non come ora, infatti quello che presentiamo oggi è sempre stato fatto dalla stessa persona, un caro amico, Giacomo Toti che ha però ora reso il codice e i collegamenti più semplici e intuitivi, con tutto il necessario per, non solo replicare questo progetto, ma anche partire da qui per progetti più complessi, senza pensare come una soluzione simile possa essere integrata laddove c’è bisogno di un controllo temporale fattibile con un Real Time Clock.

E’ stato utilizzato un Display LCD (compatibile con Arduino) e un modulo RTC ma, a differenza del precedente, si è usato per entrambi un’interfaccia di comunicazione “I2C” (Per il collegamento dettagliato dei pin vedere il commento nelle prime righe di codice) per poter ridurre notevolmente il numero di cavi e rendere il sistema più compatto.

Inoltre, il protocollo di interfaccia I2C permette anche di gestire in parallelo più di una comunicazione con il microcontrollore. Ecco perchè sono stati saldati i pin SDA e SCL del display e del modulo RTC. L’unica accortezza nel fare questo è di selezionare il giusto indirizzo di comunicazione associato al display e di inserirlo nel codice (nel mio troverete 0x27, un indirizzo abbastanza standard).

Nel pieno stile Maker per dare una forma al tutto è stato assemblato un semplice ma efficace box in legno, che oltre a nascondere l’elettronica utilizzata, rende bene anche in una stanza, il box sarà poi ancora migliorato magari progettandone uno stampato in 3D.

Il codice sorgente del progetto:

/*  Progetto realizzato da Giacomo Toti, con la partecipazione finale di Leonardo Beccarini.
 *  
 *  Nel codice sottostante è possibile cambiare la frequenza di apparizione della slide-show del giorno della settimana,
 *  cambiare la durata della slide-show modificando il delay finale,
 *  Cambiare la luminosità del Display in base all'ora o modificare a piacimento il messaggio da visualizzare giorno per giorno.
 *  
 *  Per i collegamenti: Collegare SDA e SCL del modulo RTC e Display LCD in parallelo fino al pin rispettivamente A4 per l'SDA e A5 per l'SCL. 
 *  (Nota bene: Questi pin corrispondono ai pin SDA e SCL per l'arduino Nano, microcontrollore che ho scelto per questo progetto date le sue
 *  ridotte dimensioni.)
 *  
 *  Informazioni di contatto: giacomo.toti.business@gmail.com, Ingegneria Elettronica, Tor Vergata.
 */

#define D5 5

#include <TimeLib.h>
#include <LiquidCrystal_I2C.h>
#include <DS1307RTC.h>
#include <string.h>
#include "Time.h"
#include <LiquidCrystal.h>

//fare attenzione a scegliere il giusto indirizzo associato al display. Per info: https://youtu.be/aOEzfBnBtBA?t=270
LiquidCrystal_I2C lcd(0x27, 16, 2);

char timebuf[10]; //Orario
char datebuf[12]; //Data
int year4digit; //anno visualizzato in 4 caratteri;

char * dayNames[] = {"Domenica.", "Lunedi.", "Martedi.","Mercoledi.","Giovedi.","Venerdi!!!","Sabato."};  //array di puntatori a carattere

void setup()  {
  lcd.init();
  lcd.clear();
  lcd.backlight();
//luminosità da 0 a 255;
  pinMode (D5, OUTPUT);
  analogWrite(D5, 50);
}


void loop () {
tmElements_t tm;
  
  if (RTC.read(tm)) {
    year4digit = tm.Year + 1970;
    sprintf(timebuf, "%02d:%02d:%02d",tm.Hour, tm.Minute, tm.Second); 
    sprintf(datebuf, "%02d/%02d/%02d",tm.Day, tm.Month, year4digit); 
    
    int dow = tm.Wday;
    
//slide-show del giorno della settimana
    if((tm.Second%15) == 0) {
      delay(100);
      lcd.clear();
      lcd.setCursor(4,0);
      lcd.print("Oggi e':");  
      lcd.setCursor(3,1);
      //conversion of tm.Wday:
      lcd.print(dayNames[dow]);  
      delay(5000);
      lcd.clear();
    }
    
    else {   

//Mostra semplicemente la data e l'ora:     
      lcd.setCursor(0,0);  //prima colonna, prima riga.
      lcd.print("Ora:");
     
      lcd.setCursor(8,0);
      lcd.print(timebuf);
      
      lcd.setCursor(0,1);
      lcd.print("Data:");
  
      lcd.setCursor(6,1);
      lcd.print(datebuf); }
  
  } 

//Messaggio di errore nel caso il modulo RTC non sia reperibile:  
  else {
    lcd.setCursor(5,0);
    lcd.print("Errore");
    lcd.setCursor(3,1);
    lcd.print("Modulo RTC.");  
  }
}

Lascia un commento