[Solved] Communication from Gateway to Sensor node not working
-
Hello guys,
I have built temperature sensor DS18B20 using the example sketch, I also have a simple on off switch and LED on my sensor node. I am using Arduino Uno for both Gateway and sensor node.
My sensors work and show values on the MYSController. Now when I try to control LED using the MYSController, it doesn't work.
Here is the screenshot of what happens in MYSController:
I have tried with with and without payload. My code doesn't really need a payload to turn on or off the LED. It just toggles the state of an LED when it receives V_LIGHT message.
Here is my code for sensor node:
// Enable debug prints to serial monitor #define MY_DEBUG // Enable and select radio type attached #define MY_RADIO_NRF24 //#define MY_RADIO_RFM69 #include <SPI.h> #include <MySensors.h> #include <DallasTemperature.h> #include <OneWire.h> #define COMPARE_TEMP 1 // Send temperature only if changed? 1 = Yes 0 = No #define ONE_WIRE_BUS 3 // Pin where dallase sensor is connected #define MAX_ATTACHED_DS18B20 16 unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds) OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) DallasTemperature sensors(&oneWire); // Pass the oneWire reference to Dallas Temperature. float lastTemperature[MAX_ATTACHED_DS18B20]; int numSensors=0; bool receivedConfig = false; bool metric = true; // Initialize temperature message MyMessage msg(0,V_TEMP); //Initialize switch message MyMessage msg1(6, V_TRIPPED); void before() { // Startup up the OneWire library sensors.begin(); } void setup() { // requestTemperatures() will not block current thread sensors.setWaitForConversion(false); // Setup the buttons for switch pinMode(2, INPUT); // Activate internal pull-ups digitalWrite(2, HIGH); //Set LED pin to OUTPUT pinMode (4, OUTPUT); } void presentation() { // Send the sketch version information to the gateway and Controller sendSketchInfo("Temperature and switch", "1.0"); // Fetch the number of attached temperature sensors numSensors = sensors.getDeviceCount(); // Present all sensors to controller //for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) { present(0, S_TEMP); //preset the switch present(6, S_DOOR); //present LED present(7, S_LIGHT); } void loop() { // Fetch temperatures from Dallas sensors sensors.requestTemperatures(); // query conversion time and sleep until conversion completed int16_t conversionTime = sensors.millisToWaitForConversion(sensors.getResolution()); // sleep() call can be replaced by wait() call if node need to process incoming messages (or if node is repeater) sleep(conversionTime); // Read temperatures and send them to controller for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) { // Fetch and round temperature to one decimal float temperature = static_cast<float>(static_cast<int>((getConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.; // Only send data if temperature has changed and no error #if COMPARE_TEMP == 1 if (lastTemperature[i] != temperature && temperature != -127.00 && temperature != 85.00) { #else if (temperature != -127.00 && temperature != 85.00) { #endif // Send in the new temperature send(msg.setSensor(i).set(temperature,1)); // Save new temperatures for next compare lastTemperature[i]=temperature; } } //sleep(SLEEP_TIME); //Code for switch uint8_t value; static uint8_t sentValue=2; value = digitalRead(2); if (value != sentValue) { // Value has changed from last transmission, send the updated value send(msg1.set(value==HIGH ? 1 : 0)); digitalWrite(8,!(digitalRead(8))); String string = "Value changed to: "; Serial.println(string += value); sentValue = value; } // Sleep until something happens with the sensor //sleep(0,CHANGE,0); } void receive(const MyMessage &message) { Serial.println("Received command"); //Check for the message from controller if (message.type==V_LIGHT) { digitalWrite(4, !digitalRead(4)); Serial.println("LED status changed"); } }
For gateway I am using the example code without making any change. When I send command using MYSController, I can see RX LED blink on the Gateway Arduino but nothing on the sensor node serial monitor.
Serial Monitor for sensor node:
What am I doing wrong?
I will really appreciate the help.Thank You,
Vaibhav
-
Looks like the radio communication is fine!?
What kind of hardware do you use to control LED?
-
@sundberg84
I just have LED connected to the pin 4 of Arduino.
I have written code such that when receive() is executed the LED is toggled.
-
@palande.vaibhav - and when you recieve the command it doesnt turn on?
What does this mean?digitalWrite(4, !digitalRead(4));
In the relaysketch its this;
digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF);
Try HIGH/LOW on a normal led/blink sketch and see if that works.
-
@sundberg84
No it doesn't turn on. And I even don't see anything on the serial monitor for the sensor node. I think I should be able to see the READ on the serial monitor for the sensor node. But I don't get that on there.digitalWrite(4, !digitalRead(4));
This means,
digitalRead(4)
------> Read the value at pin 4.
!
-----> Toggle it, that is after reading the value, if it is 0 then make it one and if it is 1 make it 0.
digitalWrite(4,
----> Write it back to pin 4.digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF);
This line actually checks for the payload that comes with the received signal and makes RELAY_ON or RELAY_OFF decision accordingly.
So, I am doing much simpler task than relay example. I am trying to not even check what the received message says, I am just checking if I get the message or not and make LED toggle if I do get the message.
-
@palande.vaibhav
i think the answer is in the code// sleep() call can be replaced by wait() call if node need to process incoming messages (or if node is repeater) sleep(conversionTime);
Replace sleep(); by wait();
During a sleep the GW does not receives the message acknowledge and thus claims the broadcast did fail.
-
@BartE said:
@palande.vaibhav
i think the answer is in the code// sleep() call can be replaced by wait() call if node need to process incoming messages (or if node is repeater) sleep(conversionTime);
Replace sleep(); by wait();
During a sleep the GW does not receives the message acknowledge and thus claims the broadcast did fail.
This worked.
Thanks a lot for the help. I guess I need to read stuff properly.Thanks for the help.