Multi Button Relay switch
-
Hi
Is is possible to attached 4 relays to a node and also control each with a button?
-
Hi
Is is possible to attached 4 relays to a node and also control each with a button?
-
hek
Do you have an example sketch, I am a newby and would not have any idea how to alter the sketch to include buttons and move the relay pins
-
No sorry, I don't have any example that matches your needs exactly.
Best way to learn (I hope that is what you ultimately want?) is to use at the two relay examples provided and try to modify them.
If you have any specific question about the code don't hesitate to ask.
-
hek
Do you have an example sketch, I am a newby and would not have any idea how to alter the sketch to include buttons and move the relay pins
@Terence-Faul said:
Do you have an example sketch, I am a newby and would not have any idea how to alter the sketch to include buttons and move the relay pins
try this (untested but compiles)
#include <MySensor.h> #include <SPI.h> #include <Bounce2.h> // MySensor gw; const int relayPin[] = {7, 8, A0, A1}; const int buttonPin[sizeof(relayPin) / sizeof(relayPin[0])] = {3, 4, 5, 6}; byte oldValue[sizeof(relayPin) / sizeof(relayPin[0])]; boolean relayState[sizeof(relayPin) / sizeof(relayPin[0])]; Bounce debouncer[sizeof(relayPin) / sizeof(relayPin[0])]; MyMessage msg[sizeof(relayPin) / sizeof(relayPin[0])];//(sensor,type); void setup() { Serial.begin(115200); gw.begin(incomingMessage, AUTO, false); for (int i = 0; i < sizeof(relayPin) / sizeof(relayPin[0]); i++) { msg[i].sensor = i; msg[i].type = V_LIGHT; debouncer[i] = Bounce(); debouncer[i].attach(buttonPin[i]); debouncer[i].interval(5); pinMode(buttonPin[i], INPUT_PULLUP); digitalWrite(relayPin[i], LOW); pinMode(relayPin[i], OUTPUT); gw.present(relayPin[i], S_LIGHT); delay(250); } //retreive from EEPROM last states for (int i = 0; i < sizeof(relayPin) / sizeof(relayPin[0]); i++) { relayState[i] = gw.loadState(i); digitalWrite(relayPin[i], relayState[i]? HIGH : LOW); gw.send(msg[i].set(relayState[i]? true : false), true); delay(250); } } // void loop() { gw.process(); for (byte i = 0; i < sizeof(relayPin) / sizeof(relayPin[0]); i++) { debouncer[i].update(); byte value = debouncer[i].read(); if (value != oldValue[i] && value == 0) { relayState[i] = !relayState[i]; digitalWrite(relayPin[i], relayState[i]); gw.send(msg[i].set(relayState[i]? true : false), true); } oldValue[i] = value; } } // void incomingMessage(const MyMessage &message) { if (message.isAck()) { Serial.println(F("This is an ack from gateway")); } for (byte i = 0; i< sizeof(relayPin) / sizeof(relayPin[0]); i++) { if (message.sensor == i) { if (message.type == V_LIGHT) { relayState[i] = message.getBool(); digitalWrite(relayPin[i], relayState[i]); gw.saveState(relayPin[i], relayState[i]); } } } } -
// Example sketch för a "light switch" where you can control light or something // else from both vera and a local physical button (connected between digital // pin 3 and GND). // This node also works as a repeader for other nodes #include <MySensor.h> #include <SPI.h> #include <Bounce2.h> #define RELAY_PIN 4 // Arduino Digital I/O pin number for relay #define BUTTON_PIN 3 // Arduino Digital I/O pin number for button #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; MySensor gw; MyMessage msg(CHILD_ID,V_LIGHT); void setup() { gw.begin(incomingMessage, AUTO, true); // Send the sketch version information to the gateway and Controller gw.sendSketchInfo("Relay & Button", "1.0"); // Setup the button pinMode(BUTTON_PIN,INPUT); // Activate internal pull-up digitalWrite(BUTTON_PIN,HIGH); // After setting up the button, setup debouncer debouncer.attach(BUTTON_PIN); debouncer.interval(5); // Register all sensors to gw (they will be created as child devices) gw.present(CHILD_ID, 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); // Set relay to last known state (using eeprom storage) state = gw.loadState(CHILD_ID); digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF); } /* * Example on how to asynchronously check for new messages from gw */ void loop() { gw.process(); debouncer.update(); // Get the update value int value = debouncer.read(); if (value != oldValue && value==0) { gw.send(msg.set(state?false:true), true); // Send new state and request ack back } oldValue = value; } 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) { // Change relay state state = message.getBool(); digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF); // Store state in eeprom gw.saveState(CHILD_ID, state); // Write some debug info Serial.print("Incoming change for sensor:"); Serial.print(message.sensor); Serial.print(", New status: "); Serial.println(message.getBool()); } } -
// Example sketch för a "light switch" where you can control light or something // else from both vera and a local physical button (connected between digital // pin 3 and GND). // This node also works as a repeader for other nodes #include <MySensor.h> #include <SPI.h> #include <Bounce2.h> #define RELAY_PIN 4 // Arduino Digital I/O pin number for relay #define BUTTON_PIN 3 // Arduino Digital I/O pin number for button #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; MySensor gw; MyMessage msg(CHILD_ID,V_LIGHT); void setup() { gw.begin(incomingMessage, AUTO, true); // Send the sketch version information to the gateway and Controller gw.sendSketchInfo("Relay & Button", "1.0"); // Setup the button pinMode(BUTTON_PIN,INPUT); // Activate internal pull-up digitalWrite(BUTTON_PIN,HIGH); // After setting up the button, setup debouncer debouncer.attach(BUTTON_PIN); debouncer.interval(5); // Register all sensors to gw (they will be created as child devices) gw.present(CHILD_ID, 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); // Set relay to last known state (using eeprom storage) state = gw.loadState(CHILD_ID); digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF); } /* * Example on how to asynchronously check for new messages from gw */ void loop() { gw.process(); debouncer.update(); // Get the update value int value = debouncer.read(); if (value != oldValue && value==0) { gw.send(msg.set(state?false:true), true); // Send new state and request ack back } oldValue = value; } 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) { // Change relay state state = message.getBool(); digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF); // Store state in eeprom gw.saveState(CHILD_ID, state); // Write some debug info Serial.print("Incoming change for sensor:"); Serial.print(message.sensor); Serial.print(", New status: "); Serial.println(message.getBool()); } }@Terence-Faul said:
gw.sendSketchInfo("Relay & Button", "1.0");
yeah, a mistake or two ;)
#include <MySensor.h> #include <SPI.h> #include <Bounce2.h> // MySensor gw; const int relayPin[] = {7, 8, A0, A1}; const int buttonPin[sizeof(relayPin) / sizeof(relayPin[0])] = {3, 4, 5, 6}; byte oldValue[sizeof(relayPin) / sizeof(relayPin[0])]; boolean relayState[sizeof(relayPin) / sizeof(relayPin[0])]; Bounce debouncer[sizeof(relayPin) / sizeof(relayPin[0])]; MyMessage msg[sizeof(relayPin) / sizeof(relayPin[0])];//(sensor,type); void setup() { Serial.begin(115200); gw.begin(incomingMessage, AUTO, false); // // or you can try: // gw.begin(incomingMessage, <Your_Node_ID>, false); // where Your_Node_ID is a number from 1 to 254 // delay(250); gw.sendSketchInfo("MultiRelayButton", "0.9b");// <<<<<<<<<<<<<<<<<<< I forgot this, here // delay(250); for (int i = 0; i < sizeof(relayPin) / sizeof(relayPin[0]); i++) { msg[i].sensor = i; msg[i].type = V_LIGHT; debouncer[i] = Bounce(); debouncer[i].attach(buttonPin[i]); debouncer[i].interval(5); pinMode(buttonPin[i], INPUT_PULLUP); digitalWrite(relayPin[i], LOW); pinMode(relayPin[i], OUTPUT); gw.present(i, S_LIGHT); // <<<<<<<<<<<<<<<<<<<<<<< I fixed this too... delay(250); } //retreive from EEPROM last states for (int i = 0; i < sizeof(relayPin) / sizeof(relayPin[0]); i++) { relayState[i] = gw.loadState(i); digitalWrite(relayPin[i], relayState[i]? HIGH : LOW); gw.send(msg[i].set(relayState[i]? true : false), true); delay(250); } } // void loop() { gw.process(); for (byte i = 0; i < sizeof(relayPin) / sizeof(relayPin[0]); i++) { debouncer[i].update(); byte value = debouncer[i].read(); if (value != oldValue[i] && value == 0) { relayState[i] = !relayState[i]; digitalWrite(relayPin[i], relayState[i]); gw.send(msg[i].set(relayState[i]? true : false), true); } oldValue[i] = value; } } // void incomingMessage(const MyMessage &message) { if (message.isAck()) { Serial.println(F("This is an ack from gateway")); } for (byte i = 0; i< sizeof(relayPin) / sizeof(relayPin[0]); i++) { if (message.sensor == i) { if (message.type == V_LIGHT) { relayState[i] = message.getBool(); digitalWrite(relayPin[i], relayState[i]); gw.saveState(relayPin[i], relayState[i]); } } } }try and see if it fixes your issues :)
-
// Example sketch för a "light switch" where you can control light or something // else from both vera and a local physical button (connected between digital // pin 3 and GND). // This node also works as a repeader for other nodes #include <MySensor.h> #include <SPI.h> #include <Bounce2.h> #define RELAY_PIN 4 // Arduino Digital I/O pin number for relay #define BUTTON_PIN 3 // Arduino Digital I/O pin number for button #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; MySensor gw; MyMessage msg(CHILD_ID,V_LIGHT); void setup() { gw.begin(incomingMessage, AUTO, true); // Send the sketch version information to the gateway and Controller gw.sendSketchInfo("Relay & Button", "1.0"); // Setup the button pinMode(BUTTON_PIN,INPUT); // Activate internal pull-up digitalWrite(BUTTON_PIN,HIGH); // After setting up the button, setup debouncer debouncer.attach(BUTTON_PIN); debouncer.interval(5); // Register all sensors to gw (they will be created as child devices) gw.present(CHILD_ID, 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); // Set relay to last known state (using eeprom storage) state = gw.loadState(CHILD_ID); digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF); } /* * Example on how to asynchronously check for new messages from gw */ void loop() { gw.process(); debouncer.update(); // Get the update value int value = debouncer.read(); if (value != oldValue && value==0) { gw.send(msg.set(state?false:true), true); // Send new state and request ack back } oldValue = value; } 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) { // Change relay state state = message.getBool(); digitalWrite(RELAY_PIN, state?RELAY_ON:RELAY_OFF); // Store state in eeprom gw.saveState(CHILD_ID, state); // Write some debug info Serial.print("Incoming change for sensor:"); Serial.print(message.sensor); Serial.print(", New status: "); Serial.println(message.getBool()); } }#include <MySensor.h> #include <SPI.h> #include <Bounce2.h> // #define RELAY_ON 1 #define RELAY_OFF 0 MySensor gw; const int relayPin[] = {7, 8, A0, A1}; const int buttonPin[sizeof(relayPin) / sizeof(relayPin[0])] = {3, 4, 5, 6}; byte oldValue[sizeof(relayPin) / sizeof(relayPin[0])]; boolean relayState[sizeof(relayPin) / sizeof(relayPin[0])]; Bounce debouncer[sizeof(relayPin) / sizeof(relayPin[0])]; MyMessage msg[sizeof(relayPin) / sizeof(relayPin[0])];//(sensor,type); void setup() { Serial.begin(115200); gw.begin(incomingMessage, AUTO, false); // // or you can try: // gw.begin(incomingMessage, <Your_Node_ID>, false); // where Your_Node_ID is a number from 1 to 254 // delay(250); gw.sendSketchInfo("MultiRelayButton", "0.9b"); // delay(250); for (int i = 0; i < sizeof(relayPin) / sizeof(relayPin[0]); i++) { msg[i].sensor = i; msg[i].type = V_LIGHT; debouncer[i] = Bounce(); debouncer[i].attach(buttonPin[i]); debouncer[i].interval(5); pinMode(buttonPin[i], INPUT_PULLUP); digitalWrite(relayPin[i], LOW); pinMode(relayPin[i], OUTPUT); gw.present(i, S_LIGHT); delay(250); } //retreive from EEPROM last states for (int i = 0; i < sizeof(relayPin) / sizeof(relayPin[0]); i++) { relayState[i] = gw.loadState(i); digitalWrite(relayPin[i], relayState[i]? RELAY_ON : RELAY_OFF); //gw.send(msg[i].set(relayState[i]? RELAY_ON : RELAY_OFF), true); delay(250); } } // void loop() { gw.process(); for (byte i = 0; i < sizeof(relayPin) / sizeof(relayPin[0]); i++) { debouncer[i].update(); byte value = debouncer[i].read(); if (value != oldValue[i] && value == 0) { relayState[i] = !relayState[i]; //digitalWrite(relayPin[i], relayState[i]); gw.send(msg[i].set(relayState[i]? false : true), true); } oldValue[i] = value; } } // void incomingMessage(const MyMessage &message) { if (message.isAck()) { Serial.println(F("This is an ack from gateway")); } for (byte i = 0; i< sizeof(relayPin) / sizeof(relayPin[0]); i++) { if (message.sensor == i) { if (message.type == V_LIGHT) { relayState[i] = message.getBool(); digitalWrite(relayPin[i], relayState[i]? RELAY_ON : RELAY_OFF); gw.saveState(relayPin[i], relayState[i]); } } } } -
#include <MySensor.h> #include <SPI.h> #include <Bounce2.h> // #define RELAY_ON 1 #define RELAY_OFF 0 MySensor gw; const int relayPin[] = {7, 8, A0, A1}; const int buttonPin[sizeof(relayPin) / sizeof(relayPin[0])] = {3, 4, 5, 6}; byte oldValue[sizeof(relayPin) / sizeof(relayPin[0])]; boolean relayState[sizeof(relayPin) / sizeof(relayPin[0])]; Bounce debouncer[sizeof(relayPin) / sizeof(relayPin[0])]; MyMessage msg[sizeof(relayPin) / sizeof(relayPin[0])];//(sensor,type); void setup() { Serial.begin(115200); gw.begin(incomingMessage, AUTO, false); // // or you can try: // gw.begin(incomingMessage, <Your_Node_ID>, false); // where Your_Node_ID is a number from 1 to 254 // delay(250); gw.sendSketchInfo("MultiRelayButton", "0.9b"); // delay(250); for (int i = 0; i < sizeof(relayPin) / sizeof(relayPin[0]); i++) { msg[i].sensor = i; msg[i].type = V_LIGHT; debouncer[i] = Bounce(); debouncer[i].attach(buttonPin[i]); debouncer[i].interval(5); pinMode(buttonPin[i], INPUT_PULLUP); digitalWrite(relayPin[i], LOW); pinMode(relayPin[i], OUTPUT); gw.present(i, S_LIGHT); delay(250); } //retreive from EEPROM last states for (int i = 0; i < sizeof(relayPin) / sizeof(relayPin[0]); i++) { relayState[i] = gw.loadState(i); digitalWrite(relayPin[i], relayState[i]? RELAY_ON : RELAY_OFF); //gw.send(msg[i].set(relayState[i]? RELAY_ON : RELAY_OFF), true); delay(250); } } // void loop() { gw.process(); for (byte i = 0; i < sizeof(relayPin) / sizeof(relayPin[0]); i++) { debouncer[i].update(); byte value = debouncer[i].read(); if (value != oldValue[i] && value == 0) { relayState[i] = !relayState[i]; //digitalWrite(relayPin[i], relayState[i]); gw.send(msg[i].set(relayState[i]? false : true), true); } oldValue[i] = value; } } // void incomingMessage(const MyMessage &message) { if (message.isAck()) { Serial.println(F("This is an ack from gateway")); } for (byte i = 0; i< sizeof(relayPin) / sizeof(relayPin[0]); i++) { if (message.sensor == i) { if (message.type == V_LIGHT) { relayState[i] = message.getBool(); digitalWrite(relayPin[i], relayState[i]? RELAY_ON : RELAY_OFF); gw.saveState(relayPin[i], relayState[i]); } } } }This new one had the relays correct, but the buttons did not work. I compared the old with the new and below now works.
Thanks again a million for all the help
#include <MySensor.h> #include <SPI.h> #include <Bounce2.h> #define RELAY_ON 0 #define RELAY_OFF 1 // MySensor gw; const int relayPin[] = {7, 8, A0, A1}; const int buttonPin[sizeof(relayPin) / sizeof(relayPin[0])] = {3, 4, 5, 6}; byte oldValue[sizeof(relayPin) / sizeof(relayPin[0])]; boolean relayState[sizeof(relayPin) / sizeof(relayPin[0])]; Bounce debouncer[sizeof(relayPin) / sizeof(relayPin[0])]; MyMessage msg[sizeof(relayPin) / sizeof(relayPin[0])];//(sensor,type); void setup() { Serial.begin(115200); gw.begin(incomingMessage, AUTO, false); // // or you can try: // gw.begin(incomingMessage, <Your_Node_ID>, false); // where Your_Node_ID is a number from 1 to 254 // delay(250); gw.sendSketchInfo("MultiRelayButton", "0.9b");// <<<<<<<<<<<<<<<<<<< I forgot this, here // delay(250); for (int i = 0; i < sizeof(relayPin) / sizeof(relayPin[0]); i++) { msg[i].sensor = i; msg[i].type = V_LIGHT; debouncer[i] = Bounce(); debouncer[i].attach(buttonPin[i]); debouncer[i].interval(5); pinMode(buttonPin[i], INPUT_PULLUP); digitalWrite(relayPin[i], LOW); pinMode(relayPin[i], OUTPUT); gw.present(i, S_LIGHT); // <<<<<<<<<<<<<<<<<<<<<<< I fixed this too... delay(250); } //retreive from EEPROM last states for (int i = 0; i < sizeof(relayPin) / sizeof(relayPin[0]); i++) { relayState[i] = gw.loadState(i); digitalWrite(relayPin[i], relayState[i]? RELAY_ON : RELAY_OFF); gw.send(msg[i].set(relayState[i]? true : false), true); delay(250); } } // void loop() { gw.process(); for (byte i = 0; i < sizeof(relayPin) / sizeof(relayPin[0]); i++) { debouncer[i].update(); byte value = debouncer[i].read(); if (value != oldValue[i] && value == 0) { relayState[i] = !relayState[i]; digitalWrite(relayPin[i], relayState[i]); gw.send(msg[i].set(relayState[i]? true : false), true); } oldValue[i] = value; } } // void incomingMessage(const MyMessage &message) { if (message.isAck()) { Serial.println(F("This is an ack from gateway")); } for (byte i = 0; i< sizeof(relayPin) / sizeof(relayPin[0]); i++) { if (message.sensor == i) { if (message.type == V_LIGHT) { relayState[i] = message.getBool(); digitalWrite(relayPin[i], relayState[i]? RELAY_ON : RELAY_OFF); gw.saveState(relayPin[i], relayState[i]); } } } } -
This new one had the relays correct, but the buttons did not work. I compared the old with the new and below now works.
Thanks again a million for all the help
#include <MySensor.h> #include <SPI.h> #include <Bounce2.h> #define RELAY_ON 0 #define RELAY_OFF 1 // MySensor gw; const int relayPin[] = {7, 8, A0, A1}; const int buttonPin[sizeof(relayPin) / sizeof(relayPin[0])] = {3, 4, 5, 6}; byte oldValue[sizeof(relayPin) / sizeof(relayPin[0])]; boolean relayState[sizeof(relayPin) / sizeof(relayPin[0])]; Bounce debouncer[sizeof(relayPin) / sizeof(relayPin[0])]; MyMessage msg[sizeof(relayPin) / sizeof(relayPin[0])];//(sensor,type); void setup() { Serial.begin(115200); gw.begin(incomingMessage, AUTO, false); // // or you can try: // gw.begin(incomingMessage, <Your_Node_ID>, false); // where Your_Node_ID is a number from 1 to 254 // delay(250); gw.sendSketchInfo("MultiRelayButton", "0.9b");// <<<<<<<<<<<<<<<<<<< I forgot this, here // delay(250); for (int i = 0; i < sizeof(relayPin) / sizeof(relayPin[0]); i++) { msg[i].sensor = i; msg[i].type = V_LIGHT; debouncer[i] = Bounce(); debouncer[i].attach(buttonPin[i]); debouncer[i].interval(5); pinMode(buttonPin[i], INPUT_PULLUP); digitalWrite(relayPin[i], LOW); pinMode(relayPin[i], OUTPUT); gw.present(i, S_LIGHT); // <<<<<<<<<<<<<<<<<<<<<<< I fixed this too... delay(250); } //retreive from EEPROM last states for (int i = 0; i < sizeof(relayPin) / sizeof(relayPin[0]); i++) { relayState[i] = gw.loadState(i); digitalWrite(relayPin[i], relayState[i]? RELAY_ON : RELAY_OFF); gw.send(msg[i].set(relayState[i]? true : false), true); delay(250); } } // void loop() { gw.process(); for (byte i = 0; i < sizeof(relayPin) / sizeof(relayPin[0]); i++) { debouncer[i].update(); byte value = debouncer[i].read(); if (value != oldValue[i] && value == 0) { relayState[i] = !relayState[i]; digitalWrite(relayPin[i], relayState[i]); gw.send(msg[i].set(relayState[i]? true : false), true); } oldValue[i] = value; } } // void incomingMessage(const MyMessage &message) { if (message.isAck()) { Serial.println(F("This is an ack from gateway")); } for (byte i = 0; i< sizeof(relayPin) / sizeof(relayPin[0]); i++) { if (message.sensor == i) { if (message.type == V_LIGHT) { relayState[i] = message.getBool(); digitalWrite(relayPin[i], relayState[i]? RELAY_ON : RELAY_OFF); gw.saveState(relayPin[i], relayState[i]); } } } }@Terence-Faul
Only one other thing.I notice that when the sensor starts up, each of the relays turn on and then off.
This ia all good and well, however i assume in practice this would mean what ever is connected to them will turn on and off as well in the initialisation phase.
Also I assume that retrieve from EEPROM means that if the sensor loses power while a relay is on, when it powers up this relay will return to the on state?
Can you point me to to code that controls this, if these are lights and the power goes out a better option may be to have the relays all start in the off position so that the lights do not come on in the middle of the night
Is this correct?
-
Bulldog
So this is as far as I got.
Managed to get the relays to start in the off position by Changing LOW for the defined RELAY_OFF.
Commented out the EEPROM Section and now when the sensor reboots is starts with all relays in off position.
I do not know how to change the EEPROM section I am sur I need to maybe include the RELAY_OFF somewhere in that line.
#include <MySensor.h> #include <SPI.h> #include <Bounce2.h> #define RELAY_ON 0 //switch around for realy HIGH/LOW state #define RELAY_OFF 1 // MySensor gw; const int relayPin[] = {7, 8, A0, A1}; const int buttonPin[sizeof(relayPin) / sizeof(relayPin[0])] = {3, 4, 5, 6}; byte oldValue[sizeof(relayPin) / sizeof(relayPin[0])]; boolean relayState[sizeof(relayPin) / sizeof(relayPin[0])]; Bounce debouncer[sizeof(relayPin) / sizeof(relayPin[0])]; MyMessage msg[sizeof(relayPin) / sizeof(relayPin[0])];//(sensor,type); void setup() { Serial.begin(115200); gw.begin(incomingMessage, AUTO, false); // // or you can try: // gw.begin(incomingMessage, <Your_Node_ID>, false); // where Your_Node_ID is a number from 1 to 254 // delay(250); gw.sendSketchInfo("MultiRelayButton", "0.9b");// <<<<<<<<<<<<<<<<<<< I forgot this, here // delay(250); for (int i = 0; i < sizeof(relayPin) / sizeof(relayPin[0]); i++) { msg[i].sensor = i; msg[i].type = V_LIGHT; debouncer[i] = Bounce(); debouncer[i].attach(buttonPin[i]); debouncer[i].interval(5); pinMode(buttonPin[i], INPUT_PULLUP); digitalWrite(relayPin[i], RELAY_OFF); //Start State of Relays pinMode(relayPin[i], OUTPUT); gw.present(i, S_LIGHT); // <<<<<<<<<<<<<<<<<<<<<<< I fixed this too... delay(250); } //retreive from EEPROM last states // for (int i = 0; i < sizeof(relayPin) / sizeof(relayPin[0]); i++)//>>>>>>> I'm sure that this is causing all relays to turn on and off at startup // { // relayState[i] = gw.loadState(i); // digitalWrite(relayPin[i], relayState[i]? RELAY_ON:RELAY_OFF); // gw.send(msg[i].set(relayState[i]? true : false), true); // delay(250); // } // } // void loop() { gw.process(); for (byte i = 0; i < sizeof(relayPin) / sizeof(relayPin[0]); i++) { debouncer[i].update(); byte value = debouncer[i].read(); if (value != oldValue[i] && value == 0) { relayState[i] = !relayState[i]; digitalWrite(relayPin[i], relayState[i]); gw.send(msg[i].set(relayState[i]? true : false), true); } oldValue[i] = value; } } // void incomingMessage(const MyMessage &message) { if (message.isAck()) { Serial.println(F("This is an ack from gateway")); } for (byte i = 0; i< sizeof(relayPin) / sizeof(relayPin[0]); i++) { if (message.sensor == i) { if (message.type == V_LIGHT) { relayState[i] = message.getBool(); digitalWrite(relayPin[i], relayState[i]? RELAY_ON : RELAY_OFF); gw.saveState(relayPin[i], relayState[i]); } } } } -
Bulldog
So this is as far as I got.
Managed to get the relays to start in the off position by Changing LOW for the defined RELAY_OFF.
Commented out the EEPROM Section and now when the sensor reboots is starts with all relays in off position.
I do not know how to change the EEPROM section I am sur I need to maybe include the RELAY_OFF somewhere in that line.
#include <MySensor.h> #include <SPI.h> #include <Bounce2.h> #define RELAY_ON 0 //switch around for realy HIGH/LOW state #define RELAY_OFF 1 // MySensor gw; const int relayPin[] = {7, 8, A0, A1}; const int buttonPin[sizeof(relayPin) / sizeof(relayPin[0])] = {3, 4, 5, 6}; byte oldValue[sizeof(relayPin) / sizeof(relayPin[0])]; boolean relayState[sizeof(relayPin) / sizeof(relayPin[0])]; Bounce debouncer[sizeof(relayPin) / sizeof(relayPin[0])]; MyMessage msg[sizeof(relayPin) / sizeof(relayPin[0])];//(sensor,type); void setup() { Serial.begin(115200); gw.begin(incomingMessage, AUTO, false); // // or you can try: // gw.begin(incomingMessage, <Your_Node_ID>, false); // where Your_Node_ID is a number from 1 to 254 // delay(250); gw.sendSketchInfo("MultiRelayButton", "0.9b");// <<<<<<<<<<<<<<<<<<< I forgot this, here // delay(250); for (int i = 0; i < sizeof(relayPin) / sizeof(relayPin[0]); i++) { msg[i].sensor = i; msg[i].type = V_LIGHT; debouncer[i] = Bounce(); debouncer[i].attach(buttonPin[i]); debouncer[i].interval(5); pinMode(buttonPin[i], INPUT_PULLUP); digitalWrite(relayPin[i], RELAY_OFF); //Start State of Relays pinMode(relayPin[i], OUTPUT); gw.present(i, S_LIGHT); // <<<<<<<<<<<<<<<<<<<<<<< I fixed this too... delay(250); } //retreive from EEPROM last states // for (int i = 0; i < sizeof(relayPin) / sizeof(relayPin[0]); i++)//>>>>>>> I'm sure that this is causing all relays to turn on and off at startup // { // relayState[i] = gw.loadState(i); // digitalWrite(relayPin[i], relayState[i]? RELAY_ON:RELAY_OFF); // gw.send(msg[i].set(relayState[i]? true : false), true); // delay(250); // } // } // void loop() { gw.process(); for (byte i = 0; i < sizeof(relayPin) / sizeof(relayPin[0]); i++) { debouncer[i].update(); byte value = debouncer[i].read(); if (value != oldValue[i] && value == 0) { relayState[i] = !relayState[i]; digitalWrite(relayPin[i], relayState[i]); gw.send(msg[i].set(relayState[i]? true : false), true); } oldValue[i] = value; } } // void incomingMessage(const MyMessage &message) { if (message.isAck()) { Serial.println(F("This is an ack from gateway")); } for (byte i = 0; i< sizeof(relayPin) / sizeof(relayPin[0]); i++) { if (message.sensor == i) { if (message.type == V_LIGHT) { relayState[i] = message.getBool(); digitalWrite(relayPin[i], relayState[i]? RELAY_ON : RELAY_OFF); gw.saveState(relayPin[i], relayState[i]); } } } }@Terence-Faul said:
gw.saveState(relayPin[i], relayState[i]);
if you are not relying on settings saved to EEPROM to recover its state after a power cycle, you can also comment our or remove this line:
gw.saveState(relayPin[i], relayState[i]);it saves the state of the relay each time it gets changed.
glad to see you are learning and have it working just the way you like.
-
Thanks a stack, it is slow.
If I did want to restore the relay state how would I change the code?
At the moment if I leave that code in when the arduino boots it cycles each relay on and then off, instead of just restoring the previous state
-
go for SSR instead of hk mechical relay it will stop working after 10,000 clicked ... cheap brand
-
I got the same question as @Terence-Faul, How to change the code to have the Relay to restore its previous state. I tried a couple of things but can't seem to get it to work. Thanks @BulldogLowell for the script !
-
so, try to look over the example just above the one that worked for @Terence-Faul
It included saving states to EEPROM and retrieving them in setup( ).
-
How do you seperate relay power?
What is your solution to drop 220v AC to 5v DC?
-
How do you seperate relay power?
What is your solution to drop 220v AC to 5v DC?
@C.r.a.z.y. You could get a USB power adapter... see Ebay link below. On my current setup, I'm using a 2.1A+1A Dual USB 2-Ports. I use the the 1A port for the Arduino and the 2.1A port for the relays. On the relay board, you have VCC, IN1 & GND. IN1 gets connected to the Arduino, VCC to the second power supply or power port. The GND is shared between both power ports. Hope that helps!
-
@C.r.a.z.y. You could get a USB power adapter... see Ebay link below. On my current setup, I'm using a 2.1A+1A Dual USB 2-Ports. I use the the 1A port for the Arduino and the 2.1A port for the relays. On the relay board, you have VCC, IN1 & GND. IN1 gets connected to the Arduino, VCC to the second power supply or power port. The GND is shared between both power ports. Hope that helps!
I have gone through the script like 8 times with no luck at all. Are you suggesting the mistake in in the EEPROM retrieval section ?
#include <MySensor.h> #include <SPI.h> #include <Bounce2.h> #define RELAY_ON 1 //switch around for realy HIGH/LOW state #define RELAY_OFF 0 // MySensor gw; const int relayPin[] = {7, 8, A0, A1}; const int buttonPin[sizeof(relayPin) / sizeof(relayPin[0])] = {3, 4, 5, 6}; byte oldValue[sizeof(relayPin) / sizeof(relayPin[0])]; boolean relayState[sizeof(relayPin) / sizeof(relayPin[0])]; Bounce debouncer[sizeof(relayPin) / sizeof(relayPin[0])]; MyMessage msg[sizeof(relayPin) / sizeof(relayPin[0])];//(sensor,type); void setup() { Serial.begin(115200); gw.begin(incomingMessage, AUTO, true); // // or you can try: // gw.begin(incomingMessage, <Your_Node_ID>, false); // where Your_Node_ID is a number from 1 to 254 // delay(250); gw.sendSketchInfo("MultiRelayButton", "0.9b"); delay(250); for (int i = 0; i < sizeof(relayPin) / sizeof(relayPin[0]); i++) { msg[i].sensor = i; msg[i].type = V_LIGHT; debouncer[i] = Bounce(); debouncer[i].attach(buttonPin[i]); debouncer[i].interval(5); pinMode(buttonPin[i], INPUT_PULLUP); digitalWrite(relayPin[i], RELAY_OFF); //Start State of Relays pinMode(relayPin[i], OUTPUT); gw.present(i, S_LIGHT); delay(250); } //retreive from EEPROM last states for (int i = 0; i < sizeof(relayPin) / sizeof(relayPin[0]); i++)//>>>>>>> I'm sure that this is causing all relays to turn on and off at startup { relayState[i] = gw.loadState(i); digitalWrite(relayPin[i], relayState[i]? RELAY_ON:RELAY_OFF); //gw.send(msg[i].set(relayState[i]? true : false), true); delay(250); } } void loop() { gw.process(); for (byte i = 0; i < sizeof(relayPin) / sizeof(relayPin[0]); i++) { debouncer[i].update(); byte value = debouncer[i].read(); if (value != oldValue[i] && value == 0) { relayState[i] = !relayState[i]; digitalWrite(relayPin[i], relayState[i]); gw.send(msg[i].set(relayState[i]? true : false), true); } oldValue[i] = value; } } // void incomingMessage(const MyMessage &message) { if (message.isAck()) { Serial.println(F("This is an ack from gateway")); } for (byte i = 0; i< sizeof(relayPin) / sizeof(relayPin[0]); i++) { if (message.sensor == i) { if (message.type == V_LIGHT) { relayState[i] = message.getBool(); digitalWrite(relayPin[i], relayState[i]? RELAY_ON : RELAY_OFF); gw.saveState(relayPin[i], relayState[i]); } } } }``` #include <MySensor.h> #include <SPI.h> #include <Bounce2.h> #define RELAY_ON 1 //switch around for realy HIGH/LOW state #define RELAY_OFF 0 // MySensor gw; const int relayPin[] = {7, 8, A0, A1}; const int buttonPin[sizeof(relayPin) / sizeof(relayPin[0])] = {3, 4, 5, 6}; byte oldValue[sizeof(relayPin) / sizeof(relayPin[0])]; boolean relayState[sizeof(relayPin) / sizeof(relayPin[0])]; Bounce debouncer[sizeof(relayPin) / sizeof(relayPin[0])]; MyMessage msg[sizeof(relayPin) / sizeof(relayPin[0])];//(sensor,type); void setup() { Serial.begin(115200); gw.begin(incomingMessage, AUTO, true); // // or you can try: // gw.begin(incomingMessage, <Your_Node_ID>, false); // where Your_Node_ID is a number from 1 to 254 // delay(250); gw.sendSketchInfo("MultiRelayButton", "0.9b"); delay(250); for (int i = 0; i < sizeof(relayPin) / sizeof(relayPin[0]); i++) { msg[i].sensor = i; msg[i].type = V_LIGHT; debouncer[i] = Bounce(); debouncer[i].attach(buttonPin[i]); debouncer[i].interval(5); pinMode(buttonPin[i], INPUT_PULLUP); digitalWrite(relayPin[i], RELAY_OFF); //Start State of Relays pinMode(relayPin[i], OUTPUT); gw.present(i, S_LIGHT); delay(250); } //retreive from EEPROM last states for (int i = 0; i < sizeof(relayPin) / sizeof(relayPin[0]); i++)//>>>>>>> I'm sure that this is causing all relays to turn on and off at startup { relayState[i] = gw.loadState(i); digitalWrite(relayPin[i], relayState[i]? RELAY_ON:RELAY_OFF); //gw.send(msg[i].set(relayState[i]? true : false), true); delay(250); } } void loop() { gw.process(); for (byte i = 0; i < sizeof(relayPin) / sizeof(relayPin[0]); i++) { debouncer[i].update(); byte value = debouncer[i].read(); if (value != oldValue[i] && value == 0) { relayState[i] = !relayState[i]; digitalWrite(relayPin[i], relayState[i]); gw.send(msg[i].set(relayState[i]? true : false), true); } oldValue[i] = value; } } // void incomingMessage(const MyMessage &message) { if (message.isAck()) { Serial.println(F("This is an ack from gateway")); } for (byte i = 0; i< sizeof(relayPin) / sizeof(relayPin[0]); i++) { if (message.sensor == i) { if (message.type == V_LIGHT) { relayState[i] = message.getBool(); digitalWrite(relayPin[i], relayState[i]? RELAY_ON : RELAY_OFF); gw.saveState(relayPin[i], relayState[i]); } } } }