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.


  • Mod

    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 compiling

    This 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());
       } 
    }

  • Hero Member

    @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?


  • Contest Winner

    @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,
    Cor

    For 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());
       } 
    }```

Log in to reply
 

Suggested Topics

  • 4
  • 9
  • 20
  • 3
  • 15
  • 2

14
Online

11.4k
Users

11.1k
Topics

112.7k
Posts