RelayWithButtonActuator
-
I try to use Relay With Button Actuator 1.4 but I have problem. When i press button everything working well. Problem is when I restart node and want to change status form gateway, it doesn't work then. When i press button only once then i can remote from getaway.
My code:#include <MySensor.h> #include <SPI.h> #include <Bounce2.h> #define RELAY_PIN_2 8 #define RELAY_PIN 7 // Arduino Digital I/O pin number for relay #define BUTTON_PIN_2 4 #define BUTTON_PIN 3 // Arduino Digital I/O pin number for button #define CHILD_ID_2 2 #define CHILD_ID 1 // Id of the sensor child #define RELAY_ON 1 #define RELAY_OFF 0 Bounce debouncer = Bounce(); int oldValue=0; bool state; Bounce debouncer2 = Bounce(); int oldValue2=0; bool state2; MySensor gw; MyMessage msg(CHILD_ID,V_LIGHT); MyMessage msg2(CHILD_ID_2,V_LIGHT); void setup() { gw.begin(incomingMessage, AUTO, true); // Send the sketch version information to the gateway and Controller gw.sendSketchInfo("Double Relay & Button", "0.1"); // Setup the button pinMode(BUTTON_PIN,INPUT); // Activate internal pull-up digitalWrite(BUTTON_PIN,HIGH); // Setup the button pinMode(BUTTON_PIN_2,INPUT); // Activate internal pull-up digitalWrite(BUTTON_PIN_2,HIGH); // After setting up the button, setup debouncer debouncer.attach(BUTTON_PIN); debouncer.interval(5); debouncer2.attach(BUTTON_PIN_2); debouncer2.interval(5); // Register all sensors to gw (they will be created as child devices) gw.present(CHILD_ID, S_LIGHT); gw.present(CHILD_ID_2, S_LIGHT); // Make sure relays are off when starting up digitalWrite(RELAY_PIN, RELAY_OFF); // Then set relay pins in output mode pinMode(RELAY_PIN, OUTPUT); digitalWrite(RELAY_PIN_2, RELAY_OFF); // Then set relay pins in output mode pinMode(RELAY_PIN_2, OUTPUT); // Set relay to last known state (using eeprom storage) state = gw.loadState(CHILD_ID); digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF); state2 = gw.loadState(CHILD_ID_2); digitalWrite(RELAY_PIN_2, state2?RELAY_ON:RELAY_OFF); } /* * Example on how to asynchronously check for new messages from gw */ void loop() { gw.process(); debouncer.update(); debouncer2.update(); // Get the update value int value = debouncer.read(); int value2 = debouncer2.read(); if (value != oldValue && value==0) { gw.send(msg.set(state?false:true), true); // Send new state and request ack back } oldValue = value; if (value2 != oldValue2 && value2==0) { gw.send(msg2.set(state2?false:true), true); // Send new state and request ack back } oldValue2 = value2; } void incomingMessage(const MyMessage &message) { // We only expect one type of message from controller. But we better check anyway. /* if (message.isAck()) { Serial.println("This is an ack from gateway"); } */ if (message.type == V_LIGHT && message.sensor == 1 && strlen(msg.getString()) != 0) { // Change relay state state = message.getBool(); digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF); // Store state in eeprom gw.saveState(CHILD_ID, state); } else if(message.type == V_LIGHT && message.sensor == 2 && strlen(msg.getString()) != 0){ state2 = message.getBool(); digitalWrite(RELAY_PIN_2, state2?RELAY_ON:RELAY_OFF); // Store state in eeprom gw.saveState(CHILD_ID_2, state2); // Write some debug info Serial.print("Incoming change for sensor:"); Serial.print(message.sensor); Serial.print(", New status: "); Serial.println(message.getBool()); } } -
I prepare sketch with 2 x button and 2 x relays and 8 x dallas. Could some one look at if it right, because i have problem remote relays after restart node. I don't know it is problem witch sketch or server software.
Log from gataway:
12-10-2014 18:57:55: 0;0;3;0;9;send: 0-0-2-2 s=11,c=1,t=2,pt=0,l=1,st=ok:0
12-10-2014 18:57:55: 0;0;3;0;9;send: 0-0-2-2 s=11,c=1,t=2,pt=0,l=1,st=ok:1
12-10-2014 18:57:54: 0;0;3;0;9;send: 0-0-2-2 s=12,c=1,t=2,pt=0,l=1,st=ok:0
12-10-2014 18:57:54: 0;0;3;0;9;send: 0-0-2-2 s=12,c=1,t=2,pt=0,l=1,st=ok:1
12-10-2014 18:57:53: 0;0;3;0;9;send: 0-0-2-2 s=11,c=1,t=2,pt=0,l=1,st=ok:0
12-10-2014 18:57:52: 0;0;3;0;9;send: 0-0-2-2 s=11,c=1,t=2,pt=0,l=1,st=ok:1
12-10-2014 18:54:39: 0;0;3;0;9;read: 2-2-0 s=0,c=1,t=0,pt=7,l=5:22.6
12-10-2014 18:54:26: 0;0;3;0;9;send: 0-0-203-2 s=11,c=1,t=2,pt=0,l=1,st=fail:0
12-10-2014 18:54:26: 0;0;3;0;9;send: 0-0-203-2 s=12,c=1,t=2,pt=0,l=1,st=fail:0
12-10-2014 18:54:26: 0;0;3;0;9;send: 0-0-203-2 s=12,c=1,t=2,pt=0,l=1,st=fail:1
12-10-2014 18:54:25: 0;0;3;0;9;send: 0-0-203-2 s=11,c=1,t=2,pt=0,l=1,st=fail:1Code:
#include <MySensor.h> #include <SPI.h> #include <Bounce2.h> #include <DallasTemperature.h> #include <OneWire.h> #define RELAY_PIN_2 8 #define RELAY_PIN 7 // Arduino Digital I/O pin number for relay #define BUTTON_PIN_2 4 #define BUTTON_PIN 3 // Arduino Digital I/O pin number for button #define CHILD_ID_2 12 #define CHILD_ID 11 // Id of the sensor child #define RELAY_ON 1 #define RELAY_OFF 0 Bounce debouncer = Bounce(); int oldValue=0; bool state; Bounce debouncer2 = Bounce(); int oldValue2=0; bool state2; //temp #define ONE_WIRE_BUS 5 // Pin where dallase sensor is connected #define MAX_ATTACHED_DS18B20 8 unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds) unsigned long SEND_FREQUENCY = 30000; // Minimum time between send (in milliseconds). We don't wnat to spam the gateway. unsigned long lastSend; unsigned long sendTime; OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); MySensor gw; //temp float lastTemperature[MAX_ATTACHED_DS18B20]; int numSensors=0; boolean receivedConfig = false; boolean metric = true; MyMessage msg(CHILD_ID,V_LIGHT); MyMessage msg2(CHILD_ID_2,V_LIGHT); MyMessage msg3(0,V_TEMP); void setup() { // Startup OneWire sensors.begin(); gw.begin(incomingMessage, AUTO, true); // Send the sketch version information to the gateway and Controller gw.sendSketchInfo("Double Relay & Button, Temp", "0.1"); // 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++) { gw.present(i, S_TEMP); } // Setup the button pinMode(BUTTON_PIN,INPUT); // Activate internal pull-up digitalWrite(BUTTON_PIN,HIGH); // Setup the button pinMode(BUTTON_PIN_2,INPUT); // Activate internal pull-up digitalWrite(BUTTON_PIN_2,HIGH); // After setting up the button, setup debouncer debouncer.attach(BUTTON_PIN); debouncer.interval(5); debouncer2.attach(BUTTON_PIN_2); debouncer2.interval(5); // Register all sensors to gw (they will be created as child devices) gw.present(CHILD_ID, S_LIGHT); gw.present(CHILD_ID_2, S_LIGHT); // Make sure relays are off when starting up digitalWrite(RELAY_PIN, RELAY_OFF); // Then set relay pins in output mode pinMode(RELAY_PIN, OUTPUT); digitalWrite(RELAY_PIN_2, RELAY_OFF); // Then set relay pins in output mode pinMode(RELAY_PIN_2, OUTPUT); // Set relay to last known state (using eeprom storage) state = gw.loadState(CHILD_ID); digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF); state2 = gw.loadState(CHILD_ID_2); digitalWrite(RELAY_PIN_2, state2?RELAY_ON:RELAY_OFF); } /* * Example on how to asynchronously check for new messages from gw */ void loop() { gw.process(); debouncer.update(); debouncer2.update(); // Get the update value int value = debouncer.read(); int value2 = debouncer2.read(); if (value != oldValue && value==0) { gw.send(msg.set(state?false:true), true); // Send new state and request ack back } oldValue = value; if (value2 != oldValue2 && value2==0) { gw.send(msg2.set(state2?false:true), true); // Send new state and request ack back } oldValue2 = value2; unsigned long now = millis(); // Only send values at a maximum frequency or woken up from sleep if ((now - lastSend) > SEND_FREQUENCY) { Serial.print("dziala wysylanie temp"); // Fetch temperatures from Dallas sensors sensors.requestTemperatures(); // 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>((gw.getConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.; // Only send data if temperature has changed and no error if (lastTemperature[i] != temperature && temperature != -127.00) { // Send in the new temperature gw.send(msg3.setSensor(i).set(temperature,1)); lastTemperature[i]=temperature; } } lastSend=now; } } void incomingMessage(const MyMessage &message) { // We only expect one type of message from controller. But we better check anyway. /* if (message.isAck()) { Serial.println("This is an ack from gateway"); } */ if (message.type == V_LIGHT && message.sensor == 11) { // Change relay state state = message.getBool(); digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF); // Store state in eeprom gw.saveState(CHILD_ID, state); } else if(message.type == V_LIGHT && message.sensor == 12){ state2 = message.getBool(); digitalWrite(RELAY_PIN_2, state2?RELAY_ON:RELAY_OFF); // Store state in eeprom gw.saveState(CHILD_ID_2, state2); // Write some debug info Serial.print("Incoming change for sensor:"); Serial.print(message.sensor); Serial.print(", New status: "); Serial.println(message.getBool()); } } -
I have the same problem even with the one button . I can't control the light from Vera unless I have push the button after the restart . Also I noticed when i use the button to switch the light on and off from the button in Vera i can't see the status being updated . Any one experiencing the same problem ?
-
it is hard to read your code.
edit it putting it between three back ticks (```)
usually to the left of the 1 key on a USA keyboard
-
Hello All,
i got the same problem, node can send information to gateway but can't receive command from controller.
do you know how to test communication between Gateway and Nodes?
I used Serial Gateway, i connected to gateway COM port and send command like 10;2;1;0;1;1;1\n to turn on relay but my node can't turn relay on.
When i press the button from NODE, it sent the update status to gateway, -
Gateway not see ACK flag. Please fix this bag
Lib version 1.5, Node & gate = 1.5RelayButton log
send: 42-42-0-0 s=1,c=1,t=2,pt=2,l=2,sg=0,st=fail:0 Button value:0 Button value:1 send: 42-42-0-0 s=1,c=1,t=2,pt=2,l=2,sg=0,st=fail:1 Button value:0 Button value:1 send: 42-42-0-0 s=1,c=1,t=2,pt=2,l=2,sg=0,st=fail:0 Button value:0 Button value:1 send: 42-42-0-0 s=1,c=1,t=2,pt=2,l=2,sg=0,st=fail:1 Button value:0 Button value:1 send: 42-42-0-0 s=1,c=1,t=2,pt=2,l=2,sg=0,st=fail:0 Button value:0 Button value:1 send: 42-42-0-0 s=1,c=1,t=2,pt=2,l=2,sg=0,st=fail:1Gateway log
2015-08-04 18:52:07 Set: Node:42; Sensor:1; Type:1; Ack:0; Sub:2; Msg:0 2015-08-04 18:52:07 Set: Node:42; Sensor:1; Type:1; Ack:0; Sub:2; Msg:1 2015-08-04 18:52:07 Set: Node:42; Sensor:1; Type:1; Ack:0; Sub:2; Msg:0 2015-08-04 18:52:07 Set: Node:42; Sensor:1; Type:1; Ack:0; Sub:2; Msg:1 2015-08-04 18:52:08 Set: Node:42; Sensor:1; Type:1; Ack:0; Sub:2; Msg:0 2015-08-04 18:52:08 Set: Node:42; Sensor:1; Type:1; Ack:0; Sub:2; Msg:1 2015-08-04 18:52:08 Set: Node:42; Sensor:1; Type:1; Ack:0; Sub:2; Msg:0 -
Sory. Bad NRF transmitter
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