Clock with date Arduino + LCD I2C + RTC - mcworkshop

MC   WORKSHOP
Vai ai contenuti

Menu principale:

Clock with date Arduino + LCD I2C + RTC

Time and date on the LCD display using the Tiny RTC module in a serial line based on the DS1307 chip.
Ora e la data sul display LCD utilizzando il modulo Tiny RTC in linea seriale basato sul chip DS1307.

In prova. Tende ad avanzare velocemente.
La precisione che viene spesso citata in numerosi tutorial non è vera.
Settato: 8/12/2018 alle 13:09:00
Controllo al: 24/08/2019 alle 15:10:00
Tiny RTC restituisce: 14:56
Differenza: 14'




The connections are very simple. The SCL together and the SDA together, then, the power supply of the +5 and GND modules. In Arduino compatible CH340, where in figure 1 you see the blue rectangle, there are the connectors called SCL and SDA. In Arduino Uno, as in figure 1, you find 3 jumper with a single writing: ICSP2.
The part of our interest, figure 2, is this. Above AREF you find SDA and SCL.





The addresses
The next step is to find the addresses of the modules; the address of the LCD module and that of the RTC. I previously found 0x3F regarding the LCD display. I repeat the operation to find the address of the RTC. Line 7 of the Sketch reads the address of the RTC (0x68). There is a Sketch able to find all the modules connected in series. Download it here: https://pastebin.com/6Cd8zwGm
Il prossimo passo è trovare gli indirizzi dei moduli; l'indirizzo del modulo LCD e quello del RTC. Ho precedentemente trovato 0x3F riguardo al display LCD. Ripeto l'operazione per trovare l'indirizzo dell'RTC. Alla riga 7 dello Sketch si legge l'indirizzo dell'RTC (0x68). C'è uno Sketch in grado di trovare tutti i moduli collegati in serie. Scaricalo qui: https://pastebin.com/6Cd8zwGm

Sketch
Scketch is not easy ... You can find it here: https://pastebin.com/rdfqPa8X
There is a version implemented and with comments here: https://pastebin.com/Ssa5eSsU

This version differs from the previous one because it is possible to set alarms that will only be read on a serial monitor; no pins are activated. The used libraries are in the lines: 3, 4, 6. Remember to use IDE 1.6.
Questa versione differisce da quella precedente perché è possibile impostare allarmi che si leggeranno solo su un monitor seriale; nessun pin è attivato. Le librerie utilizzate si trovano nelle righe: 3, 4, 6. Ricordati di utilizzare l'IDE 1.6.

Connect only LCD
Test Sketch LCD

//LCD 16x2 PCF8574AT Versione IDE 1.6.0
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,16,2);
void setup()
{
 lcd.init();
 lcd.backlight();
}
void loop()
{
 lcd.setCursor(0, 0);
 lcd.print("1234567xx1234567");
 delay (1000);
 lcd.setCursor(0, 1);
 lcd.print("1234567xx1234567");
 delay (1000);
}

Connect LCD + RTC
Sketch

