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. My Project
  3. LCD Clock and Text sensor node with new V_TEXT

LCD Clock and Text sensor node with new V_TEXT

Scheduled Pinned Locked Moved My Project
39 Posts 11 Posters 30.2k Views 21 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.
  • NiklasON NiklasO

    @Qu3Uk said:

    @NiklasO I have something similar running on MYS 2.0 and can paste the code. I'm using a 4x1 display and using V_VAR-1-4 to send each line over.
    If that's useful to you I can post it.

    Yes please. I ported to 2.0 late yesterday and it works ok. I have 4 lines, 20 chars.

    Q Offline
    Q Offline
    Qu3Uk
    wrote on last edited by
    #28

    @NiklasO

    Here is it.

    // Enable debug prints to serial monitor
    //#define MY_DEBUG
    
    //#define MY_NODE_ID 200
    #define MY_SENSOR_ID 1
    
    // Enable and select radio type attached
    #define MY_RADIO_NRF24
    //#define MY_RADIO_RFM69
    
    // Enable repeater functionality for this node
    #define MY_REPEATER_FEATURE
    
    // LCD includes
    #include <Wire.h> 
    #include <LiquidCrystal_I2C.h>
    
    // MYS includes
    #include <SPI.h>
    #include <MySensors.h>
    
    #define LCD_ON 1  // GPIO value to write to turn on attached relay
    #define LCD_OFF 0 // GPIO value to write to turn off attached relay
    
    LiquidCrystal_I2C lcd(0x3f, 20, 4); //0x3f is the LCD address.
    String LINE_BLANK = "                    ";
    
    void before() {
    }
    
    void setup() {
      // Set off  LCD module
      lcd.begin (); 
      lcd.backlight();
    
      lcd.setCursor(0, 0); //
      lcd.print("Ready!"); // We expect the controller to remove this from display.
    }
    
    void presentation()
    {
      // Send the sketch version information to the gateway and Controller
      sendSketchInfo("LCD Display", "1.0");
    
      present(MY_SENSOR_ID, S_INFO);
    }
    
    
    void loop()
    {
      // extra processing if required.
    }
    
    void receive(const MyMessage &message) {
      // We only expect one type of message from controller. But we better check anyway.
      if (message.type == V_STATUS) {
        // Use V_STATUS to turn on/off the LCD display
        // if supported by LCD.
      }
    
      // temp string, probably don't need this.
      if (message.type == V_VAR1) {
        writeScreen(0, message.data);
      }
    
      if (message.type == V_VAR2) {
        writeScreen(1, message.data);
      }
    
      if (message.type == V_VAR3) {
        writeScreen(2, message.data);
      }
    
      if (message.type == V_VAR4) {
        writeScreen(3, message.data);
      }
    }
    
    void writeScreen(int line, String text)
    {
      // Trim whitespace from incoming text.
      text.trim();
    
      // Remove anything over 20 char in text.
      if(text.length() > 19)
      {
          text.remove(20);
      }
      
      // Clear the line
      lcd.setCursor(0, line);
      lcd.print(LINE_BLANK);
    
      // Set Line
      lcd.setCursor(0, line);
      lcd.print(text);
    }
    
    user1306U 1 Reply Last reply
    0
    • Marc-Olivier ChaubetM Offline
      Marc-Olivier ChaubetM Offline
      Marc-Olivier Chaubet
      wrote on last edited by Marc-Olivier Chaubet
      #29

      Hi AWI,
      Yes my display is working, i can see the date and "Line 1 - First....."

      I think what i send is not correct....0_o
      This is from the serial monitor

      read: 0-20-49 s=9,c=1,t=16,pt=0,l=4,sg=0:test
      

      Should it be something like this

      read: 0-20-49 s=9,c=1,t=16,pt=0,l=4,sg=0:Line1=test
      

      this is the sketch.

      
      /*
       PROJECT: MySensors / LCD display for text from controller
       PROGRAMMER: AWI
       DATE: september 8, 2015/ last update: september 8, 2015
       FILE: AWI_LCD_49.ino
       LICENSE: Public domain
      
       Hardware: tbd ..MYS Ceech - ATmega328p board w/ NRF24l01
          and MySensors 1.5 ()
              
      Special:
          MySensors - Development (as of sept 2015)
          
      SUMMARY:
          display time & 2 lines of text from Controller Text sensors
      */
      
      #include <MyMessage.h>
      #include <MySensor.h>                       // Mysensor network
      #include <SPI.h>
      #include <LiquidCrystal_I2C.h>
      #include <Time.h>                           //http://playground.arduino.cc/Code/Time
      #include <Wire.h>                           
      
      // uncomment if you are using the DEVELOPMENT version with V_TEXT & V_INFO defined (better to use development MyMessage.h)
      const byte V_TEXT = 47 ;                  // values taken from development edition MyMessage.h
      const byte S_INFO = 36 ;
      
      const byte nodeId = 49 ;                    // MySensors fixed node id
      const byte LCD1_CHILD = 8 ;                 // LCD line 1
      const byte LCD2_CHILD = 9 ;                 // LCD line 2
      
      char lastLCD1[21] = "Line1 - first   ";     // define & init before first receive
      char lastLCD2[21] = "Line2 - second  ";
      
      boolean timeReceived = false ;
      // timers for loop delays
      unsigned long lastUpdate=0, lastRequest=0, lastDisplay=0;
      int display_no = 0 ;                        // current display
      
      // *** Definition and initialisation
      // define the MySensor network
      MyTransportNRF24 transport(9,10);           // Sensoduino (8,7) Ceech board, 3.3v (7,8)  (pin default 9,10)
      MySensor gw(transport);  
      
      // Initialize messages for sensor network
      MyMessage textMsg(0, V_TEXT);
      //                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
      LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address
      
      // OPTIONAL: Custom characters for display - Units)
      byte heart[8] = { B00000, B01010, B11111, B11111, B01110, B00100, B00000, B00000};
      
      void setup(void){
          //Serial in Sensor network = 115200
          gw.begin(incomingMessage, nodeId);                  // this node is 49 fixed 
          //Send the sensor node sketch version information to the gateway
          gw.sendSketchInfo("AWI_LCD text 49", "1.1");
          gw.present(LCD1_CHILD, S_INFO, "LCD_line1");        // new S_type 20150905 (not know by domoticz)
          gw.present(LCD2_CHILD, S_INFO, "LCD_line2");
          gw.send(textMsg.setSensor(LCD1_CHILD).set("-"));    // initialize the V_TEXT at controller for sensor to none (trick for Domoticz)
          gw.send(textMsg.setSensor(LCD2_CHILD).set("-"));        
      
          // Initializations
          gw.requestTime(receiveTime);                        // get the time from controller (handled by receiveTime)
          
          // ** LCD display **
          Wire.begin();                                       // I2C
          lcd.begin(16, 2);                                   // LCD 2 lines * 16 char.
          lcd.setBacklight(HIGH);
          lcd.setCursor(0, 0);
          lcd.createChar(1, heart);
      
          // lcd.write(byte(0)); // write units
      }
      
      void loop(void){
          // timer for loop delays
          unsigned long now = millis();
          gw.process() ;
          // 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 > 10*1000)) ||   
              (now-lastRequest > 3600000UL)){                 // request update every hour to keep in sync
             // Request time from controller. 
             Serial.println("requesting time");
             timeReceived = false;
             gw.requestTime(receiveTime);  
             lastRequest = now;
              }
          // Change display and update sensors every 5 seconds (default = 5000)
          if (now-lastDisplay > 5000){
              lastDisplay = now;
              gw.request(LCD1_CHILD, V_TEXT, 0);                  // request new values from controller
              gw.request(LCD2_CHILD, V_TEXT, 0);                ;// request new values from controller
              // change display 
              display_no++;
                  if (display_no >= 2){ // wrap for number of different displays for second line
                  display_no = 0;
                  }
              }
          // Update display every second
          if (now-lastUpdate > 1000) {
              LCD_local_display();
              lastUpdate = now;
              }
          }
      
      // This is called when a new time value was received
      void receiveTime(unsigned long controllerTime) {
          Serial.print("Time value received: ");
          Serial.println(controllerTime);
          setTime(controllerTime);                            // time from controller
          timeReceived = true;
          }
      
      // This is called when a message is received 
      void incomingMessage(const MyMessage &message) {
          if (message.type==V_TEXT) {                         // Text messages only
           // Write some debug info
           Serial.print("Message: "); Serial.print(message.sensor); Serial.print(", Message: "); Serial.println(message.getString());
          if (message.sensor == LCD1_CHILD ) {
              snprintf(lastLCD1, sizeof(lastLCD1), "%16s", message.getString());  // load text into LCD string
              }
          else if (message.sensor == LCD2_CHILD){
              snprintf(lastLCD2, sizeof(lastLCD2), "%16s", message.getString());
              }
          } 
      }
      
      void LCD_local_display(void){
      // take car of LCD display information
          char buf[17]; // temp buffer for max 16 char display
          // start with location & time on first line
          snprintf(buf, sizeof buf, "%02d:%02d:%02d %02d-%02d", hour(), minute(), second(), day(), month());
          lcd.setCursor(0, 0);
          lcd.print(buf);
          lcd.setCursor(0, 1);
          if (display_no == 0){
            lcd.print(lastLCD1);                          // second line is text value from controller
          } else {                                        // display == 2
            lcd.print(lastLCD2);
          }
      }
      
      

      Thxs

      AWIA 1 Reply Last reply
      0
      • Marc-Olivier ChaubetM Marc-Olivier Chaubet

        Hi AWI,
        Yes my display is working, i can see the date and "Line 1 - First....."

        I think what i send is not correct....0_o
        This is from the serial monitor

        read: 0-20-49 s=9,c=1,t=16,pt=0,l=4,sg=0:test
        

        Should it be something like this

        read: 0-20-49 s=9,c=1,t=16,pt=0,l=4,sg=0:Line1=test
        

        this is the sketch.

        
        /*
         PROJECT: MySensors / LCD display for text from controller
         PROGRAMMER: AWI
         DATE: september 8, 2015/ last update: september 8, 2015
         FILE: AWI_LCD_49.ino
         LICENSE: Public domain
        
         Hardware: tbd ..MYS Ceech - ATmega328p board w/ NRF24l01
            and MySensors 1.5 ()
                
        Special:
            MySensors - Development (as of sept 2015)
            
        SUMMARY:
            display time & 2 lines of text from Controller Text sensors
        */
        
        #include <MyMessage.h>
        #include <MySensor.h>                       // Mysensor network
        #include <SPI.h>
        #include <LiquidCrystal_I2C.h>
        #include <Time.h>                           //http://playground.arduino.cc/Code/Time
        #include <Wire.h>                           
        
        // uncomment if you are using the DEVELOPMENT version with V_TEXT & V_INFO defined (better to use development MyMessage.h)
        const byte V_TEXT = 47 ;                  // values taken from development edition MyMessage.h
        const byte S_INFO = 36 ;
        
        const byte nodeId = 49 ;                    // MySensors fixed node id
        const byte LCD1_CHILD = 8 ;                 // LCD line 1
        const byte LCD2_CHILD = 9 ;                 // LCD line 2
        
        char lastLCD1[21] = "Line1 - first   ";     // define & init before first receive
        char lastLCD2[21] = "Line2 - second  ";
        
        boolean timeReceived = false ;
        // timers for loop delays
        unsigned long lastUpdate=0, lastRequest=0, lastDisplay=0;
        int display_no = 0 ;                        // current display
        
        // *** Definition and initialisation
        // define the MySensor network
        MyTransportNRF24 transport(9,10);           // Sensoduino (8,7) Ceech board, 3.3v (7,8)  (pin default 9,10)
        MySensor gw(transport);  
        
        // Initialize messages for sensor network
        MyMessage textMsg(0, V_TEXT);
        //                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
        LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address
        
        // OPTIONAL: Custom characters for display - Units)
        byte heart[8] = { B00000, B01010, B11111, B11111, B01110, B00100, B00000, B00000};
        
        void setup(void){
            //Serial in Sensor network = 115200
            gw.begin(incomingMessage, nodeId);                  // this node is 49 fixed 
            //Send the sensor node sketch version information to the gateway
            gw.sendSketchInfo("AWI_LCD text 49", "1.1");
            gw.present(LCD1_CHILD, S_INFO, "LCD_line1");        // new S_type 20150905 (not know by domoticz)
            gw.present(LCD2_CHILD, S_INFO, "LCD_line2");
            gw.send(textMsg.setSensor(LCD1_CHILD).set("-"));    // initialize the V_TEXT at controller for sensor to none (trick for Domoticz)
            gw.send(textMsg.setSensor(LCD2_CHILD).set("-"));        
        
            // Initializations
            gw.requestTime(receiveTime);                        // get the time from controller (handled by receiveTime)
            
            // ** LCD display **
            Wire.begin();                                       // I2C
            lcd.begin(16, 2);                                   // LCD 2 lines * 16 char.
            lcd.setBacklight(HIGH);
            lcd.setCursor(0, 0);
            lcd.createChar(1, heart);
        
            // lcd.write(byte(0)); // write units
        }
        
        void loop(void){
            // timer for loop delays
            unsigned long now = millis();
            gw.process() ;
            // 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 > 10*1000)) ||   
                (now-lastRequest > 3600000UL)){                 // request update every hour to keep in sync
               // Request time from controller. 
               Serial.println("requesting time");
               timeReceived = false;
               gw.requestTime(receiveTime);  
               lastRequest = now;
                }
            // Change display and update sensors every 5 seconds (default = 5000)
            if (now-lastDisplay > 5000){
                lastDisplay = now;
                gw.request(LCD1_CHILD, V_TEXT, 0);                  // request new values from controller
                gw.request(LCD2_CHILD, V_TEXT, 0);                ;// request new values from controller
                // change display 
                display_no++;
                    if (display_no >= 2){ // wrap for number of different displays for second line
                    display_no = 0;
                    }
                }
            // Update display every second
            if (now-lastUpdate > 1000) {
                LCD_local_display();
                lastUpdate = now;
                }
            }
        
        // This is called when a new time value was received
        void receiveTime(unsigned long controllerTime) {
            Serial.print("Time value received: ");
            Serial.println(controllerTime);
            setTime(controllerTime);                            // time from controller
            timeReceived = true;
            }
        
        // This is called when a message is received 
        void incomingMessage(const MyMessage &message) {
            if (message.type==V_TEXT) {                         // Text messages only
             // Write some debug info
             Serial.print("Message: "); Serial.print(message.sensor); Serial.print(", Message: "); Serial.println(message.getString());
            if (message.sensor == LCD1_CHILD ) {
                snprintf(lastLCD1, sizeof(lastLCD1), "%16s", message.getString());  // load text into LCD string
                }
            else if (message.sensor == LCD2_CHILD){
                snprintf(lastLCD2, sizeof(lastLCD2), "%16s", message.getString());
                }
            } 
        }
        
        void LCD_local_display(void){
        // take car of LCD display information
            char buf[17]; // temp buffer for max 16 char display
            // start with location & time on first line
            snprintf(buf, sizeof buf, "%02d:%02d:%02d %02d-%02d", hour(), minute(), second(), day(), month());
            lcd.setCursor(0, 0);
            lcd.print(buf);
            lcd.setCursor(0, 1);
            if (display_no == 0){
              lcd.print(lastLCD1);                          // second line is text value from controller
            } else {                                        // display == 2
              lcd.print(lastLCD2);
            }
        }
        
        

        Thxs

        AWIA Offline
        AWIA Offline
        AWI
        Hero Member
        wrote on last edited by AWI
        #30

        @Marc-Olivier-Chaubet You should be receiving the TEXT value coming from the controller. Is node showing other information on serial?

        // This is called when a message is received 
        void incomingMessage(const MyMessage &message) {
             // Write some debug info
             Serial.print("Message: "); Serial.print(message.sensor); Serial.print(", Message: "); Serial.println(message.getString());
            if (message.type==V_TEXT) {                         // Text messages only
             // Write some debug info
             Serial.print("Text Message: "); Serial.print(message.sensor); Serial.print(", Message: "); Serial.println(message.getString());
            if (message.sensor == LCD1_CHILD ) {
                snprintf(lastLCD1, sizeof(lastLCD1), "%16s", message.getString());  // load text into LCD string
                }
            else if (message.sensor == LCD2_CHILD){
                snprintf(lastLCD2, sizeof(lastLCD2), "%16s", message.getString());
                }
            } 
        }
        

        In incomingmessage routing add a print statement to show which messages are coming in (see above).

        1 Reply Last reply
        0
        • Marc-Olivier ChaubetM Offline
          Marc-Olivier ChaubetM Offline
          Marc-Olivier Chaubet
          wrote on last edited by
          #31

          Hi,
          I've change this line with "!=" and it work. but i dont undestand why....?

          
          void incomingMessage(const MyMessage &message) {
              if (message.type!=V_TEXT) {                         // Text messages only
          
          AWIA 1 Reply Last reply
          0
          • Marc-Olivier ChaubetM Marc-Olivier Chaubet

            Hi,
            I've change this line with "!=" and it work. but i dont undestand why....?

            
            void incomingMessage(const MyMessage &message) {
                if (message.type!=V_TEXT) {                         // Text messages only
            
            AWIA Offline
            AWIA Offline
            AWI
            Hero Member
            wrote on last edited by
            #32

            @Marc-Olivier-Chaubet A closer look at what happens on you seria outputl:
            0_1476200021647_upload-770a6b42-dfb9-43dc-b647-0957e02cc9b8

            • on the first 2 lines there are 2 requests for values from your controller. The "t=47' indicates that the type is V_TEXT.
            • on the the third line you receive a value with payload "test". however the 't=16' indicates that this is a V_TRIPPED value. (see Serial Protocol).

            So there is something completely wrong. What is your controller and does it show the right types of sensors?

            1 Reply Last reply
            0
            • Q Qu3Uk

              @NiklasO

              Here is it.

              // Enable debug prints to serial monitor
              //#define MY_DEBUG
              
              //#define MY_NODE_ID 200
              #define MY_SENSOR_ID 1
              
              // Enable and select radio type attached
              #define MY_RADIO_NRF24
              //#define MY_RADIO_RFM69
              
              // Enable repeater functionality for this node
              #define MY_REPEATER_FEATURE
              
              // LCD includes
              #include <Wire.h> 
              #include <LiquidCrystal_I2C.h>
              
              // MYS includes
              #include <SPI.h>
              #include <MySensors.h>
              
              #define LCD_ON 1  // GPIO value to write to turn on attached relay
              #define LCD_OFF 0 // GPIO value to write to turn off attached relay
              
              LiquidCrystal_I2C lcd(0x3f, 20, 4); //0x3f is the LCD address.
              String LINE_BLANK = "                    ";
              
              void before() {
              }
              
              void setup() {
                // Set off  LCD module
                lcd.begin (); 
                lcd.backlight();
              
                lcd.setCursor(0, 0); //
                lcd.print("Ready!"); // We expect the controller to remove this from display.
              }
              
              void presentation()
              {
                // Send the sketch version information to the gateway and Controller
                sendSketchInfo("LCD Display", "1.0");
              
                present(MY_SENSOR_ID, S_INFO);
              }
              
              
              void loop()
              {
                // extra processing if required.
              }
              
              void receive(const MyMessage &message) {
                // We only expect one type of message from controller. But we better check anyway.
                if (message.type == V_STATUS) {
                  // Use V_STATUS to turn on/off the LCD display
                  // if supported by LCD.
                }
              
                // temp string, probably don't need this.
                if (message.type == V_VAR1) {
                  writeScreen(0, message.data);
                }
              
                if (message.type == V_VAR2) {
                  writeScreen(1, message.data);
                }
              
                if (message.type == V_VAR3) {
                  writeScreen(2, message.data);
                }
              
                if (message.type == V_VAR4) {
                  writeScreen(3, message.data);
                }
              }
              
              void writeScreen(int line, String text)
              {
                // Trim whitespace from incoming text.
                text.trim();
              
                // Remove anything over 20 char in text.
                if(text.length() > 19)
                {
                    text.remove(20);
                }
                
                // Clear the line
                lcd.setCursor(0, line);
                lcd.print(LINE_BLANK);
              
                // Set Line
                lcd.setCursor(0, line);
                lcd.print(text);
              }
              
              user1306U Offline
              user1306U Offline
              user1306
              wrote on last edited by
              #33

              @Qu3Uk

              thank you very much for sharing your code.
              sorry this might be simple but i'm not sure how do you send text to the display? How do you update V_VAR1 in domoticz?

              thanks

              AWIA 1 Reply Last reply
              0
              • NiklasON Offline
                NiklasON Offline
                NiklasO
                wrote on last edited by NiklasO
                #34

                This is my test code. Not optimized, just testing. I have just started to play with arduino (got my first ever this month) so I can't say I know what I am doing. ;) Made som changes in the code below, not tested yet. It compiles, guess that's good. ;)

                I have commented out stuff related to line1 because that is always showing the time and date, in code, from GW/controller. Enable if you want to control all 4 lines from Domoticz.

                Update display by using the domoticz api:
                json.htm?type=command&param=udevice&idx=XXXX&nvalue=0&svalue=Banana
                Replace XXXX with the IDX for each of the 3 lines. You'll see it when adding the 3 text devices in Domoticz. Then use the Event-system in Domoticz to add Lua-script to update the display as example in this thread.

                //Credits: https://forum.mysensors.org/topic/1957/lcd-clock-and-text-sensor-node-with-new-v_text
                
                //Soft signing.
                //#define MY_SIGNING_SOFT
                //#define MY_SIGNING_REQUEST_SIGNATURES
                //#define MY_SIGNING_SOFT_RANDOMSEED_PIN 7
                
                #define MY_RADIO_NRF24
                #define MY_REPEATER_FEATURE
                #define MY_DEBUG
                
                #include <TimeLib.h>
                #include <Wire.h>
                #include <LiquidCrystal_I2C.h>
                #include <SPI.h>
                #include <MySensors.h>
                
                //char lastLCD1[21] = "Line1"; //Line 1 always showing current time
                char lastLCD2[21] = "Line2";
                char lastLCD3[21] = "Line3";
                char lastLCD4[21] = "Line4";
                
                //20 whitespace characters used to clear your LCD line before printing to it.
                //Change to fit your LCD. Don't forget to change number of chars in the writeScreen function if needed.
                String LINE_BLANK = "                    ";
                
                boolean timeReceived = false ;
                unsigned long lastUpdate = 0, lastRequest = 0, lastDisplay = 0;
                
                //const byte LCD1_CHILD = 1;                          // Child ID for LCD line 1
                const byte LCD2_CHILD = 2;                          // Child ID for LCD line 2
                const byte LCD3_CHILD = 3;                          // Child ID for LCD line 3
                const byte LCD4_CHILD = 4;                          // Child ID for LCD line 4
                
                MyMessage textMsg(0, V_TEXT);
                
                // 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(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
                
                void before() {
                  Wire.begin();                                       // I2C.
                  lcd.begin(20, 4);                                   // LCD with 20 chars, 4 lines.
                  lcd.setBacklight(HIGH);                             // Make sure backlight is on.
                  writeScreen(0, "Waiting for GW...");                // Print initial text before contact with GW.                 
                }
                
                void setup(void)
                {
                  Serial.begin(115200);                               // Start serial.
                  requestTime();                                      // Request time from controller.
                }
                
                void presentation()  {
                
                  sendSketchInfo("Domoticz LCD", "1.0");                    // Send the sketch version information to the gateway and Controller
                
                  //present(LCD1_CHILD, S_INFO, "LCD_line1");
                  //wait(500);
                  present(LCD2_CHILD, S_INFO, "LCD_line2");
                  wait(500);
                  present(LCD3_CHILD, S_INFO, "LCD_line3");
                  wait(500);
                  present(LCD4_CHILD, S_INFO, "LCD_line4");
                  wait(500);
                  //send(textMsg.setSensor(LCD1_CHILD).set("-"));      // initialize the V_TEXT at controller for sensor to none (trick for Domoticz)
                  send(textMsg.setSensor(LCD2_CHILD).set("-"));
                  send(textMsg.setSensor(LCD3_CHILD).set("-"));
                  send(textMsg.setSensor(LCD4_CHILD).set("-"));
                }
                
                void loop()     {
                  // timer for loop delays
                  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 > 10 * 1000)) ||
                      (now - lastRequest > 3600000UL)) {              // request update from GW every hour to keep in sync
                    // Request time from controller.
                    Serial.println("Requesting time...");
                    timeReceived = false;
                    requestTime();
                    lastRequest = now;
                  }
                
                  // Update sensors every 5 seconds
                  if (now - lastDisplay > 5000) {
                    lastDisplay = now;
                    //request(LCD1_CHILD, V_TEXT, 0);                  // request new values from controller
                    request(LCD2_CHILD, V_TEXT, 0);                  // request new values from controller
                    request(LCD3_CHILD, V_TEXT, 0);                  // request new values from controller
                    request(LCD4_CHILD, V_TEXT, 0);                  // request new values from controller
                  }
                
                  // Update LCD time every second
                  if (now - lastUpdate > 1000) {
                    LCD_time();
                    lastUpdate = now;
                  }
                }
                
                // This is called when a message is received
                void receive(const MyMessage &message) {
                  if (message.type == V_TEXT) {                       // Text messages only
                    Serial.print("Message: "); Serial.print(message.sensor); Serial.print(", Message: "); Serial.println(message.getString());     // Write some debug info
                    //if (message.sensor == LCD1_CHILD) {
                    //  writeScreen(0, message.data);
                    //}
                
                // Don't forget to change "if" to "else if" when controlling all 4 lines:
                    if (message.sensor == LCD2_CHILD) {
                      writeScreen(1, message.data);
                    }
                    else if (message.sensor == LCD3_CHILD) {
                      writeScreen(2, message.data);
                    }
                    else if (message.sensor == LCD4_CHILD) {
                      writeScreen(3, message.data);
                    }
                  }
                }
                
                void receiveTime(unsigned long ts) {
                  setTime(ts);
                  timeReceived = true;
                }
                
                void LCD_time(void) {
                  lcd.setCursor(0, 0);
                  if (timeReceived) {
                    lcd.print(year());
                    lcd.print("-");
                    printDigits(month());
                    lcd.print("-");
                    printDigits(day());
                    lcd.print("     ");
                    printDigits(hour());
                    lcd.print(":");
                    printDigits(minute());
                  } else {
                    writeScreen(0, "Waiting for time...");
                  }
                }
                
                void printDigits(int digits) {
                //add leading 0 if digit = 0-9
                  if (digits < 10)
                    lcd.print('0');
                  lcd.print(digits);
                }
                
                void writeScreen(int line, String text)
                {
                  // Remove anything over 20 char in text.
                  if (text.length() > 19)
                  {
                    text.remove(20);
                  }
                
                  // Clear the line
                  lcd.setCursor(0, line);
                  lcd.print(LINE_BLANK);
                
                  // Set Line
                  lcd.setCursor(0, line);
                  lcd.print(text);
                }
                
                1 Reply Last reply
                1
                • user1306U user1306

                  @Qu3Uk

                  thank you very much for sharing your code.
                  sorry this might be simple but i'm not sure how do you send text to the display? How do you update V_VAR1 in domoticz?

                  thanks

                  AWIA Offline
                  AWIA Offline
                  AWI
                  Hero Member
                  wrote on last edited by
                  #35

                  @user1306 V_VAR1 in Domoticz can not be updated or changed in Domotics (Blockly/ Lua/ Json, etc.). It's can only be used to store and retrieve values from MySensors. You should use V_TEXT as in the original example.

                  1 Reply Last reply
                  0
                  • user1306U Offline
                    user1306U Offline
                    user1306
                    wrote on last edited by
                    #36

                    thanks guy for the help,
                    what i'm trying to do, is send text to the display (16x2) using both lines (dont really need the time on top), and attach a 4 button keypad on it. then have these buttons sends commands (on.off) to Domoticz which will trigger Event and send that data/text back to the display.
                    if i manage to figure it out i'll post my code.

                    1 Reply Last reply
                    0
                    • AndurilA Offline
                      AndurilA Offline
                      Anduril
                      wrote on last edited by
                      #37

                      Is there a limitation in text length? I plan to use a bigger display and want to maybe send strings with 30+ chars. Is it impossible (maybe then split this into two strings) or is it internally seperated in 2 messages (as nrf-payload is 32 byte - 7 byte MySensors-header)?

                      AWIA 1 Reply Last reply
                      0
                      • AndurilA Anduril

                        Is there a limitation in text length? I plan to use a bigger display and want to maybe send strings with 30+ chars. Is it impossible (maybe then split this into two strings) or is it internally seperated in 2 messages (as nrf-payload is 32 byte - 7 byte MySensors-header)?

                        AWIA Offline
                        AWIA Offline
                        AWI
                        Hero Member
                        wrote on last edited by
                        #38

                        @Anduril The text length is limited to the maximum payload size. So I guess you need to do some tweaking ;)

                        sellierS 1 Reply Last reply
                        0
                        • AWIA AWI

                          @Anduril The text length is limited to the maximum payload size. So I guess you need to do some tweaking ;)

                          sellierS Offline
                          sellierS Offline
                          sellier
                          wrote on last edited by
                          #39

                          Re: LCD Clock and Text sensor node with new V_TEXT
                          Hello ,
                          I have done the same exercise also with the LCD 4*20 and use the same program. It is great.
                          It works but only I have the first line with the date.
                          The lines 2,3,4 are empty.
                          In Domoticz my V_TEXT are created and filled in.
                          It seems that I can not read correctly the information LCD_line2, LCD_line3,LCD_line4
                          0_1510218378199_Screen Shot 2017-11-09 at 9.56.27 AM.png
                          0_1510218403691_Screen Shot 2017-11-09 at 9.55.50 AM.png
                          we can see that on the line READ , the text is V_TEXT but nothing is received.
                          Why ?
                          0_1510218424508_Screen Shot 2017-11-09 at 9.50.27 AM.png

                          Thanks

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


                          11

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