Relais sketch, auto switch on again after x seconds
-
Hello everyone,
I just build a simple single relais , using the sketch from the examples. ( see also below) . Is it possible to change it a bit , so the relais when switched off , switches on again automatically after for example 5 seconds?
Thanks,
Cor// Example sketch showing how to control physical relays. // This example will remember relay state even after power failure. #include <MySensor.h> #include <SPI.h> #define RELAY_1 3 // Arduino Digital I/O pin number for first relay (second on pin+1 etc) #define NUMBER_OF_RELAYS 1 // Total number of attached relays #define RELAY_ON 1 // GPIO value to write to turn on attached relay #define RELAY_OFF 0 // GPIO value to write to turn off attached relay MySensor gw; void setup() { // Initialize library and add callback for incoming messages gw.begin(incomingMessage, AUTO, true); // Send the sketch version information to the gateway and Controller gw.sendSketchInfo("Relay", "1.0"); // Fetch relay status for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS;sensor++, pin++) { // Register all sensors to gw (they will be created as child devices) gw.present(sensor, S_LIGHT); // Then set relay pins in output mode pinMode(pin, OUTPUT); // Set relay to last known state (using eeprom storage) digitalWrite(pin, gw.loadState(sensor)?RELAY_ON:RELAY_OFF); } } void loop() { // Alway process incoming messages whenever possible gw.process(); } void incomingMessage(const MyMessage &message) { // We only expect one type of message from controller. But we better check anyway. if (message.type==V_LIGHT) { // Change relay state digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF); // Store state in eeprom gw.saveState(message.sensor, message.getBool()); // Write some debug info Serial.print("Incoming change for sensor:"); Serial.print(message.sensor); Serial.print(", New status: "); Serial.println(message.getBool()); } }```
-
Hi Cor,
this ain't no big deal, you may just study my example in https://github.com/rejoe2/MySensors_Small/blob/master/MyS103/MyS103.ino.
You have to store the sitch off-time, check in loop(), if your intended off-time has past and then switch on again, ideally informing your controller about the node having done so.
Btw: your sketch is for MySensors Version 1.x. You may have to make additional changes to transfer my code back.
-
The solution in https://forum.mysensors.org/post/58102 could be good as a base. It waits for 0.5 seconds.
-
No big deal
I tried with the code from mfalkvidd , change what I though looked good.
But I get the error in compiling:
RelayActuator.ino: In function 'void setup()':
RelayActuator.ino:28:30: error: 'RELAY_Off' was not declared in this scope
RelayActuator.ino:30:10: error: 'wait' was not declared in this scope
RelayActuator.ino:31:19: error: 'RELAY_On' was not declared in this scope
RelayActuator.ino: In function 'void incomingMessage(const MyMessage&)':
RelayActuator.ino:47:27: error: 'RELAY_Off' was not declared in this scope
RelayActuator.ino:49:9: error: 'wait' was not declared in this scope
RelayActuator.ino:50:40: error: 'RELAY_On' was not declared in this scope
Error compilingThis is what I did:
I changed exactly what was in that code , but since I didn't have "loadState" but I did have "gw.loadState" I changed it in "gw.loadState" but also "Loadstate"gives an error compling.// Example sketch showing how to control physical relays. // This example will remember relay state even after power failure. #include <MySensor.h> #include <SPI.h> #define RELAY_1 3 // Arduino Digital I/O pin number for first relay (second on pin+1 etc) #define NUMBER_OF_RELAYS 1 // Total number of attached relays #define RELAY_ON 1 // GPIO value to write to turn on attached relay #define RELAY_OFF 0 // GPIO value to write to turn off attached relay MySensor gw; void setup() { // Initialize library and add callback for incoming messages gw.begin(incomingMessage, AUTO, true); // Send the sketch version information to the gateway and Controller gw.sendSketchInfo("Relay", "1.0"); // Fetch relay status for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS;sensor++, pin++) { // Register all sensors to gw (they will be created as child devices) gw.present(sensor, S_LIGHT); // Then set relay pins in output mode pinMode(pin, OUTPUT); // Set relay to last known state (using eeprom storage) if (gw.loadState(sensor) == RELAY_Off) { digitalWrite(pin, RELAY_Off); wait(5000); digitalWrite(pin, RELAY_On); } } } void loop() { // Alway process incoming messages whenever possible gw.process(); } void incomingMessage(const MyMessage &message) { // We only expect one type of message from controller. But we better check anyway. if (message.type==V_LIGHT) { // Change relay state if (message.getBool() == RELAY_Off) { digitalWrite(message.sensor-1+RELAY_1, RELAY_Off); wait(500); digitalWrite(message.sensor-1+RELAY_1, RELAY_On); } // Store state in eeprom gw.saveState(message.sensor, message.getBool()); // Write some debug info Serial.print("Incoming change for sensor:"); Serial.print(message.sensor); Serial.print(", New status: "); Serial.println(message.getBool()); } }
-
@Corvl What version of MySensors are you using. the sketch you have is for the earlier 1.xx version. If possible you should move to MySensors version 2
-
@ Boots33: both my vera's are running with version 1.5 . Can I just update , will the sketches wich are now running still work?
-
@Corvl yes you should be able to upgrade.byt you have top upgrade the gateway aswel.
It is quicker to solve the compile errors:
Do note that C in case sensitive so
- change RELAY_Off to RELAY_OFF on line 28 and 47
- change RELAY_On to RELAY_ON on line 31 and 50
Since you use the old library you also should change wait to gw.wait on line 30 and 49
That should fix the compiler error.
I think the second gw.wait should also be 5000 iso 500 if you want to wait 5 seconds also.As a general comment, when programming C it is general practice to use indents for beter readability of the code so please add some whitespace in front of the added lines
-
Thanks,
I am thinking of upgrading to 2.x , not sure yet if that is wise. Just made another topic for some questions.
Thanks so far,
Cor
-
@ BartE , thanks a lot , I changed all the _Off to _OFF and the same with the On , gw. wait as well. also the 500 to 5000
Working perfectly !
Many thanks
I haven't had a definite anwer yet if libabry 2.x works on vera , I have only read about problems . For the moment I stick to 1.5
edit : one small thing I just noticed , when I switch via the vera Gui the relais to off , it nicely goes back to on after 5 seconds , but it doesn't report back to vera that it is again in an on state.
is there still something wrong with the code?
Again many thanks,
CorFor future reference:
// Example sketch showing how to control physical relays. // This example will remember relay state even after power failure. #include <MySensor.h> #include <SPI.h> #define RELAY_1 3 // Arduino Digital I/O pin number for first relay (second on pin+1 etc) #define NUMBER_OF_RELAYS 1 // Total number of attached relays #define RELAY_ON 1 // GPIO value to write to turn on attached relay #define RELAY_OFF 0 // GPIO value to write to turn off attached relay MySensor gw; void setup() { // Initialize library and add callback for incoming messages gw.begin(incomingMessage, AUTO, true); // Send the sketch version information to the gateway and Controller gw.sendSketchInfo("Relay", "1.0"); // Fetch relay status for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS;sensor++, pin++) { // Register all sensors to gw (they will be created as child devices) gw.present(sensor, S_LIGHT); // Then set relay pins in output mode pinMode(pin, OUTPUT); // Set relay to last known state (using eeprom storage) if (gw.loadState(sensor) == RELAY_OFF) { digitalWrite(pin, RELAY_OFF); gw.wait(5000); digitalWrite(pin, RELAY_ON); } } } void loop() { // Alway process incoming messages whenever possible gw.process(); } void incomingMessage(const MyMessage &message) { // We only expect one type of message from controller. But we better check anyway. if (message.type==V_LIGHT) { // Change relay state if (message.getBool() == RELAY_OFF) { digitalWrite(message.sensor-1+RELAY_1, RELAY_OFF); gw.wait(5000); digitalWrite(message.sensor-1+RELAY_1, RELAY_ON); } // Store state in eeprom gw.saveState(message.sensor, message.getBool()); // Write some debug info Serial.print("Incoming change for sensor:"); Serial.print(message.sensor); Serial.print(", New status: "); Serial.println(message.getBool()); } }```