//LCD 16x2 PCF8574AT + RTC Tiny I2C V 1.3 set 2018 / Versione IDE 1.6.0
//Cerani Marco
#include <Wire.h>
#include <RTClib.h>
RTC_DS1307 RTC;
#include <LiquidCrystal_I2C.h>
#define DS1307_I2C_ADDRESS 0x68
LiquidCrystal_I2C lcd(0x3F,16,2);
char daysOfTheWeek[7][10] = {"Do", "Lu", "Ma", "Me", "Gio", "Ve", "Sa"};
char bufferRX[50];
void setup()
{
 Serial.begin(9600);
 Serial.println("Per aggiornare data e ora inviare il seguente comando: ");
 Serial.println("\"setDateTime anno, mese, giorno, ora, minuti, secondi\"");
 Serial.println("17:30 del 8 sett 2018");
 Serial.println("Esempio: setDateTime, 2018, 9, 8, 17, 30, 00");
 lcd.init();
 lcd.backlight();
}
void loop()
{
 static unsigned long updateTime;
 if(millis() - updateTime > 1000){
   updateTime = millis();
   DateTime now = RTC.now();
   lcd.clear();
   lcd.setCursor(0, 0);
   LCDPrintNum(now.hour());
   lcd.print(":");
   LCDPrintNum(now.minute());
   lcd.print(":");
   LCDPrintNum(now.second());
   lcd.print(" ");
   lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
   lcd.setCursor(0, 1);
   LCDPrintNum(now.day());
   lcd.print("/");
   LCDPrintNum(now.month());
   lcd.print("/");
   lcd.print(now.year(), DEC);
 }
 readSerial();
}
void LCDPrintNum(int num){
 if(num <10)
   lcd.print("0");
 lcd.print(num);
}
void readSerial(){
 while (Serial.available() > 0) {
   Serial.readBytesUntil('\n', bufferRX, sizeof(bufferRX) - 1);
   if(strstr(bufferRX, "setDateTime,")){
     int tdArray[6];
     char * pch = strtok (bufferRX, " ,");
     unsigned int i = 0;
     while (pch != NULL){
       if(i > 0)
         tdArray[i-1] = atoi(pch);
       pch = strtok (NULL, " ,");
       i++;
     }
     DateTime newTime = DateTime(tdArray[0], tdArray[1], tdArray[2], tdArray[3], tdArray[4], tdArray[5]);
     RTC.adjust(newTime);
     Serial.println("Impostato nuovo orario.");
   }
 }
}

Sketch with alarm function. Only on serial monitor

//LCD 16x2 PCF8574AT + RTC Tiny I2C V 1.3 set 2018 / Versione IDE 1.6.0 + set allarme su seriale
//Cerani Marco
#include <Wire.h>
#include <RTClib.h>
RTC_DS1307 RTC;
#include <LiquidCrystal_I2C.h>
#define DS1307_I2C_ADDRESS 0x68
LiquidCrystal_I2C lcd(0x3F, 16, 2);
char daysOfTheWeek[7][10] = {"Do", "Lu", "Ma", "Me", "Gio", "Ve", "Sa"};
char bufferRX[50];
DateTime now, Alarm1Time;
void setup()
{
 Serial.begin(9600);
 Serial.println("Per aggiornare data e ora inviare il seguente comando: ");
 Serial.println("\"setDateTime anno, mese, giorno, ora, minuti, secondi\"");
 Serial.println("Esempio: setDateTime, 2018, 9, 8, 17, 30, 00");
 lcd.init();
 lcd.backlight();
 now = RTC.now();
}
void loop()
{
 //Aggiorniamo una volta al secondo
 static unsigned long updateTime;
 if (millis() - updateTime > 1000) {
   updateTime = millis();
   now = RTC.now();
   lcd.clear();
   lcd.setCursor(0, 0);
   LCDPrintNum(now.hour());
   lcd.print(":");
   LCDPrintNum(now.minute());
   lcd.print(":");
   LCDPrintNum(now.second());
   lcd.print(" ");
   lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
   lcd.setCursor(0, 1);
   LCDPrintNum(now.day());
   lcd.print("/");
   LCDPrintNum(now.month());
   lcd.print("/");
   lcd.print(now.year(), DEC);
 }
 // Vediamo se arriva qualcosa dalla seriale
 readSerial();
 // Controlliamo se è tempo di attivare l'allarme 1
 if (now.unixtime() == Alarm1Time.unixtime()) {
   Serial.println("Allarme 1 attivo!");
   delay(500);
 }
}
// Funzione per stampare ad esempio 02 al posto di 2
void LCDPrintNum(int num) {
 if (num < 10)
   lcd.print("0");
 lcd.print(num);
}
void readSerial() {
 while (Serial.available() > 0) {
   // Leggiamo tutto quello che arriva dalla seriale e salviamolo nell'array di char bufferRX[]
   Serial.readBytesUntil('\n', bufferRX, sizeof(bufferRX) - 1);
   /*
    *  Se c'è il comando giusto eseguiamo l'aggiornamento dell'orario dell'RTC
    *  Verrà usata la funzione C++ strtok che consente di splittare una stringa con uno specifico delimitatore,
    *  nel nostro caso la virgola ','. I valori verranno quindi salvati nell'array di int tdArray[] per usarli
    *  facilmente dove necessario per impostare il nuovo orario.
   */
   if (strstr(bufferRX, "setDateTime,")) {
     int tdArray[6];
     char * pch = strtok (bufferRX, " ,");   // Split string into tokens
     unsigned int i = 0;
     while (pch != NULL) {
       if (i > 0)                            // Il primo valore trovato "setDateTime" non lo salvo nell'array
         tdArray[i - 1] = atoi(pch);         // Converto la stringa in un intero con l'istruzione atoi()
       pch = strtok (NULL, " ,");            // troviamo la substring successiva
       i++;
     }
     // Per creare una variabile DateTime è necessario questo formato: (anno, mese, giorno, ora, minuti, secondi)
     DateTime newTime = DateTime(tdArray[0], tdArray[1], tdArray[2], tdArray[3], tdArray[4], tdArray[5]);
     RTC.adjust(newTime);
     Serial.println("Impostato nuovo orario.");
   }
   if (strstr(bufferRX, "setAlarm1Time,")) {
     int tdArray[6];
     char * pch = strtok (bufferRX, " ,");   // Split string into tokens
     unsigned int i = 0;
     while (pch != NULL) {
       if (i > 0)                            // Il primo valore trovato "setDateTime" non lo salvo nell'array
         tdArray[i - 1] = atoi(pch);         // Converto la stringa in un intero con l'istruzione atoi()
       pch = strtok (NULL, " ,");            // troviamo la substring successiva
       i++;
     }
     Alarm1Time = DateTime(tdArray[0], tdArray[1], tdArray[2], tdArray[3], tdArray[4], tdArray[5]);
     Serial.println("Impostato Allarme 1");
   }
 }
}

