Problem with node reciving data
-
Hi I'm trying to make a scene controller with a display, witch show info from my Vera.
The sketch works fine as long im not trying to recive data from the gateway.
so the problem is how to get data from the gateway using the V_VAR1 in my case. later I would like to use all 5 variables.Below is my code:
// Simple SceneController With Dispaly #include <MySensor.h> #include <SPI.h> #include <Bounce2.h> // Display START #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> //// If using software SPI (the default case): #define OLED_MOSI 3 //D1 #define OLED_CLK 4 //D0 #define OLED_DC 5 //DC #define OLED_CS 6 //CS #define OLED_RESET 7 //res Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS); #define NUMFLAKES 10 #define XPOS 0 #define YPOS 1 #define DELTAY 2 #define LOGO16_GLCD_HEIGHT 16 #define LOGO16_GLCD_WIDTH 16 static const unsigned char PROGMEM logo16_glcd_bmp[] = { B00000000, B11000000, B00000001, B11000000, B00000001, B11000000, B00000011, B11100000, B11110011, B11100000, B11111110, B11111000, B01111110, B11111111, B00110011, B10011111, B00011111, B11111100, B00001101, B01110000, B00011011, B10100000, B00111111, B11100000, B00111111, B11110000, B01111100, B11110000, B01110000, B01110000, B00000000, B00110000 }; #if (SSD1306_LCDHEIGHT != 64) #error("Height incorrect, please fix Adafruit_SSD1306.h!"); #endif // Display END String VAR1 = "Error"; #define CHILD_ID 3 // PIN for the buttons byte buttons[] = {3, 4, 5, 6, 7, 8 }; #define NUMBUTTONS sizeof(buttons) byte pressed[NUMBUTTONS], justpressed[NUMBUTTONS], justreleased[NUMBUTTONS]; MySensor gw; Bounce debouncer[NUMBUTTONS]; int oldValue[NUMBUTTONS]; MyMessage msgOn(CHILD_ID,V_SCENE_ON); MyMessage msgOff(CHILD_ID,V_SCENE_OFF); MyMessage msg(CHILD_ID,V_VAR1); void setup() { gw.begin(incomingMessage, AUTO, true); /// Make input & enable pull-up resistors on switch pins for (short i=0; i < NUMBUTTONS; i++){ pinMode(buttons[i], INPUT); digitalWrite(buttons[i], HIGH); oldValue[i] = -1; // After setting up the button, setup debouncer debouncer[i].attach(buttons[i]); debouncer[i].interval(5); // Send the Sketch Version Information to the Gateway gw.sendSketchInfo("Display", "1.0"); // Register binary input sensor to gw (they will be created as child devices) gw.present(CHILD_ID, S_SCENE_CONTROLLER); //Display START // by default, we'll generate the high voltage from the 3.3v line internally! (neat!) display.begin(SSD1306_SWITCHCAPVCC); // init done //Display END } } // Check if digital input has changed and send in new value void loop() { // Alway process incoming messages whenever possible gw.process(); for (short i=0; i < NUMBUTTONS; i++){ debouncer[i].update(); // Get the update value int value = debouncer[i].read(); if (value != oldValue[i]) { // Send in the new value if (value==HIGH) { //gw.send(msgOff.set(i)); } else { gw.send(msgOn.set(i)); } oldValue[i] = value; } } //Display // Clear the buffer. display.clearDisplay(); display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(0,0); display.println("Test 1"); display.display(); delay(2000); // Clear the buffer. display.clearDisplay(); display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(0,0); display.println("Test"); display.setTextColor(BLACK, WHITE); // 'inverted' text display.println("2"); display.display(); delay(2000); // Clear the buffer. display.clearDisplay(); display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(0,0); display.println(VAR1); display.display(); delay(2000); // Clear the buffer. display.clearDisplay(); } void incomingMessage(const MyMessage &message) { // We only expect one type of message from controller. But we better check anyway. if (message.type==V_VAR1) { VAR1 = String(message.data); } }
Regards
-
Try avoid using the String-class if possible.
You could probably just do a
strcpy(VAR1, message.data);
or
strcpy(VAR1, message.getString())
-
I found that the problem starts when I add
gw.begin(incomingMessage, AUTO, true);
insted of:
gw.begin();
even when I try to use:
gw.begin(NULL, AUTO, true);
Its like the sketch freezes, and I cant see anything on the display or in the serial monitor.
When I go back to gw.begin() the display Again starts showing the Things in the loop ()Why can that be?
-
@Dalhoj I know it's not much of a help that I've been trying to do pretty much the same thing and using the same statements you are and countering the same problems, I'm not a programmer or from a programming background but I try and understand as much as possible about what's going on but I just can't seem to get my head around it..
Kind regards.
-
Does it still hang if you just do:
void incomingMessage(const MyMessage &message) { // We only expect one type of message from controller. But we better check anyway. if (message.type==V_VAR1) { Serial.println( message.getString()); } }
-
OK so far so good
I tryed the new code you posted @hek, but still no luck
Then I changed the gw.begin() to:
gw.begin(incomingMessage);
Then I could see things on the display
Then the question comes to how to send from vera to the node?
I tryed to do as here: Mysensor forum
I used this code:luup.call_action("urn:upnp-arduino-cc:serviceId:arduino1", "SendCommand", {radioId="10;255", variableId="VAR_1", value=88}, 260)
The problem is when I run the code the serial monitor looks like this:
sensor started, id 10 send: 10-10-0-0 s=255,c=0,t=17,pt=0,l=3,st=ok:1.4 send: 10-10-0-0 s=255,c=3,t=6,pt=1,l=1,st=ok:0 read: 0-0-10 s=255,c=3,t=6,pt=0,l=2:M send: 10-10-0-0 s=255,c=3,t=11,pt=0,l=7,st=ok:Display send: 10-10-0-0 s=255,c=3,t=12,pt=0,l=3,st=ok:1.0 send: 10-10-0-0 s=3,c=0,t=25,pt=0,l=3,st=ok:1.4 send: 10-10-0-0 s=255,c=3,t=11,pt=0,l=7,st=ok:Display send: 10-10-0-0 s=255,c=3,t=12,pt=0,l=3,st=ok:1.0 send: 10-10-0-0 s=3,c=0,t=25,pt=0,l=3,st=ok:1.4 send: 10-10-0-0 s=255,c=3,t=11,pt=0,l=7,st=ok:Display send: 10-10-0-0 s=255,c=3,t=12,pt=0,l=3,st=ok:1.0 send: 10-10-0-0 s=3,c=0,t=25,pt=0,l=3,st=ok:1.4 send: 10-10-0-0 s=255,c=3,t=11,pt=0,l=7,st=ok:Display send: 10-10-0-0 s=255,c=3,t=12,pt=0,l=3,st=ok:1.0 send: 10-10-0-0 s=3,c=0,t=25,pt=0,l=3,st=ok:1.4 send: 10-10-0-0 s=255,c=3,t=11,pt=0,l=7,st=ok:Display send: 10-10-0-0 s=255,c=3,t=12,pt=0,l=3,st=ok:1.0 send: 10-10-0-0 s=3,c=0,t=25,pt=0,l=3,st=ok:1.4 send: 10-10-0-0 s=255,c=3,t=11,pt=0,l=7,st=ok:Display send: 10-10-0-0 s=255,c=3,t=12,pt=0,l=3,st=ok:1.0 send: 10-10-0-0 s=3,c=0,t=25,pt=0,l=3,st=ok:1.4
And its like the node restarts, and not recives any data.
I also changed from the string to int, in the var1. so this the code as it is now:
// Simple SceneController With Dispaly #include <MySensor.h> #include <SPI.h> #include <Bounce2.h> // Display START #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> //// If using software SPI (the default case): #define OLED_MOSI 3 //D1 #define OLED_CLK 4 //D0 #define OLED_DC 5 //DC #define OLED_CS 6 //CS #define OLED_RESET 7 //res Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS); #define NUMFLAKES 10 #define XPOS 0 #define YPOS 1 #define DELTAY 2 #define LOGO16_GLCD_HEIGHT 16 #define LOGO16_GLCD_WIDTH 16 static const unsigned char PROGMEM logo16_glcd_bmp[] = { B00000000, B11000000, B00000001, B11000000, B00000001, B11000000, B00000011, B11100000, B11110011, B11100000, B11111110, B11111000, B01111110, B11111111, B00110011, B10011111, B00011111, B11111100, B00001101, B01110000, B00011011, B10100000, B00111111, B11100000, B00111111, B11110000, B01111100, B11110000, B01110000, B01110000, B00000000, B00110000 }; #if (SSD1306_LCDHEIGHT != 64) #error("Height incorrect, please fix Adafruit_SSD1306.h!"); #endif // Display END int VAR1 = 99; #define CHILD_ID 3 // PIN for the buttons byte buttons[] = {14, 15, 16, 17, 18, 19}; #define NUMBUTTONS sizeof(buttons) byte pressed[NUMBUTTONS], justpressed[NUMBUTTONS], justreleased[NUMBUTTONS]; MySensor gw; Bounce debouncer[NUMBUTTONS]; int oldValue[NUMBUTTONS]; MyMessage msgOn(CHILD_ID,V_SCENE_ON); MyMessage msgOff(CHILD_ID,V_SCENE_OFF); MyMessage msg(CHILD_ID,V_VAR1); void setup() { gw.begin(incomingMessage); /// Make input & enable pull-up resistors on switch pins for (short i=0; i < NUMBUTTONS; i++){ pinMode(buttons[i], INPUT); digitalWrite(buttons[i], HIGH); oldValue[i] = -1; // After setting up the button, setup debouncer debouncer[i].attach(buttons[i]); debouncer[i].interval(5); // Send the Sketch Version Information to the Gateway gw.sendSketchInfo("Display", "1.0"); // Register binary input sensor to gw (they will be created as child devices) gw.present(CHILD_ID, S_SCENE_CONTROLLER); //Display START // by default, we'll generate the high voltage from the 3.3v line internally! (neat!) display.begin(SSD1306_SWITCHCAPVCC); // init done //Display END } } // Check if digital input has changed and send in new value void loop() { // Alway process incoming messages whenever possible gw.process(); for (short i=0; i < NUMBUTTONS; i++){ debouncer[i].update(); // Get the update value int value = debouncer[i].read(); if (value != oldValue[i]) { // Send in the new value if (value==HIGH) { //gw.send(msgOff.set(i)); } else { gw.send(msgOn.set(i)); } oldValue[i] = value; } } //Display // Clear the buffer. display.clearDisplay(); display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(0,0); display.println("Test 1"); display.display(); delay(2000); // Clear the buffer. display.clearDisplay(); display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(0,0); display.println("Test"); display.setTextColor(BLACK, WHITE); // 'inverted' text display.println("2"); display.display(); delay(2000); // Clear the buffer. display.clearDisplay(); display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(0,0); display.println(VAR1); display.display(); delay(2000); // Clear the buffer. display.clearDisplay(); } void incomingMessage(const MyMessage &message) { // We only expect one type of message from controller. But we better check anyway. if (message.type==V_VAR1) { VAR1 = atoi(message.data); } } /* void incomingMessage(const MyMessage &message) { // We only expect one type of message from controller. But we better check anyway. if (message.type==V_VAR1) { Serial.println( message.getString()); } } */
-
OK
Now I have come a step further.
When I remote everything from the loop() besides the process() I can recive date from the gateway.
The question now is how to get it on the display, and change between the data, say every 2 sec.
-
How are you powering your Arduino and Radio?
-
It's on a arduino uno, and it's powerd via the usb, som my laptop.
Do you think I should try an extern power supply?
-
@Dalhoj I think that @rvendrame might be on the right path. Your laptop USB port is probably only putting out around 500mA. If the screen you are trying to display too is pulling a lot of current is could be causing the Arduino to act in a strange manor. It wouldnt hurt to try powering the Arduino from an external power supply and seeing if you get the same results.
-
... and also add a decoupling capacitor between radio's VCC and GND pin, in order to smooth the power to radio --- something from 4.7uF to 100uF may be helpful.
Suggested Topics
-
Welcome
Announcements • • hek