mpmcws

LCD 16x2 PCF8574AT + RTC Tiny I2C + allarm

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