Advertisement
TolentinoCotesta

RTC_LCD

Sep 8th, 2018
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.99 KB | None | 0 0
  1. //LCD 16x2 PCF8574AT + RTC Versione IDE 1.6.0
  2. #include <Wire.h>
  3. #include <RTClib.h>
  4. RTC_DS1307 RTC;
  5. #include <LiquidCrystal_I2C.h>
  6. #define DS1307_I2C_ADDRESS 0x68
  7. LiquidCrystal_I2C lcd(0x3F,16,2);
  8. char daysOfTheWeek[7][10] = {"Do", "Lu", "Ma", "Me", "Gio", "Ve", "Sa"};
  9.  
  10. char bufferRX[50];
  11.  
  12. void setup()
  13. {
  14.   Serial.begin(9600);
  15.  
  16.   Serial.println("Per aggiornare data e ora inviare il seguente comando: ");
  17.   Serial.println("\"setDateTime anno, mese, giorno, ora, minuti, secondi\"");
  18.   Serial.println("Esempio: setDateTime, 2018, 9, 8, 17, 30, 00");
  19.   lcd.init();
  20.   lcd.backlight();
  21. }
  22.  
  23.  
  24.  
  25. void loop()
  26. {
  27.   // Come sai, non amo l'istruzione delay().
  28.   // Quindi la rimuoviamo, ma aggiorniamo cmq una volta al secondo
  29.   static unsigned long updateTime;  
  30.   if(millis() - updateTime > 1000){
  31.     updateTime = millis();
  32.     DateTime now = RTC.now();
  33.     lcd.clear();
  34.     lcd.setCursor(0, 0);
  35.     LCDPrintNum(now.hour());
  36.     lcd.print(":");
  37.     LCDPrintNum(now.minute());
  38.     lcd.print(":");
  39.     LCDPrintNum(now.second());
  40.     lcd.print(" ");  
  41.     lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
  42.     lcd.setCursor(0, 1);
  43.     LCDPrintNum(now.day());
  44.     lcd.print("/");
  45.     LCDPrintNum(now.month());
  46.     lcd.print("/");
  47.     lcd.print(now.year(), DEC);
  48.   }
  49.  
  50.   // Vediamo se arriva qualcosa dalla seriale
  51.   readSerial();  
  52. }
  53.  
  54.  
  55. // Funzione per stampare ad esempio 02 al posto di 2
  56. void LCDPrintNum(int num){
  57.   if(num <10)
  58.     lcd.print("0");
  59.   lcd.print(num);
  60. }
  61.  
  62.  
  63. void readSerial(){
  64.   while (Serial.available() > 0) {  
  65.     // Leggiamo tutto quello che arriva dalla seriale e salviamolo nell'array di char bufferRX[]  
  66.     Serial.readBytesUntil('\n', bufferRX, sizeof(bufferRX) - 1);    
  67.     /*
  68.      *  Se c'è il comando giusto eseguiamo l'aggiornamento dell'orario dell'RTC
  69.      *  Verrà usata la funzione C++ strtok che consente di splittare una stringa con uno specifico delimitatore,
  70.      *  nel nostro caso la virgola ','. I valori verranno quindi salvati nell'array di int tdArray[] per usarli
  71.      *  facilmente dove necessario per impostare il nuovo orario.
  72.     */
  73.     if(strstr(bufferRX, "setDateTime,")){          
  74.       int tdArray[6];  
  75.       char * pch = strtok (bufferRX, " ,");   // Split string into tokens
  76.       unsigned int i = 0;
  77.       while (pch != NULL){          
  78.         if(i > 0)                             // Il primo valore trovato "setDateTime" non lo salvo nell'array          
  79.           tdArray[i-1] = atoi(pch);           // Converto la stringa in un intero con l'istruzione atoi()                        
  80.         pch = strtok (NULL, " ,");            // troviamo la substring successiva
  81.         i++;
  82.       }      
  83.       // Per creare una variabile DateTime è necessario questo formato: (anno, mese, giorno, ora, minuti, secondi)
  84.       DateTime newTime = DateTime(tdArray[0], tdArray[1], tdArray[2], tdArray[3], tdArray[4], tdArray[5]);
  85.       RTC.adjust(newTime);      
  86.       Serial.println("Impostato nuovo orario.");      
  87.     }
  88.   }  
  89.  
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement