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. Controllers
  3. pimatic
  4. send V_TEXT to LCD1602 Display

send V_TEXT to LCD1602 Display

Scheduled Pinned Locked Moved pimatic
1 Posts 1 Posters 3.4k Views 1 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.
  • ? Offline
    ? Offline
    A Former User
    wrote on last edited by
    #1

    hi,

    i woud to use this sketch to show messages fron my pimatic controller on a 1602 Display.
    This sketch use the V_TEXT variabel to show messages.

    How i can use V_TEXT in pimatic to push messages to the display?

    //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_DEBUG
    
    #define MY_NODE_ID 3
    
    #include <TimeLib.h>
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    #include <SPI.h>
    #include <MySensors.h>
    
    char lastLCD1[16] = "Line1"; //Line 1 always showing current time
    char lastLCD2[16] = "Line2";
    
    //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
    
    
    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(16, 2);                                   // 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);
      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("-"));
    }
    
    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
      }
    
      // 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:
        else if (message.sensor == LCD2_CHILD) {
          writeScreen(1, message.data);
        }
      }
    }
    
    void receiveTime(unsigned long ts) {
      setTime(ts);
      timeReceived = true;
    }
    
    void LCD_time(void) {
      lcd.setCursor(0, 0);
      if (timeReceived) {
        lcd.print(day());
        lcd.print(".");
        printDigits(month());
        lcd.print(".");
        printDigits(year());
        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
    0

    Hello! It looks like you're interested in this conversation, but you don't have an account yet.

    Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

    With your input, this post could be even better 💗

    Register Login
    Reply
    • Reply as topic
    Log in to reply
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes


    10

    Online

    12.0k

    Users

    11.2k

    Topics

    113.4k

    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