Skip to content
  • MySensors
  • 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. Troubleshooting
  3. Clock Sketch (RTC) modified for 1.8" LCD

Clock Sketch (RTC) modified for 1.8" LCD

Scheduled Pinned Locked Moved Troubleshooting
3 Posts 2 Posters 44 Views 2 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.
  • P Offline
    P Offline
    palmerfarmer
    wrote on last edited by
    #1

    Just embarking on making the 'Real Time Clock Module, LCD Display and Controller Time' sketch to use with a 1.8" lcd 128x160 ST7735. Problem i have is trying to get it to display the correct format of time.
    eg I would like to display:-
    06:03:09 instead of 6: 3: 9 for the time and equivelant for the date too. This is a problem when the numbers reach double figures as you get false times because it doenst clear.

    I think i need to use something similar to this;

    if (digits < 10)
    myGLCD.printNumI('0');

    I am using the UTFT libraires but cannot work out the correct syntax.
    the pic below is not a great example as the time when i took this was all double digit numbers the date and month are single. but need it to say 06/01/20

    UTFT clock (2).jpg
    below is my code

    /**
       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.
    
     *******************************
    
      NB uses 1.8inch LCD rememeber to edit the memorysaver.h file and only leave ST7735
    
       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_RF24
    #define MY_RF24_PA_LEVEL (RF24_PA_MIN)
    #define MY_NODE_ID 40
    
    
    //#define MY_RADIO_RFM69
    
    #include <SPI.h>
    #include <MySensors.h>
    #include <TimeLib.h> //this is where tm.Hour tm.Min comes from
    #include <DS3232RTC.h>  // A  DS3231/DS3232 library
    #include <Wire.h>
    #include <UTFT.h>
    
    extern uint8_t BigFont[];
    //extern uint8_t SmallFont[];
    extern uint8_t Grotesk16x32[];
    
    
    UTFT myGLCD(ITDB18SP, 5, 4, 8, 7, 6); //remember to edit the memorysaver.h file and only leave ST7735XX
    
    
    bool timeReceived = false;
    unsigned long lastUpdate = 0, lastRequest = 0;
    
    
    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 fort
    
      myGLCD.InitLCD(LANDSCAPE);// or PORTRAIT
      myGLCD.clrScr();
    
    }
    
    void presentation()  {
      // Send the sketch version information to the gateway and Controller
      sendSketchInfo("Clock Basic Master", "2.0");
    }
    
    // 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()
    {
    
      myGLCD.setColor(255, 255, 255);
    
      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();
    
      myGLCD.setColor(80, 80, 200);
      myGLCD.setFont(Grotesk16x32);
      myGLCD.printNumI(tm.Hour, 10 , 20);
      myGLCD.print(":", 45, 20);
      myGLCD.printNumI(tm.Minute, CENTER, 20);
      myGLCD.print(":", 100, 20);
      myGLCD.printNumI(tm.Second, 115, 20);
    
    
      myGLCD.setFont(BigFont);
      myGLCD.setColor(255, 255, 0);
      myGLCD.printNumI(tm.Day, 15 , 65);
      myGLCD.print("/", 45, 65);
      myGLCD.printNumI(tm.Month, CENTER, 65);
      myGLCD.print("/" , 90, 65);
      myGLCD.printNumI(tmYearToCalendar(tm.Year) - 2000, 110, 65);
    
    
      myGLCD.print("T: ", 30, 95);
      myGLCD.printNumI(RTC.temperature() / 4, CENTER, 95 );
      myGLCD.print("o", 95, 90); // Degree-sign
      myGLCD.print("C", 107, 95);
    
    
    }
    
    /*
      void print2digits(int number) {
      if (number >= 0 && number < 10) {
        myGLCD.print("0",CENTER, 65 );
      }
      //   myGLCD.print(number);
      }
    
    
    
    
      /*
    
      void printNumI(int digits) {
      if (digits < 10)
      myGLCD.printNumI('0');
      myGLCD.print(digits);
    
      /*
      original sketch had this below for 16x4 LCD
    
      void printDigits(int digits) {
      if (digits < 10)
        lcd.print('0');
      lcd.print(digits);
    
    
    
    
      }
    */
    mfalkviddM 1 Reply Last reply
    0
    • P palmerfarmer

      Just embarking on making the 'Real Time Clock Module, LCD Display and Controller Time' sketch to use with a 1.8" lcd 128x160 ST7735. Problem i have is trying to get it to display the correct format of time.
      eg I would like to display:-
      06:03:09 instead of 6: 3: 9 for the time and equivelant for the date too. This is a problem when the numbers reach double figures as you get false times because it doenst clear.

      I think i need to use something similar to this;

      if (digits < 10)
      myGLCD.printNumI('0');

      I am using the UTFT libraires but cannot work out the correct syntax.
      the pic below is not a great example as the time when i took this was all double digit numbers the date and month are single. but need it to say 06/01/20

      UTFT clock (2).jpg
      below is my code

      /**
         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.
      
       *******************************
      
        NB uses 1.8inch LCD rememeber to edit the memorysaver.h file and only leave ST7735
      
         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_RF24
      #define MY_RF24_PA_LEVEL (RF24_PA_MIN)
      #define MY_NODE_ID 40
      
      
      //#define MY_RADIO_RFM69
      
      #include <SPI.h>
      #include <MySensors.h>
      #include <TimeLib.h> //this is where tm.Hour tm.Min comes from
      #include <DS3232RTC.h>  // A  DS3231/DS3232 library
      #include <Wire.h>
      #include <UTFT.h>
      
      extern uint8_t BigFont[];
      //extern uint8_t SmallFont[];
      extern uint8_t Grotesk16x32[];
      
      
      UTFT myGLCD(ITDB18SP, 5, 4, 8, 7, 6); //remember to edit the memorysaver.h file and only leave ST7735XX
      
      
      bool timeReceived = false;
      unsigned long lastUpdate = 0, lastRequest = 0;
      
      
      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 fort
      
        myGLCD.InitLCD(LANDSCAPE);// or PORTRAIT
        myGLCD.clrScr();
      
      }
      
      void presentation()  {
        // Send the sketch version information to the gateway and Controller
        sendSketchInfo("Clock Basic Master", "2.0");
      }
      
      // 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()
      {
      
        myGLCD.setColor(255, 255, 255);
      
        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();
      
        myGLCD.setColor(80, 80, 200);
        myGLCD.setFont(Grotesk16x32);
        myGLCD.printNumI(tm.Hour, 10 , 20);
        myGLCD.print(":", 45, 20);
        myGLCD.printNumI(tm.Minute, CENTER, 20);
        myGLCD.print(":", 100, 20);
        myGLCD.printNumI(tm.Second, 115, 20);
      
      
        myGLCD.setFont(BigFont);
        myGLCD.setColor(255, 255, 0);
        myGLCD.printNumI(tm.Day, 15 , 65);
        myGLCD.print("/", 45, 65);
        myGLCD.printNumI(tm.Month, CENTER, 65);
        myGLCD.print("/" , 90, 65);
        myGLCD.printNumI(tmYearToCalendar(tm.Year) - 2000, 110, 65);
      
      
        myGLCD.print("T: ", 30, 95);
        myGLCD.printNumI(RTC.temperature() / 4, CENTER, 95 );
        myGLCD.print("o", 95, 90); // Degree-sign
        myGLCD.print("C", 107, 95);
      
      
      }
      
      /*
        void print2digits(int number) {
        if (number >= 0 && number < 10) {
          myGLCD.print("0",CENTER, 65 );
        }
        //   myGLCD.print(number);
        }
      
      
      
      
        /*
      
        void printNumI(int digits) {
        if (digits < 10)
        myGLCD.printNumI('0');
        myGLCD.print(digits);
      
        /*
        original sketch had this below for 16x4 LCD
      
        void printDigits(int digits) {
        if (digits < 10)
          lcd.print('0');
        lcd.print(digits);
      
      
      
      
        }
      */
      mfalkviddM Offline
      mfalkviddM Offline
      mfalkvidd
      Mod
      wrote on last edited by mfalkvidd
      #2

      @palmerfarmer printNumI actually accepts two more parameters:

      UTFT::printNumI(long num, int x, int y, int length, char filler)
      

      You want the length to be 2 and the filler to be '0'.

      So change

      myGLCD.printNumI(tm.Hour, 10 , 20);
      

      to

      myGLCD.printNumI(tm.Hour, 10 , 20, 2, '0');
      

      (And similar for the other calls to printNumI where you want 2 numbers)

      1 Reply Last reply
      0
      • P Offline
        P Offline
        palmerfarmer
        wrote on last edited by
        #3

        Thanks for the speedy reply, I owe you a beer! works perfectly.
        UTFT clockB (2).jpg

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


        10

        Online

        11.7k

        Users

        11.2k

        Topics

        113.1k

        Posts


        Copyright 2025 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
        • MySensors
        • OpenHardware.io
        • Categories
        • Recent
        • Tags
        • Popular