Skip to content
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. Announcements
  3. 💬 Real Time Clock Module, LCD Display and Controller Time
  • Getting Started
  • Controller
  • Build
  • Hardware
  • Download/API
  • Forum
  • Store

💬 Real Time Clock Module, LCD Display and Controller Time

Scheduled Pinned Locked Moved Announcements
10 Posts 6 Posters 2.9k Views 7 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • hekH Offline
    hekH Offline
    hek
    Admin
    wrote on last edited by hek
    #1

    This thread contains comments for the article "Real Time Clock Module, LCD Display and Controller Time" posted on MySensors.org.

    1 Reply Last reply
    0
    • mppM Offline
      mppM Offline
      mpp
      wrote on last edited by mpp
      #2

      Thank you for this nice write up.

      I have some "low power" questions:

      • Will the RTC continue to work when the Arduino is set to Sleep?
      • Is there a way to save battery and wake up the Arduino using the RTC?
      • What is the power consumption of a get time request?
      • What is the autonomy of the RTC?

      MyController with USB powered WeMos D1/mini ESP8266 MQTT Gateways and battery powered Arduino Pro Mini using the RFM69 radio

      1 Reply Last reply
      1
      • hekH Offline
        hekH Offline
        hek
        Admin
        wrote on last edited by
        #3

        Yes, the RTC will continue to function while the Arduino is sleeping.

        On the DS3232RTC you can set alarm (which triggers the INT pin of the module). See more info here:
        https://github.com/mysensors/MySensorsArduinoExamples/tree/master/libraries/DS3232RTC

        1 Reply Last reply
        1
        • cadetC Offline
          cadetC Offline
          cadet
          wrote on last edited by cadet
          #4

          I was modify code to Present temp to controller .

          /**
           * The MySensors Arduino library handles the wireless radio link and protocol
           * between your home built sensors/actuators and HA controller of choice.
           * The sensors forms a self healing radio network with optional repeaters. Each
           * repeater and gateway builds a routing tables in EEPROM which keeps track of the
           * network topology allowing messages to be routed to nodes.
           *
           * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
           * Copyright (C) 2013-2015 Sensnology AB
           * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
           *
           * Documentation: http://www.mysensors.org
           * Support Forum: http://forum.mysensors.org
           *
           * This program is free software; you can redistribute it and/or
           * modify it under the terms of the GNU General Public License
           * version 2 as published by the Free Software Foundation.
           *
           *******************************
           *
           * REVISION HISTORY
           * Version 1.0 - Henrik Ekblad
           * 
           * DESCRIPTION
           * Example sketch showing how to request time from controller which is stored in RTC module
           * The time and temperature (DS3231/DS3232) is shown on an attached Crystal LCD display
           * 
           *
           * Wiring (radio wiring on www.mysensors.org)
           * ------------------------------------
           * Arduino   RTC-Module     I2C Display 
           * ------------------------------------
           * GND       GND            GND
           * +5V       VCC            VCC
           * A4        SDA            SDA
           * A5        SCL            SCL
           *
           * http://www.mysensors.org/build/display
           *
           */
          
          // Enable debug prints to serial monitor
          #define MY_DEBUG 
          
          // Enable and select radio type attached
          #define MY_RADIO_NRF24
          //#define MY_RADIO_RFM69
           
          #include <SPI.h>
          #include <MySensors.h>  
          #include <TimeLib.h> 
          #include <DS3232RTC.h>  // A  DS3231/DS3232 library
          #include <Wire.h>
          #include <LiquidCrystal_I2C.h>
          //#include <LCD_1602_RUS.h>
          
          bool timeReceived = false;
          unsigned long lastUpdate=0, lastRequest=0;
          
          int numSensors=0;
          #define CHILD_ID_TEMP 15
          #define COMPARE_TEMP 1                            // Send temperature only if changed? 1 = Yes 0 = No
          MyMessage msg(0,V_TEMP);
          float lastTemperature;
          
          
          // Initialize display. Google the correct settings for your display. 
          // The follwoing setting should work for the recommended display in the MySensors "shop".
          LiquidCrystal_I2C lcd(0x3F, 16, 2);
          //LCD_1602_RUS lcd(0x3F, 16, 2);
          
          void setup()  
          {  
            // the function to get the time from the RTC
            setSyncProvider(RTC.get);  
          
            // Request latest time from controller at startup
            requestTime();  
            
            // initialize the lcd for 16 chars 2 lines and turn on backlight
            lcd.begin(16,2); 
            lcd.init();                    // Инициализируем экран
            lcd.clear();
            lcd.backlight();               //включаем подсветку
          }
          
          void presentation()  {
            // Send the sketch version information to the gateway and Controller
            sendSketchInfo("RTC Clock + Temp", "1.1.1");
            present(0, S_TEMP); 
           
            numSensors = 1 ;
          }
          
          // This is called when a new time value was received
          void receiveTime(unsigned long controllerTime) {
            // Ok, set incoming time 
            Serial.print("Time value received: ");
            Serial.println(controllerTime);
            RTC.set(controllerTime); // this sets the RTC to the time from controller - which we do want periodically
            timeReceived = true;
          }
           
          void loop()     
          {     
            unsigned long now = millis();
            
            // If no time has been received yet, request it every 10 second from controller
            // When time has been received, request update every hour
            if ((!timeReceived && (now-lastRequest) > (10UL*1000UL))
              || (timeReceived && (now-lastRequest) > (60UL*1000UL*60UL))) {
              // Request time from controller. 
              Serial.println("requesting time");
              requestTime();  
              lastRequest = now;
            }
            
            // Update display every second
            if (now-lastUpdate > 1000) {
              updateDisplay();  
              lastUpdate = now;
            }
          }
          
          
          void updateDisplay(){
            tmElements_t tm;
            RTC.read(tm);
          
            // Print date and time 
            lcd.home();
            lcd.print(tm.Day);
            lcd.print("/");
            lcd.print(tm.Month);
            lcd.print("/");
            lcd.print(tmYearToCalendar(tm.Year)-2000);
          
            lcd.print(" ");
            printDigits(tm.Hour);
            lcd.print(":");
            printDigits(tm.Minute);
          //  lcd.print(":");
          //  printDigits(tm.Second);
          
            // Go to next line and print temperature
            lcd.setCursor ( 0, 1 );  
            lcd.print("Temp: ");
            lcd.print(RTC.temperature()/4);
            lcd.write(223); // Degree-sign
            lcd.print("C");
            float temperature = (RTC.temperature()/4);
            #if COMPARE_TEMP == 1
              if (lastTemperature != temperature && temperature != -127.00 && temperature != 85.00) {
              #else
              if (temperature != -127.00 && temperature != 85.00) {
              #endif
          
                // Send in the new temperature
                send(msg.setSensor(0).set(temperature, 1));
                // Save new temperatures for next compare
                lastTemperature=temperature;
              }
           
            
          }
          
          
          void printDigits(int digits){
            if(digits < 10)
              lcd.print('0');
            lcd.print(digits);
          }
          
          
          
          cadetC 1 Reply Last reply
          0
          • cadetC cadet

            I was modify code to Present temp to controller .

            /**
             * The MySensors Arduino library handles the wireless radio link and protocol
             * between your home built sensors/actuators and HA controller of choice.
             * The sensors forms a self healing radio network with optional repeaters. Each
             * repeater and gateway builds a routing tables in EEPROM which keeps track of the
             * network topology allowing messages to be routed to nodes.
             *
             * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
             * Copyright (C) 2013-2015 Sensnology AB
             * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
             *
             * Documentation: http://www.mysensors.org
             * Support Forum: http://forum.mysensors.org
             *
             * This program is free software; you can redistribute it and/or
             * modify it under the terms of the GNU General Public License
             * version 2 as published by the Free Software Foundation.
             *
             *******************************
             *
             * REVISION HISTORY
             * Version 1.0 - Henrik Ekblad
             * 
             * DESCRIPTION
             * Example sketch showing how to request time from controller which is stored in RTC module
             * The time and temperature (DS3231/DS3232) is shown on an attached Crystal LCD display
             * 
             *
             * Wiring (radio wiring on www.mysensors.org)
             * ------------------------------------
             * Arduino   RTC-Module     I2C Display 
             * ------------------------------------
             * GND       GND            GND
             * +5V       VCC            VCC
             * A4        SDA            SDA
             * A5        SCL            SCL
             *
             * http://www.mysensors.org/build/display
             *
             */
            
            // Enable debug prints to serial monitor
            #define MY_DEBUG 
            
            // Enable and select radio type attached
            #define MY_RADIO_NRF24
            //#define MY_RADIO_RFM69
             
            #include <SPI.h>
            #include <MySensors.h>  
            #include <TimeLib.h> 
            #include <DS3232RTC.h>  // A  DS3231/DS3232 library
            #include <Wire.h>
            #include <LiquidCrystal_I2C.h>
            //#include <LCD_1602_RUS.h>
            
            bool timeReceived = false;
            unsigned long lastUpdate=0, lastRequest=0;
            
            int numSensors=0;
            #define CHILD_ID_TEMP 15
            #define COMPARE_TEMP 1                            // Send temperature only if changed? 1 = Yes 0 = No
            MyMessage msg(0,V_TEMP);
            float lastTemperature;
            
            
            // Initialize display. Google the correct settings for your display. 
            // The follwoing setting should work for the recommended display in the MySensors "shop".
            LiquidCrystal_I2C lcd(0x3F, 16, 2);
            //LCD_1602_RUS lcd(0x3F, 16, 2);
            
            void setup()  
            {  
              // the function to get the time from the RTC
              setSyncProvider(RTC.get);  
            
              // Request latest time from controller at startup
              requestTime();  
              
              // initialize the lcd for 16 chars 2 lines and turn on backlight
              lcd.begin(16,2); 
              lcd.init();                    // Инициализируем экран
              lcd.clear();
              lcd.backlight();               //включаем подсветку
            }
            
            void presentation()  {
              // Send the sketch version information to the gateway and Controller
              sendSketchInfo("RTC Clock + Temp", "1.1.1");
              present(0, S_TEMP); 
             
              numSensors = 1 ;
            }
            
            // This is called when a new time value was received
            void receiveTime(unsigned long controllerTime) {
              // Ok, set incoming time 
              Serial.print("Time value received: ");
              Serial.println(controllerTime);
              RTC.set(controllerTime); // this sets the RTC to the time from controller - which we do want periodically
              timeReceived = true;
            }
             
            void loop()     
            {     
              unsigned long now = millis();
              
              // If no time has been received yet, request it every 10 second from controller
              // When time has been received, request update every hour
              if ((!timeReceived && (now-lastRequest) > (10UL*1000UL))
                || (timeReceived && (now-lastRequest) > (60UL*1000UL*60UL))) {
                // Request time from controller. 
                Serial.println("requesting time");
                requestTime();  
                lastRequest = now;
              }
              
              // Update display every second
              if (now-lastUpdate > 1000) {
                updateDisplay();  
                lastUpdate = now;
              }
            }
            
            
            void updateDisplay(){
              tmElements_t tm;
              RTC.read(tm);
            
              // Print date and time 
              lcd.home();
              lcd.print(tm.Day);
              lcd.print("/");
              lcd.print(tm.Month);
              lcd.print("/");
              lcd.print(tmYearToCalendar(tm.Year)-2000);
            
              lcd.print(" ");
              printDigits(tm.Hour);
              lcd.print(":");
              printDigits(tm.Minute);
            //  lcd.print(":");
            //  printDigits(tm.Second);
            
              // Go to next line and print temperature
              lcd.setCursor ( 0, 1 );  
              lcd.print("Temp: ");
              lcd.print(RTC.temperature()/4);
              lcd.write(223); // Degree-sign
              lcd.print("C");
              float temperature = (RTC.temperature()/4);
              #if COMPARE_TEMP == 1
                if (lastTemperature != temperature && temperature != -127.00 && temperature != 85.00) {
                #else
                if (temperature != -127.00 && temperature != 85.00) {
                #endif
            
                  // Send in the new temperature
                  send(msg.setSensor(0).set(temperature, 1));
                  // Save new temperatures for next compare
                  lastTemperature=temperature;
                }
             
              
            }
            
            
            void printDigits(int digits){
              if(digits < 10)
                lcd.print('0');
              lcd.print(digits);
            }
            
            
            
            cadetC Offline
            cadetC Offline
            cadet
            wrote on last edited by
            #5

            @cadet
            Hi all

            Can I display Temp from other sensor ?

            Thank you
            Andrey

            gohanG 1 Reply Last reply
            0
            • E Offline
              E Offline
              exagon_46
              wrote on last edited by
              #6

              Hi, I wanted to know if it was possible to create a node in each room with a temperature sensor and display and send it all to the controller

              1 Reply Last reply
              0
              • cadetC cadet

                @cadet
                Hi all

                Can I display Temp from other sensor ?

                Thank you
                Andrey

                gohanG Offline
                gohanG Offline
                gohan
                Mod
                wrote on last edited by
                #7

                @cadet sure you can, in the send() function you can specify a destination ID of the node with the display

                @exagon_46 of course is possible, just add some code to display the temperature (use the examples of the LiquidCrystal_I2C library as reference)

                1 Reply Last reply
                0
                • J Offline
                  J Offline
                  JeeLet
                  wrote on last edited by JeeLet
                  #8

                  good evening

                  again a new sketch for the "void receiveTime" function
                  (without RTC clock)

                  • start synchronization with the controller and regularly for the drift of the arduino.
                  • display time and date on an OLED screen
                  • error message when a loss of communication with the controller occurs

                  a video "https://www.casimages.com/v/RSWTNb-vokoscreen-2022-05-24-19-33-49.mp4.html"

                  /*
                   * LIBRAIRIE:
                   *  MySensors v2    : https://github.com/mysensors/MySensors
                   *  TimeLib.h       : https://github.com/PaulStoffregen/Time
                   *  SSD1306Ascii.h  : https://github.com/greiman/SSD1306Ascii
                   *
                   * MATERIEL:
                   *    Arduino Uno
                   *    -Afficheur OLED 0,96" I2C TF052 / circuit SSD1306.
                   *    bus TTLModule RS485
                   * 
                   * REVISION HISTORY
                   *  base de Henrik Ekblad 2013-2015 et autres :)
                   *  ajout bus RS485 et OLED
                   * 
                   * DESCRIPTION
                   *  demander Date et Heure au  contrôleur et l'affiche sur ecran OLED 
                   *  Request date and time from the controller and display it on OLED screen 
                   *  
                   *  Connectique i2c:
                  *   Arduino :  A4   A5
                  *   OLED    :  SDA  SCL
                   *  
                   */
                  //-- The sketch uses 11932 bytes (36%) ----global variables use 839 bytes (40%)-----------
                  //-
                  //------------ 2022 ----------------------- Fonctionnelle avec MyC et MyS------------------- 
                  
                    //#define MY_DEBUG                  /*Enable debug prints to serial monitor*/
                    #define MY_TRANSPORT_WAIT_READY_MS 3000  /*Timeout (ms) pour mis en Com.(0 pour aucun)*/
                    #define MY_NODE_ID 22          /*Node en ID static*/
                  
                  /* ----- Module RS485 ----*/
                    #define MY_RS485                  /*Apl du transport RS485 (protocol?)*/
                    #define MY_RS485_DE_PIN 2         /*Cmd DE pin*/
                    #define MY_RS485_BAUD_RATE 9600   /*Set RS485 baud rate to use*/
                  //#define MY_RS485_HWSERIAL Serial1 /*pour port Serial autre*/
                    
                    #include "SSD1306Ascii.h"
                    #include "SSD1306AsciiAvrI2c.h"
                    
                    #include <MySensors.h>  
                    #include <TimeLib.h> 
                  
                    #define CHILD_ID 22       /* MyS numero du Node*/
                  
                    #define I2C_ADDRESS 0x3C                        /*i2c adresse*/
                    
                    #define RST_PIN -1  // Define proper RST_PIN if required.(oled)
                     
                    SSD1306AsciiAvrI2c oled;  //type de com oled
                  
                  //----- MyS ------
                      bool timeReceived = false;  
                      bool stateCom = false;
                      unsigned long lastUpdate=0, lastRequest=0 , lastmillis = 0;
                      unsigned long newTime = 0, oldTime = 0, ComTime = 6000;
                  
                  //---------------- SETUP ----------------------------
                  
                    void setup()  {  
                  
                  //--- OLED ----
                    #if RST_PIN >= 0
                      oled.begin(&Adafruit128x32, I2C_ADDRESS, RST_PIN);
                    #else // RST_PIN >= 0
                      oled.begin(&Adafruit128x32, I2C_ADDRESS);
                    #endif // RST_PIN >= 0
                  
                      oled.setFont(Adafruit5x7);         /*font Oled*/
                      // oled.setFont(font8x8);             //bien 
                      // oled.setFont(Verdana12);           //grand
                      // oled.setFont(fixed_bold10x15);     //tres grand   
                      // oled.setFont(Arial_bold_14);       //grand sympa 
                      oled.clear();
                      }
                  
                  //--------------MySensors-------------
                  
                    void presentation()  {
                      sendSketchInfo("Clock", "2.0");
                      }
                  
                  //------------------ LOOP -----------------------
                    void loop() {     
                    
                  // ---- MyS time --------  
                    unsigned long now = millis();
                    
                     if (now-lastRequest > (ComTime)) {    
                                  
                        timeReceived = false;
                        requestTime(receiveTime);   // Request time from controller. 
                        lastRequest = now;
                        }
                      
                  //----- Tempo Display Oled ----------
                    if (now-lastUpdate > 10000) {  //10secondes
                      lastUpdate = now;
                     // Serial.print(" test lastmillis------------ display : "); 
                     // Serial.println(timeReceived);
                      updateDisplay();
                      lastmillis = millis();
                  
                  
                  //----- Stat Com ---
                      if (timeReceived == 1) {   //En Com Controller stateCom
                        ComTime = 480UL*1000UL;    // 480=8 minutes cycles for Control presence controller 
                          }
                      else  {           // Erreur Com Controller
                        stateCom = false;
                        ComTime = 60UL*1000UL;    // secondes for attempted reconnection to the controller 
                       // Serial.println(" ----*** Erreur Com Controller *** ---- ");
                        }
                       }
                     } //---Loop
                  
                   // -------------------- MyS --------------------------------
                    void receiveTime(unsigned long controllerTime)   {   
                     if (receiveTime) stateCom = true ; else stateCom = false;
                      newTime = controllerTime;
                      timeReceived = true;
                      setTime(controllerTime); // apl pour TimeLib.h
                      }
                      
                  //------------Gestion de l'affichage OLED---------------
                    void updateDisplay() {
                  
                      oled.set1X();           //ligne Message
                      oled.setCursor(2, 0);
                      printStatDay () ;       // affiche jour de la semaine/poster day of the week
                      //oled.print(day());
                     
                      oled.set2X();           //ligne Heures
                      oled.setCursor(18,1);
                      oled.print(hour());
                      printDigits(minute());
                      printDigits(second());
                       
                      oled.set1X();           // ligne jour mois Année / day month year
                      oled.setCursor(35,3);
                      oled.print(day());
                      printDigitsDay(month());
                      printDigitsDay(year());
                     }
                  
                  //-------- Day displaying-------
                    void printDigitsDay(int digitday) { //function for Day displaying "0" and separator "/" for day/month/year values
                      oled.print("/");
                        if(digitday < 10)
                          oled.print('0');
                          oled.print(digitday);
                      }
                  
                  //-------- Time displaying-------
                    void printDigits(int digits) {  //function for Time displaying "0" and separator ":" for hour:minute:sec values
                      oled.print(":");
                        if(digits < 10)
                          oled.print('0');
                          oled.print(digits);
                      }
                  
                  //------ conversion date en texte (fonction weekday) et statu Com Controller -----------  
                    void printStatDay () {   //function for display Day texte
                  
                      oled.invertDisplay(!(stateCom)); // inverse N/B Oled sur erreur Com
                      if(stateCom == true) { oled.print("com  "); }    //com okai
                      if(stateCom == false){ oled.print("Error"); }    //com Error
                        // oled.print(stateCom);
                          oled.print("  ");
                        
                     
                      if(weekday() == 1) { oled.print("dimanche"); }  //Sunday
                      if(weekday() == 2) { oled.print("lundi"); }     //Monday
                      if(weekday() == 3) { oled.print("mardi"); }     //Tuesday
                      if(weekday() == 4) { oled.print("mercredi"); }  //Wednesday
                      if(weekday() == 5) { oled.print("jeudi"); }     //Thursday
                      if(weekday() == 6) { oled.print("vendredi"); }  //Friday
                      if(weekday() == 7) { oled.print("samedi"); }    //Saturday
                  
                       oled.print(" ");
                       oled.print(day());
                     }
                  
                  //-------------------FIN PGM --------------------------
                  
                  //------------------- INFO -------------------
                  

                  why open a new post, there is still some space here :)

                  1 Reply Last reply
                  1
                  • J Offline
                    J Offline
                    JeeLet
                    wrote on last edited by
                    #9

                    For your information, RTC ... DS323x

                    the library provided with Mysensors can be blocking on loss of Com or lack of power supply of DS3231 module.

                    new features are added to wire
                    https://github.com/Makuna/Rtc/discussions/151

                    ... the most with the makuna version, it gives error messages, and restarts after a loss of Communication or Power.

                    the terminal test is copied.

                    1 Reply Last reply
                    0
                    • J Offline
                      J Offline
                      JeeLet
                      wrote on last edited by
                      #10

                      ...
                      compiled: Jan 27 202312:42:11
                      01/27/2023 12:42:11
                      RTC lost confidence in the DateTime!
                      RTC is the same as compile time! (not expected but all is fine)
                      01/27/2023 12:42:11
                      19.25C
                      01/27/2023 12:42:14
                      19.25C

                      -------- power loss -----
                      RTC communications error = 4
                      01/01/2000 00:00:00
                      0.00C
                      RTC communications error = 5
                      01/01/2000 00:00:00
                      0.00C..

                      ------------- return power supply +5v ----
                      RTC lost confidence in the DateTime!
                      01/01/2000 00:00:12
                      19.50C
                      RTC lost confidence in the DateTime!
                      01/01/2000 00:00:15
                      19.50C
                      ...

                      https://forum.arduino.cc/t/librairie-makuna-freez/1081415/34

                      1 Reply Last reply
                      0
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      3

                      Online

                      11.7k

                      Users

                      11.2k

                      Topics

                      113.0k

                      Posts


                      Copyright 2019 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
                      • Login

                      • Don't have an account? Register

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • OpenHardware.io
                      • Categories
                      • Recent
                      • Tags
                      • Popular