Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. Troubleshooting
  3. monostable button with relay

monostable button with relay

Scheduled Pinned Locked Moved Troubleshooting
3 Posts 2 Posters 1.5k Views 4 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • pihomeP Offline
    pihomeP Offline
    pihome
    wrote on last edited by
    #1

    Hi Guys,
    i m pulling my hair over this odd issue: everything seems to look ok apart from when i press button A it switch on relay connected to pin 7 where as I should switch on relay connected to pin 6 and when i press button B it switch on relay connected to 8 instead of relay connected to pin 7. What i m doing wrong here? Any help appreciated.

    following sketch came from here: https://forum.mysensors.org/topic/4847/multi-button-relay-sketch/37
    By: pepson 1 Nov 2016, 16:36 - Switch monostable:

    
    // Enable debug prints to serial monitor
    #define MY_DEBUG
    
    // Enable and select radio type attached
    #define MY_RADIO_NRF24
    //#define MY_RADIO_RFM69
    
    // Set LOW transmit power level as default, if you have an amplified NRF-module and
    // power your radio separately with a good regulator you can turn up PA level.
    // #define MY_RF24_PA_LEVEL RF24_PA_LOW
    
    #define MY_RF24_PA_LEVEL RF24_PA_MAX
    //#define MY_DEBUG_VERBOSE_RF24
    // RF channel for the sensor net, 0-127
    
    #define RF24_CHANNEL     125
    //RF24_250KBPS for 250kbs, RF24_1MBPS for 1Mbps, or RF24_2MBPS for 2Mbps
    #define RF24_DATARATE 	   RF24_250KBPS
    
    // Enabled repeater feature for this node
    //#define MY_REPEATER_FEATURE
    
    #include <SPI.h>
    #include <MySensors.h>
    #include <Bounce2.h>
    
    //PiHome Node ID
    #define MY_NODE_ID 40
    
    // Define 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
    
    // Define Sensor ID's
    #define SSR_A_ID 1   // Id of the sensor child
    #define SSR_B_ID 2   // Id of the sensor child
    #define SSR_C_ID 3   // Id of the sensor child
    #define SSR_D_ID 4   // Id of the sensor child
    
    // Define buttons and relays
    const int buttonPinA = 2;
    const int buttonPinB = 3;
    const int buttonPinC = 4;
    const int buttonPinD = 5;
    
    const int relayPinA = 6;
    const int relayPinB = 7;
    const int relayPinC = 8;
    
    // Define Variables
    int oldValueA = 0;
    int oldValueB = 0;
    int oldValueC = 0;
    int oldValueD = 0;
    
    bool stateA = false;
    bool stateB = false;
    bool stateC = false;
    bool stateD = false;
    
    int trigger = 0;
    
    Bounce debouncerA = Bounce();
    Bounce debouncerB = Bounce();
    Bounce debouncerC = Bounce();
    Bounce debouncerD = Bounce();
    
    MyMessage msgA(SSR_A_ID, V_STATUS);
    MyMessage msgB(SSR_B_ID, V_STATUS);
    MyMessage msgC(SSR_C_ID, V_STATUS);
    MyMessage msgD(SSR_D_ID, V_STATUS);
    
    void setup()
    {
    	pinMode(buttonPinA, INPUT_PULLUP); // Setup the button Activate internal pull-up
    	pinMode(buttonPinB, INPUT_PULLUP); // Setup the button Activate internal pull-up
    	pinMode(buttonPinC, INPUT_PULLUP); // Setup the button Activate internal pull-up
    	pinMode(buttonPinD, INPUT_PULLUP); // Setup the button Activate internal pull-up
    	
    	// After setting up the buttons, setup debouncer
    	debouncerA.attach(buttonPinA);
    	debouncerA.interval(5);
    	debouncerB.attach(buttonPinB);
    	debouncerB.interval(5);
    	debouncerC.attach(buttonPinC);
    	debouncerC.interval(5);
    	debouncerD.attach(buttonPinD);
    	debouncerD.interval(5);
    	
    	// Make sure relays are off when starting up
    	digitalWrite(relayPinA, RELAY_OFF);
    	digitalWrite(relayPinB, RELAY_OFF);
    	digitalWrite(relayPinC, RELAY_OFF);
    	
    	// Then set relay pins in output mode
    	pinMode(relayPinA, OUTPUT);
    	pinMode(relayPinB, OUTPUT);
    	pinMode(relayPinC, OUTPUT);
    
    }
    
    void presentation()  {
    	// Send the sketch version information to the gateway and Controller
    	//sendSketchInfo("2xRelay with monostable", "1.0");
    	
    	sendSketchInfo("Button Console", "1.3");
    	// Register all sensors to gw (they will be created as child devices)
    	present(SSR_A_ID, S_LIGHT);
    	present(SSR_B_ID, S_LIGHT);
    	present(SSR_C_ID, S_LIGHT);
    	present(SSR_D_ID, S_LIGHT);
    }
    
    //Example on how to asynchronously check for new messages from gw
    void loop()
    {
    	if (trigger == 0){
    		send(msgA.set(false)); // Send off state for relayA to ensure controller knows the switch is off
    		send(msgB.set(false)); // Send off state for relayB to ensure controller knows the switch is off
    		send(msgC.set(false)); // Send off state for relayB to ensure controller knows the switch is off
    		send(msgD.set(false)); // Send off state for relayB to ensure controller knows the switch is off
    		trigger = 1;
    	}
    	//Button One
    	debouncerA.update();
    	// Get the update value
    	int valueA = debouncerA.read();
    	if (valueA != oldValueA && valueA == 0) {
    		send(msgA.set(stateA ? false : true), true); // Send new state and request ack back
    	}
    	oldValueA = valueA;
    	
    	//Button Two
    	debouncerB.update();
    	// Get the update value
    	int valueB = debouncerB.read();
    	if (valueB != oldValueB && valueB == 0) {
    		send(msgB.set(stateB ? false : true), true); // Send new state and request ack back
    	}
    	oldValueB = valueB;
    	
    	//Button Three
    	debouncerC.update();
    	// Get the update value
    	int valueC = debouncerC.read();
    	if (valueC != oldValueC && valueC == 0) {
    		send(msgC.set(stateC ? false : true), true); // Send new state and request ack back
    	}
    	oldValueC = valueC; 
    	
    	//Button Four
    	debouncerD.update();
    	// Get the update value
    	int valueD = debouncerD.read();
    	if (valueD != oldValueD && valueD == 0) {
    		send(msgD.set(stateD ? false : true), true); // Send new state and request ack back
    	}
    	oldValueD = valueD;
    }
    
    void receive(const MyMessage &message) {
    	// We only expect one type of message from controller. But we better check anyway.
    	if (message.type == V_STATUS) {
    		switch (message.sensor) {
    		case 1:
    			stateA = message.getBool();
    			digitalWrite(message.sensor + 4, stateA ? RELAY_ON : RELAY_OFF);
    			break;
    		case 2:
    			stateB = message.getBool();
    			digitalWrite(message.sensor + 4, stateB ? RELAY_ON : RELAY_OFF);
    			break;
    		case 3:
    			stateC = message.getBool();
    			digitalWrite(message.sensor + 4, stateC ? RELAY_ON : RELAY_OFF);
    			break;
    		}
       
    /*      // Write some debug info
        Serial.print("Incoming change for sensor:");
        Serial.println(message.sensor);
        Serial.print("from node:");
        Serial.println(message.sender);
        Serial.print(", New status: ");
        Serial.println(message.getBool());
    	*/
    	}
    }
    

    PiHome - Smart Heating Control

    gahlawathomeG 1 Reply Last reply
    0
    • pihomeP pihome

      Hi Guys,
      i m pulling my hair over this odd issue: everything seems to look ok apart from when i press button A it switch on relay connected to pin 7 where as I should switch on relay connected to pin 6 and when i press button B it switch on relay connected to 8 instead of relay connected to pin 7. What i m doing wrong here? Any help appreciated.

      following sketch came from here: https://forum.mysensors.org/topic/4847/multi-button-relay-sketch/37
      By: pepson 1 Nov 2016, 16:36 - Switch monostable:

      
      // Enable debug prints to serial monitor
      #define MY_DEBUG
      
      // Enable and select radio type attached
      #define MY_RADIO_NRF24
      //#define MY_RADIO_RFM69
      
      // Set LOW transmit power level as default, if you have an amplified NRF-module and
      // power your radio separately with a good regulator you can turn up PA level.
      // #define MY_RF24_PA_LEVEL RF24_PA_LOW
      
      #define MY_RF24_PA_LEVEL RF24_PA_MAX
      //#define MY_DEBUG_VERBOSE_RF24
      // RF channel for the sensor net, 0-127
      
      #define RF24_CHANNEL     125
      //RF24_250KBPS for 250kbs, RF24_1MBPS for 1Mbps, or RF24_2MBPS for 2Mbps
      #define RF24_DATARATE 	   RF24_250KBPS
      
      // Enabled repeater feature for this node
      //#define MY_REPEATER_FEATURE
      
      #include <SPI.h>
      #include <MySensors.h>
      #include <Bounce2.h>
      
      //PiHome Node ID
      #define MY_NODE_ID 40
      
      // Define 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
      
      // Define Sensor ID's
      #define SSR_A_ID 1   // Id of the sensor child
      #define SSR_B_ID 2   // Id of the sensor child
      #define SSR_C_ID 3   // Id of the sensor child
      #define SSR_D_ID 4   // Id of the sensor child
      
      // Define buttons and relays
      const int buttonPinA = 2;
      const int buttonPinB = 3;
      const int buttonPinC = 4;
      const int buttonPinD = 5;
      
      const int relayPinA = 6;
      const int relayPinB = 7;
      const int relayPinC = 8;
      
      // Define Variables
      int oldValueA = 0;
      int oldValueB = 0;
      int oldValueC = 0;
      int oldValueD = 0;
      
      bool stateA = false;
      bool stateB = false;
      bool stateC = false;
      bool stateD = false;
      
      int trigger = 0;
      
      Bounce debouncerA = Bounce();
      Bounce debouncerB = Bounce();
      Bounce debouncerC = Bounce();
      Bounce debouncerD = Bounce();
      
      MyMessage msgA(SSR_A_ID, V_STATUS);
      MyMessage msgB(SSR_B_ID, V_STATUS);
      MyMessage msgC(SSR_C_ID, V_STATUS);
      MyMessage msgD(SSR_D_ID, V_STATUS);
      
      void setup()
      {
      	pinMode(buttonPinA, INPUT_PULLUP); // Setup the button Activate internal pull-up
      	pinMode(buttonPinB, INPUT_PULLUP); // Setup the button Activate internal pull-up
      	pinMode(buttonPinC, INPUT_PULLUP); // Setup the button Activate internal pull-up
      	pinMode(buttonPinD, INPUT_PULLUP); // Setup the button Activate internal pull-up
      	
      	// After setting up the buttons, setup debouncer
      	debouncerA.attach(buttonPinA);
      	debouncerA.interval(5);
      	debouncerB.attach(buttonPinB);
      	debouncerB.interval(5);
      	debouncerC.attach(buttonPinC);
      	debouncerC.interval(5);
      	debouncerD.attach(buttonPinD);
      	debouncerD.interval(5);
      	
      	// Make sure relays are off when starting up
      	digitalWrite(relayPinA, RELAY_OFF);
      	digitalWrite(relayPinB, RELAY_OFF);
      	digitalWrite(relayPinC, RELAY_OFF);
      	
      	// Then set relay pins in output mode
      	pinMode(relayPinA, OUTPUT);
      	pinMode(relayPinB, OUTPUT);
      	pinMode(relayPinC, OUTPUT);
      
      }
      
      void presentation()  {
      	// Send the sketch version information to the gateway and Controller
      	//sendSketchInfo("2xRelay with monostable", "1.0");
      	
      	sendSketchInfo("Button Console", "1.3");
      	// Register all sensors to gw (they will be created as child devices)
      	present(SSR_A_ID, S_LIGHT);
      	present(SSR_B_ID, S_LIGHT);
      	present(SSR_C_ID, S_LIGHT);
      	present(SSR_D_ID, S_LIGHT);
      }
      
      //Example on how to asynchronously check for new messages from gw
      void loop()
      {
      	if (trigger == 0){
      		send(msgA.set(false)); // Send off state for relayA to ensure controller knows the switch is off
      		send(msgB.set(false)); // Send off state for relayB to ensure controller knows the switch is off
      		send(msgC.set(false)); // Send off state for relayB to ensure controller knows the switch is off
      		send(msgD.set(false)); // Send off state for relayB to ensure controller knows the switch is off
      		trigger = 1;
      	}
      	//Button One
      	debouncerA.update();
      	// Get the update value
      	int valueA = debouncerA.read();
      	if (valueA != oldValueA && valueA == 0) {
      		send(msgA.set(stateA ? false : true), true); // Send new state and request ack back
      	}
      	oldValueA = valueA;
      	
      	//Button Two
      	debouncerB.update();
      	// Get the update value
      	int valueB = debouncerB.read();
      	if (valueB != oldValueB && valueB == 0) {
      		send(msgB.set(stateB ? false : true), true); // Send new state and request ack back
      	}
      	oldValueB = valueB;
      	
      	//Button Three
      	debouncerC.update();
      	// Get the update value
      	int valueC = debouncerC.read();
      	if (valueC != oldValueC && valueC == 0) {
      		send(msgC.set(stateC ? false : true), true); // Send new state and request ack back
      	}
      	oldValueC = valueC; 
      	
      	//Button Four
      	debouncerD.update();
      	// Get the update value
      	int valueD = debouncerD.read();
      	if (valueD != oldValueD && valueD == 0) {
      		send(msgD.set(stateD ? false : true), true); // Send new state and request ack back
      	}
      	oldValueD = valueD;
      }
      
      void receive(const MyMessage &message) {
      	// We only expect one type of message from controller. But we better check anyway.
      	if (message.type == V_STATUS) {
      		switch (message.sensor) {
      		case 1:
      			stateA = message.getBool();
      			digitalWrite(message.sensor + 4, stateA ? RELAY_ON : RELAY_OFF);
      			break;
      		case 2:
      			stateB = message.getBool();
      			digitalWrite(message.sensor + 4, stateB ? RELAY_ON : RELAY_OFF);
      			break;
      		case 3:
      			stateC = message.getBool();
      			digitalWrite(message.sensor + 4, stateC ? RELAY_ON : RELAY_OFF);
      			break;
      		}
         
      /*      // Write some debug info
          Serial.print("Incoming change for sensor:");
          Serial.println(message.sensor);
          Serial.print("from node:");
          Serial.println(message.sender);
          Serial.print(", New status: ");
          Serial.println(message.getBool());
      	*/
      	}
      }
      
      gahlawathomeG Offline
      gahlawathomeG Offline
      gahlawathome
      wrote on last edited by
      #2

      @pihome
      I am not able to fully trace the sketch but it seems that in receive method you are adding 4 to sensor id. That would mean that three message received would activate pin 5, 6 and 7. But your relays are connected to pins 6, 7 and 8. Please change message.sensor + 4 to message.sensor +5 and try to run it

      1 Reply Last reply
      0
      • pihomeP Offline
        pihomeP Offline
        pihome
        wrote on last edited by
        #3

        thank you, that worked :+1:

        PiHome - Smart Heating Control

        1 Reply Last reply
        0

        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
        Reply
        • Reply as topic
        Log in to reply
        • Oldest to Newest
        • Newest to Oldest
        • Most Votes


        22

        Online

        12.0k

        Users

        11.2k

        Topics

        113.4k

        Posts


        Copyright 2025 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
        • Login

        • Don't have an account? Register

        • Login or register to search.
        • First post
          Last post
        0
        • MySensors
        • OpenHardware.io
        • Categories
        • Recent
        • Tags
        • Popular