LCD Clock and Text sensor node with new V_TEXT
-
@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
-
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
@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).
-
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 -
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@Marc-Olivier-Chaubet A closer look at what happens on you seria outputl:
- 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?
-
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); }
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