Comments

Serial.println ("To update date and time send the following command:");
Serial.println ("\" setDateTime year, month, day, hour, minute, seconds \ "");
Serial.println ("Example: setDateTime, 2018, 9, 8, 17, 30, 00");
// We update once a second
  static unsigned long updateTime;
// Let's see if anything comes from the serial
readSerial ();
// check if it is time to activate alarm 1
if (now.unixtime () == Alarm1Time.unixtime ()) {
// Function for printing, for example, 02 instead of 2
void LCDPrintNum (int num) {
if (num <10)
lcd.print ( "0");
lcd.print (num);
// Read everything that comes from the serial and save it in the array of char bufferRX []
Serial.readBytesUntil ('\ n', bufferRX, sizeof (bufferRX) - 1);
/ *
* If there is the right command, we will update the RTC time
* C ++ strtok function will be used to split a string with a specific delimiter
* in our case the comma ','. The values will then be saved in the int tdArray [] array to use them
* easily where necessary to set the new time.
* /
if (strstr (bufferRX, "setDateTime,")) {
if (strstr (bufferRX, "setDateTime,")) {
int tdArray [6];
char * pch = strtok (bufferRX, ","); // Split string into tokens
unsigned int i = 0;
while (pch! = NULL) {
if (i> 0) // The first value found "setDateTime" does not save it in the array
tdArray [i - 1] = atoi (pch); // Convert the string to an integer with the atoi () statement
pch = strtok (NULL, ","); // we find the next substring
i ++;
}
// To create a DateTime variable, this format is required: (year, month, day, hour, minutes, seconds)
DateTime newTime = DateTime (tdArray [0], tdArray [1], tdArray [2], tdArray [3], tdArray [4], tdArray [5]);
RTC.adjust (Newtime);
Serial.println ("Set new time.");
}
if (strstr (bufferRX, "setAlarm1Time,")) {
int tdArray [6];
char * pch = strtok (bufferRX, ","); // split string into tokens
unsigned int i = 0;
while (pch! = NULL) {
if (i> 0) // The first value found "setDateTime" does not save it in the array
tdArray [i - 1] = atoi (pch); // convert the string to an integer with the atoi () statement
pch = strtok (NULL, ","); // we find the next substring
i ++;

Set date and time
The date and time are set using the serial monitor. Figure 4 is explanatory. Also find on lines 15, 16 and 17 what to write.
To update date and time, send the following command:
Per aggiornare data e ora, inviare il seguente comando:

"setDateTime year, month, day, hour, minutes, seconds"

Videos and photo gallery

 
Copyright 2015. All rights reserved.
Torna ai contenuti | Torna al menu