LCD Clock and Text sensor node with new V_TEXT
-
@AWI I'm trying to register the sensor to domoticz. Here's the report in the serial monitor
send: 7-7-0-0 s=255,c=0,t=17,pt=0,l=3,sg=0,st=ok:1.5 send: 7-7-0-0 s=255,c=3,t=6,pt=1,l=1,sg=0,st=ok:0 read: 0-0-7 s=255,c=3,t=6,pt=0,l=1,sg=0:M sensor started, id=7, parent=0, distance=1 send: 7-7-0-0 s=255,c=3,t=11,pt=0,l=16,sg=0,st=ok:Domotica Monitor send: 7-7-0-0 s=255,c=3,t=12,pt=0,l=3,sg=0,st=ok:1.0 send: 7-7-0-0 s=0,c=0,t=36,pt=0,l=10,sg=0,st=ok:Databridge send: 7-7-0-0 s=0,c=1,t=47,pt=0,l=1,sg=0,st=ok:- send: 7-7-0-0 s=255,c=3,t=1,pt=0,l=0,sg=0,st=ok:But I can't see the sensor in Domoticz - it's update to the latest stable release. I'm trying to get this to work with a Nokia 5110 LCD display. This sketch will tell me the date/time and outside and inside weather conditions. Did I miss something? Here's the sketch.
/** * Room condition display. * * This sketch is the Prototype Sketch for testing if we can combine a Nokia 5110 LCD display and MySensors. * The goal we're trying to achieve is to use the Nokia 5110 as a display for showing sensor values like: * - the current date and time (if we've some I2C pins left we'll hook up an I2C RTC) * - the current room temperature * - the current room hummidity * - the barometric pressure * - the outside temperature * - etc **/ #include <SPI.h> #include <Adafruit_GFX.h> #include <Adafruit_PCD8544.h> #include <MySensor.h> // Mysensor network #include <Time.h> #define TEXT_NODE_CHILD_ID 0 #define NODE_ID 7 // use a static nodeID for this sensor. // 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; // Software SPI (slower updates, more flexible pin options): // pin 7 - Serial clock out (SCLK) // pin 6 - Serial data out (DIN) // pin 5 - Data/Command select (D/C) // pin 4 - LCD chip select (CS) // pin 3 - LCD reset (RST) Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3); MySensor gw; // Initialize messages for sensor network MyMessage textMsg( 0, V_TEXT ); boolean timeReceived = false ; void setup() { Serial.begin( 115200 ); // initialize 5110 LCD display.begin(); // initialize MySensor communication gw.begin(incomingMessage, NODE_ID); //Send the sensor node sketch version information to the gateway gw.sendSketchInfo("Domotica Monitor", "1.0"); gw.present(TEXT_NODE_CHILD_ID, S_INFO, "Databridge"); gw.send(textMsg.setSensor(TEXT_NODE_CHILD_ID).set("-")); // Initializations gw.requestTime(receiveTime); // you can change the contrast around to adapt the display // for the best viewing! display.setContrast(50); displayDateAndTime(); } void displayDateAndTime() { display.clearDisplay(); // text display tests display.setTextSize(1); // display.setTextColor( WHITE, BLACK ); // 'inverted' text display.setTextColor( BLACK ); // 'inverted' text display.setCursor(0,0); display.println("Zo 20-09-2015"); display.setTextColor( BLACK ); // 'inverted' text display.setTextSize(2); display.setCursor(10,18); display.println("10:43"); display.display(); delay(2000); } void loop() { // do nothing yet } // This is called when a new time value was received void receiveTime(unsigned long controllerTime) { Serial.print("Time value received: "); Serial.println(controllerTime); timeReceived = true; } // This is called when a message is received void incomingMessage(const MyMessage &message) { if (message.type==V_TEXT) { // Write some debug info Serial.print("Message: "); Serial.print(message.sensor); Serial.print(", Message: "); Serial.println(message.getString()); } } -
@AWI I'm trying to register the sensor to domoticz. Here's the report in the serial monitor
send: 7-7-0-0 s=255,c=0,t=17,pt=0,l=3,sg=0,st=ok:1.5 send: 7-7-0-0 s=255,c=3,t=6,pt=1,l=1,sg=0,st=ok:0 read: 0-0-7 s=255,c=3,t=6,pt=0,l=1,sg=0:M sensor started, id=7, parent=0, distance=1 send: 7-7-0-0 s=255,c=3,t=11,pt=0,l=16,sg=0,st=ok:Domotica Monitor send: 7-7-0-0 s=255,c=3,t=12,pt=0,l=3,sg=0,st=ok:1.0 send: 7-7-0-0 s=0,c=0,t=36,pt=0,l=10,sg=0,st=ok:Databridge send: 7-7-0-0 s=0,c=1,t=47,pt=0,l=1,sg=0,st=ok:- send: 7-7-0-0 s=255,c=3,t=1,pt=0,l=0,sg=0,st=ok:But I can't see the sensor in Domoticz - it's update to the latest stable release. I'm trying to get this to work with a Nokia 5110 LCD display. This sketch will tell me the date/time and outside and inside weather conditions. Did I miss something? Here's the sketch.
/** * Room condition display. * * This sketch is the Prototype Sketch for testing if we can combine a Nokia 5110 LCD display and MySensors. * The goal we're trying to achieve is to use the Nokia 5110 as a display for showing sensor values like: * - the current date and time (if we've some I2C pins left we'll hook up an I2C RTC) * - the current room temperature * - the current room hummidity * - the barometric pressure * - the outside temperature * - etc **/ #include <SPI.h> #include <Adafruit_GFX.h> #include <Adafruit_PCD8544.h> #include <MySensor.h> // Mysensor network #include <Time.h> #define TEXT_NODE_CHILD_ID 0 #define NODE_ID 7 // use a static nodeID for this sensor. // 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; // Software SPI (slower updates, more flexible pin options): // pin 7 - Serial clock out (SCLK) // pin 6 - Serial data out (DIN) // pin 5 - Data/Command select (D/C) // pin 4 - LCD chip select (CS) // pin 3 - LCD reset (RST) Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3); MySensor gw; // Initialize messages for sensor network MyMessage textMsg( 0, V_TEXT ); boolean timeReceived = false ; void setup() { Serial.begin( 115200 ); // initialize 5110 LCD display.begin(); // initialize MySensor communication gw.begin(incomingMessage, NODE_ID); //Send the sensor node sketch version information to the gateway gw.sendSketchInfo("Domotica Monitor", "1.0"); gw.present(TEXT_NODE_CHILD_ID, S_INFO, "Databridge"); gw.send(textMsg.setSensor(TEXT_NODE_CHILD_ID).set("-")); // Initializations gw.requestTime(receiveTime); // you can change the contrast around to adapt the display // for the best viewing! display.setContrast(50); displayDateAndTime(); } void displayDateAndTime() { display.clearDisplay(); // text display tests display.setTextSize(1); // display.setTextColor( WHITE, BLACK ); // 'inverted' text display.setTextColor( BLACK ); // 'inverted' text display.setCursor(0,0); display.println("Zo 20-09-2015"); display.setTextColor( BLACK ); // 'inverted' text display.setTextSize(2); display.setCursor(10,18); display.println("10:43"); display.display(); delay(2000); } void loop() { // do nothing yet } // This is called when a new time value was received void receiveTime(unsigned long controllerTime) { Serial.print("Time value received: "); Serial.println(controllerTime); timeReceived = true; } // This is called when a message is received void incomingMessage(const MyMessage &message) { if (message.type==V_TEXT) { // Write some debug info Serial.print("Message: "); Serial.print(message.sensor); Serial.print(", Message: "); Serial.println(message.getString()); } } -
@TheoL You should use the latest Domoticz beta release. It is a very new (beta) feature. Domoticz can (at the moment) not recognize the S_INFO but will create the sensor when a V_TEXT is sent.
@AWI Thanx for your quick reply. I'm able to add the sensor node to Domoticz. When I use the JSON url I get an Update OK from Domotoicz. But I can't see an incomming message. I added gw.process() to the main loop. Do I need to update the MySensors gateway as well?
-
@AWI Thanx for your quick reply. I'm able to add the sensor node to Domoticz. When I use the JSON url I get an Update OK from Domotoicz. But I can't see an incomming message. I added gw.process() to the main loop. Do I need to update the MySensors gateway as well?
-
I've gotten it to work. But the version of Domoticz I installed was very unstable. It caused the GUI to stall. At the end I had to burn a new installation on a SD card and had to setup everything from scratch. I have no spare Pi at the moment so I have to postpone this project for a while.
It's a pitty 'cause I was really looking forward to this project.
-
this is a great project thank you.
just a quick question is there a way to be able to turn on and off the backlight with text received from domoticz?
for example if i just send "1" then the back light goes on and "0" for off.thanks
@user1306 you can do anything with the text sent but be aware that this would imply you are making your own (non standard MySensors) protocol. V_TEXT is intended only for information.
I am the 'misusing' it myself but only where there is no MySensors solution. -
@user1306 you can do anything with the text sent but be aware that this would imply you are making your own (non standard MySensors) protocol. V_TEXT is intended only for information.
I am the 'misusing' it myself but only where there is no MySensors solution. -
@AWI
thank you for the info, i'm a bit new to arduino and my sensors, so i'm not really sure how to do that.
if possible could you let me know what piece of code i need to be able to do that?thanks
@user1306 This is a part from the routine where I read three values from a V_TEXT value (renamed to V_ORIENTATION) separated by a ";". (I think V_ORIENTATION would be a good addition for MySensors ;-) in addition to V_POSITION but I haven't suggested it officially yet)
Also be aware that Domoticz only sends the V_TEXT after it has been requested. So you need to send a
request(sensor_id, V_TEXT)first .#define V_ORIENTATION V_TEXT // Own (not existing in MySensors protocol) type for orientation (payload = Pitch ; Roll ; Yaw in degrees) #define S_ORIENTATION S_INFO // Yaw = 0 (north)to 360) ; Horizontal = 0 ;if (message.type==V_ORIENTATION) { char payload[12] ; // temporary buffer strcpy(payload, message.getString()); // read and copy payload Yaw = atoi(strtok(payload, ";")); // get variables from payload (; seperated int) Pitch = atoi(strtok(NULL, ";")); Roll = atoi(strtok(NULL, ";")); attachServos(true) ; // power up servo's servoH.write(map(-constrain(Yaw, -90, 90),-90, 90, 0, 180)); // servo middle 90 deg == 0 deg Yaw servoV.write(map(Pitch, -90, 90, 0, 180)); } -
On special request of @pepov attached a piece of LUA script for Domoticz. This demonstrates how to fill V_TEXT devices from other values so that thes can be displayed on the Text sensor node.
This special example demonstrates how to fill V_TEXT with weather data from a virtual device connected to Weather Underground. Please search the Domoticz wiki for more information on this special service.
-- script to read the virtual Weatherstation (Weather Underground) service and send it to "V_TEXT" MySensors devices -- Weather Underground values are in 'WUWeer' and 'WUWind' commandArray = {} ; --Weatherstation data: sWeatherTemp, sWeatherHumidity, sWeatherUV, sWeatherPressure, sWeatherUV2 = otherdevices_svalues['WUWeer']:match("([^;]+);([^;]+);([^;]+);([^;]+);([^;]+)") ; sWeatherTemp = tonumber(sWeatherTemp); sWeatherHumidity = tonumber(sWeatherHumidity); sWeatherUV = tonumber(sWeatherUV); sWeatherPressure = tonumber(sWeatherPressure); sWeatherUV2 = tonumber(sWeatherUV2); -- print to log print("Weather station: Temperature is " .. sWeatherTemp .. " "); print("Weather station: Humidity is " .. sWeatherHumidity .. " "); print("Weather station: UV is " .. sWeatherUV .. " "); print("Weather station: Pressure is " .. sWeatherPressure .. " "); print("Weather station: UV2 is " .. sWeatherUV2 .. " "); ------------------------------------------------------------------------ --Windmeter data: sWindDirectionDegrees, sWindDirection, sWindSpeed, sWindGust, sWindTemperature, sWindFeel = otherdevices_svalues['WUWind']:match("([^;]+);([^;]+);([^;]+);([^;]+);([^;]+);([^;]+)") ; sWindDirectionDegrees = tonumber(sWindDirectionDegrees); sWindDirection = (sWindDirection); sWindSpeed = tonumber(sWindSpeed); sWindGust = tonumber(sWindGust); sWindTemperature = tonumber(sWindTemperature); sWindFeel = tonumber(sWindFeel); print("Windmeter: Winddirection (in degrees) is: " .. sWindDirectionDegrees .. " "); print("Windmeter: Winddirection is: " .. sWindDirection .. " "); print("Windmeter: Windspeed is: " .. sWindSpeed .. " "); print("Windmeter: Windgust is: " .. sWindGust .. " "); print("Windmeter: Windtemperature is: " .. sWindTemperature .. " "); print("Windmeter: Windfeel is: " .. sWindFeel .. " "); -- device numbers 725/ 873 and 872 are V_TEXT commandArray[1] = {['UpdateDevice'] = string.format ("725|0|out %4.1f\01 %2d\07 %4d\02\03 ", sWeatherTemp, sWeatherHumidity, sWeatherPressure)} commandArray[2] = {['UpdateDevice'] = string.format ("873|0|%2.1f:%3d:%4.1f", sWeatherTemp, sWeatherHumidity, sWeatherPressure)} commandArray[3] = {['UpdateDevice'] = string.format ("872|0|%3d:%4.1f:%4.1f:%4.1f:%4.1f", sWindDirectionDegrees, sWindSpeed/10 , sWindGust/10, sWindTemperature, sWindFeel)} return commandArray -
On special request of @pepov attached a piece of LUA script for Domoticz. This demonstrates how to fill V_TEXT devices from other values so that thes can be displayed on the Text sensor node.
This special example demonstrates how to fill V_TEXT with weather data from a virtual device connected to Weather Underground. Please search the Domoticz wiki for more information on this special service.
-- script to read the virtual Weatherstation (Weather Underground) service and send it to "V_TEXT" MySensors devices -- Weather Underground values are in 'WUWeer' and 'WUWind' commandArray = {} ; --Weatherstation data: sWeatherTemp, sWeatherHumidity, sWeatherUV, sWeatherPressure, sWeatherUV2 = otherdevices_svalues['WUWeer']:match("([^;]+);([^;]+);([^;]+);([^;]+);([^;]+)") ; sWeatherTemp = tonumber(sWeatherTemp); sWeatherHumidity = tonumber(sWeatherHumidity); sWeatherUV = tonumber(sWeatherUV); sWeatherPressure = tonumber(sWeatherPressure); sWeatherUV2 = tonumber(sWeatherUV2); -- print to log print("Weather station: Temperature is " .. sWeatherTemp .. " "); print("Weather station: Humidity is " .. sWeatherHumidity .. " "); print("Weather station: UV is " .. sWeatherUV .. " "); print("Weather station: Pressure is " .. sWeatherPressure .. " "); print("Weather station: UV2 is " .. sWeatherUV2 .. " "); ------------------------------------------------------------------------ --Windmeter data: sWindDirectionDegrees, sWindDirection, sWindSpeed, sWindGust, sWindTemperature, sWindFeel = otherdevices_svalues['WUWind']:match("([^;]+);([^;]+);([^;]+);([^;]+);([^;]+);([^;]+)") ; sWindDirectionDegrees = tonumber(sWindDirectionDegrees); sWindDirection = (sWindDirection); sWindSpeed = tonumber(sWindSpeed); sWindGust = tonumber(sWindGust); sWindTemperature = tonumber(sWindTemperature); sWindFeel = tonumber(sWindFeel); print("Windmeter: Winddirection (in degrees) is: " .. sWindDirectionDegrees .. " "); print("Windmeter: Winddirection is: " .. sWindDirection .. " "); print("Windmeter: Windspeed is: " .. sWindSpeed .. " "); print("Windmeter: Windgust is: " .. sWindGust .. " "); print("Windmeter: Windtemperature is: " .. sWindTemperature .. " "); print("Windmeter: Windfeel is: " .. sWindFeel .. " "); -- device numbers 725/ 873 and 872 are V_TEXT commandArray[1] = {['UpdateDevice'] = string.format ("725|0|out %4.1f\01 %2d\07 %4d\02\03 ", sWeatherTemp, sWeatherHumidity, sWeatherPressure)} commandArray[2] = {['UpdateDevice'] = string.format ("873|0|%2.1f:%3d:%4.1f", sWeatherTemp, sWeatherHumidity, sWeatherPressure)} commandArray[3] = {['UpdateDevice'] = string.format ("872|0|%3d:%4.1f:%4.1f:%4.1f:%4.1f", sWindDirectionDegrees, sWindSpeed/10 , sWindGust/10, sWindTemperature, sWindFeel)} return commandArray@AWI said:
evices from other values so that thes can be displayed on the Text sensor node.
This special example demonstrates how to fill V_TEXT with weather data from a virtual device connected to Weather Underground. Please search the Domoticz wiki for more informati
Wow Thanks AWI!!!!
-
Hi,
i try to send message but nothing change on LcdDisplay.I d'ont undestant what is wrong.
Can you help me pls.
send: 49-49-20-0 s=8,c=2,t=47,pt=0,l=0,sg=0,st=ok: send: 49-49-20-0 s=9,c=2,t=47,pt=0,l=0,sg=0,st=ok: read: 0-20-49 s=9,c=1,t=16,pt=0,l=4,sg=0:test send: 49-49-20-0 s=9,c=1,t=16,pt=0,l=4,sg=0,st=ok:test send: 49-49-20-0 s=8,c=2,t=47,pt=0,l=0,sg=0,st=ok: -
Does this work with MySensors 2.0? If someone has this running on 2.0, please share the code. :)
-
@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. -
Hi,
i try to send message but nothing change on LcdDisplay.I d'ont undestant what is wrong.
Can you help me pls.
send: 49-49-20-0 s=8,c=2,t=47,pt=0,l=0,sg=0,st=ok: send: 49-49-20-0 s=9,c=2,t=47,pt=0,l=0,sg=0,st=ok: read: 0-20-49 s=9,c=1,t=16,pt=0,l=4,sg=0:test send: 49-49-20-0 s=9,c=1,t=16,pt=0,l=4,sg=0,st=ok:test send: 49-49-20-0 s=8,c=2,t=47,pt=0,l=0,sg=0,st=ok:@Marc-Olivier-Chaubet Can you post a little more information (the sketch)?
The text seems to be arriving at the node. So first check if the information comes in on serial (Serial.print(....)).
And next: is your display working? just print something it in the local sketch. -
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); } -
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 monitorread: 0-20-49 s=9,c=1,t=16,pt=0,l=4,sg=0:testShould it be something like this
read: 0-20-49 s=9,c=1,t=16,pt=0,l=4,sg=0:Line1=testthis 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