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. General Discussion
  3. Binary button conflicting Relais with button

Binary button conflicting Relais with button

Scheduled Pinned Locked Moved General Discussion
4 Posts 2 Posters 1.2k Views 3 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.
  • DickD Offline
    DickD Offline
    Dick
    wrote on last edited by
    #1

    I use a sensor with 3 relais with button and 4 binary buttons. All 3 relais are working and 3 of the 4 buttons are working to but as soon as I hit the button on pin A1, the relay on pin A5 is switching. I have already tried to change the A1 pin in another but same result. Any idea how to solve this? included the code:```
    // 2x binary switch + dallas temp example
    // Connect button or door/window reed switch between
    // digitial I/O pin 4,5 (BUTTON_PIN_4/BUTTON_PIN_5 below) and GND.
    // Connect dallas temp sensor to digital pin 3

    #include <MySensor.h>
    #include <SPI.h>
    #include <Bounce2.h>
    #define DIGITAL_MOTION_SENSOR 3
    #define CHILD_ID_MOTION 6
    #define BUTTON1_PIN 2
    #define CHILD_ID_BUTTON1 4
    #define BUTTON2_PIN A0
    #define CHILD_ID_BUTTON2 3
    #define BUTTON3_PIN 8
    #define CHILD_ID_BUTTON3 5
    #define BUTTON4_PIN A1
    #define CHILD_ID_BUTTON4 1
    #define RELAY_ON 0 // switch around for realy HIGH/LOW state
    #define RELAY_OFF 1
    #define RADIO_ID 43

    Bounce motionsDebouncer = Bounce();
    Bounce button1debouncer = Bounce();
    Bounce button2debouncer = Bounce();
    Bounce button3debouncer = Bounce();
    Bounce button4debouncer = Bounce();
    int oldValueButt1=-1;
    int oldValueButt2=-1;
    int oldValueButt3=-1;
    int oldValueButt4=-1;

    int lastMOTION;
    unsigned long SLEEP_TIME = 10000;
    unsigned long blockMotionTimer = 0;

    MySensor gw;

    #define noRelays 3
    const int relayPin[] = {A3, A7, A6}; // switch around pins to your desire
    const int buttonPin[] = {4, A5, 7}; // switch around pins to your desire

    class Relay // relay class, store all relevant data (equivalent to struct)
    {
    public:
    int buttonPin; // physical pin number of button
    int relayPin; // physical pin number of relay
    byte oldValue; // last Values for key (debounce)
    boolean relayState; // relay status (also stored in EEPROM)
    };

    Relay Relays[noRelays];
    Bounce debouncerRELAY[noRelays];
    MyMessage msgRELAY[noRelays], msgMOTION(CHILD_ID_MOTION, V_TRIPPED), msgBUTTON1(CHILD_ID_BUTTON1,V_TRIPPED), msgBUTTON2(CHILD_ID_BUTTON2,V_TRIPPED), msgBUTTON3(CHILD_ID_BUTTON3,V_TRIPPED), msgBUTTON4(CHILD_ID_BUTTON4,V_TRIPPED);

    void setup()
    {
    //sensors.begin();
    //gw.begin();
    gw.begin(incomingMessage, AUTO, true);
    gw.sendSketchInfo("Motion/Button/relay", "1.0");

    // Setup the button
    pinMode(BUTTON1_PIN,INPUT);
    pinMode(BUTTON2_PIN,INPUT);
    pinMode(BUTTON3_PIN,INPUT);
    pinMode(BUTTON4_PIN,INPUT);
    // Activate internal pull-up
    digitalWrite(BUTTON1_PIN,HIGH);// Activate internal pull-up
    digitalWrite(BUTTON2_PIN,HIGH);
    digitalWrite(BUTTON3_PIN,HIGH);
    digitalWrite(BUTTON4_PIN,HIGH);

    gw.present(CHILD_ID_BUTTON1, S_DOOR);
    gw.present(CHILD_ID_BUTTON2, S_DOOR);
    gw.present(CHILD_ID_BUTTON3, S_DOOR);
    gw.present(CHILD_ID_BUTTON4, S_DOOR);

    // After setting up the button, setup debouncer
    

    button1debouncer.attach(BUTTON1_PIN);
    button1debouncer.interval(5);
    button2debouncer.attach(BUTTON2_PIN);
    button2debouncer.interval (5);
    button3debouncer.attach(BUTTON3_PIN);
    button3debouncer.interval(5);
    button4debouncer.attach(BUTTON4_PIN);
    button4debouncer.interval (5);

    // Register binary input sensor to gw (they will be created as child devices)
    // You can use S_DOOR, S_MOTION or S_LIGHT here depending on your usage.
    // If S_LIGHT is used, remember to update variable type you send in. See "msg" above.
    gw.present(CHILD_ID_BUTTON1, S_DOOR);
    gw.present(CHILD_ID_BUTTON2, S_DOOR);
    gw.present(CHILD_ID_BUTTON3, S_DOOR);
    gw.present(CHILD_ID_BUTTON4, S_DOOR);

    pinMode(DIGITAL_MOTION_SENSOR, INPUT_PULLUP); // sets the motion sensor digital pin as input
    motionsDebouncer.attach(DIGITAL_MOTION_SENSOR);
    motionsDebouncer.interval(400);
    // Register all sensors to gw (they will be created as child devices)
    gw.present(CHILD_ID_MOTION, S_MOTION, "Motion needs presentation", true);

    for (int i = 0; i < noRelays; i++)
    {
    Relays[i].buttonPin = buttonPin[i]; // assign physical pins
    Relays[i].relayPin = relayPin[i];
    msgRELAY[i].sensor = i; // initialize messages
    msgRELAY[i].type = V_LIGHT;
    debouncerRELAY[i] = Bounce(); // initialize debouncer
    debouncerRELAY[i].attach(buttonPin[i]);
    debouncerRELAY[i].interval(5);
    pinMode(Relays[i].buttonPin, INPUT_PULLUP);
    pinMode(Relays[i].relayPin, OUTPUT);
    Relays[i].relayState = gw.loadState(i); // retrieve last values from EEPROM
    digitalWrite(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF); // and set relays accordingly
    gw.send(msgRELAY[i].set(Relays[i].relayState ? true : false)); // make controller aware of last status
    gw.present(i, S_LIGHT); // present sensor to gateway
    delay(250);

    }

    }
    void loop()
    {
    gw.process();

    button1debouncer.update();
    // Get the update value
    int value = button1debouncer.read();

    if (value != oldValueButt1) {
    // Send in the new value
    gw.send(msgBUTTON1.set(value==HIGH ? 1 : 0));
    oldValueButt1 = value;
    }
    button2debouncer.update();
    // Get the update value
    value = button2debouncer.read();

    if (value != oldValueButt2) {
    // Send in the new value
    gw.send(msgBUTTON2.set(value==HIGH ? 1 : 0));
    oldValueButt2 = value;
    }
    button3debouncer.update();
    // Get the update value
    value = button3debouncer.read();

    if (value != oldValueButt3) {
    // Send in the new value
    gw.send(msgBUTTON3.set(value==HIGH ? 1 : 0));
    oldValueButt3 = value;
    }
    button4debouncer.update();
    // Get the update value
    value = button4debouncer.read();

    if (value != oldValueButt4) {
    // Send in the new value
    gw.send(msgBUTTON4.set(value==HIGH ? 1 : 0));
    oldValueButt4 = value;
    }

    for (byte i = 0; i < noRelays; i++)
    {
    debouncerRELAY[i].update();
    byte value = debouncerRELAY[i].read();
    if (value != Relays[i].oldValue && value == 0)
    {
    Relays[i].relayState = !Relays[i].relayState;
    digitalWrite(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF);
    gw.send(msgRELAY[i].set(Relays[i].relayState ? true : false));
    gw.saveState( i, Relays[i].relayState );
    } // save sensor state in EEPROM (location == sensor number)

    Relays[i].oldValue = value;
    

    }

    if (blockMotionTimer == 0) {
    if (motionsDebouncer.update()) {
    int value = motionsDebouncer.read();
    Serial.println( "PIR " + (String)value );
    gw.send( msgMOTION.set( value ), true ); // Also it might need inverted value
    blockMotionTimer = (millis() + SLEEP_TIME);
    }
    } else {
    motionsDebouncer.update(); // dummy update to prevent false trigger after timer expires
    if (blockMotionTimer < millis()) {
    blockMotionTimer = 0;
    }
    }

    }

    void incomingMessage(const MyMessage &message)
    {

    if (message.type == V_LIGHT)
    {
    if (message.sensor < noRelays) // check if message is valid for relays..... previous line [[[ if (message.sensor <=noRelays){ ]]]
    {
    Relays[message.sensor].relayState = message.getBool();
    digitalWrite(Relays[message.sensor].relayPin, Relays[message.sensor].relayState ? RELAY_ON : RELAY_OFF); // and set relays accordingly
    gw.saveState( message.sensor, Relays[message.sensor].relayState ); // save sensor state in EEPROM (location == sensor number)
    }
    }
    //gw.wait(50);

    }

    mfalkviddM 1 Reply Last reply
    0
    • DickD Dick

      I use a sensor with 3 relais with button and 4 binary buttons. All 3 relais are working and 3 of the 4 buttons are working to but as soon as I hit the button on pin A1, the relay on pin A5 is switching. I have already tried to change the A1 pin in another but same result. Any idea how to solve this? included the code:```
      // 2x binary switch + dallas temp example
      // Connect button or door/window reed switch between
      // digitial I/O pin 4,5 (BUTTON_PIN_4/BUTTON_PIN_5 below) and GND.
      // Connect dallas temp sensor to digital pin 3

      #include <MySensor.h>
      #include <SPI.h>
      #include <Bounce2.h>
      #define DIGITAL_MOTION_SENSOR 3
      #define CHILD_ID_MOTION 6
      #define BUTTON1_PIN 2
      #define CHILD_ID_BUTTON1 4
      #define BUTTON2_PIN A0
      #define CHILD_ID_BUTTON2 3
      #define BUTTON3_PIN 8
      #define CHILD_ID_BUTTON3 5
      #define BUTTON4_PIN A1
      #define CHILD_ID_BUTTON4 1
      #define RELAY_ON 0 // switch around for realy HIGH/LOW state
      #define RELAY_OFF 1
      #define RADIO_ID 43

      Bounce motionsDebouncer = Bounce();
      Bounce button1debouncer = Bounce();
      Bounce button2debouncer = Bounce();
      Bounce button3debouncer = Bounce();
      Bounce button4debouncer = Bounce();
      int oldValueButt1=-1;
      int oldValueButt2=-1;
      int oldValueButt3=-1;
      int oldValueButt4=-1;

      int lastMOTION;
      unsigned long SLEEP_TIME = 10000;
      unsigned long blockMotionTimer = 0;

      MySensor gw;

      #define noRelays 3
      const int relayPin[] = {A3, A7, A6}; // switch around pins to your desire
      const int buttonPin[] = {4, A5, 7}; // switch around pins to your desire

      class Relay // relay class, store all relevant data (equivalent to struct)
      {
      public:
      int buttonPin; // physical pin number of button
      int relayPin; // physical pin number of relay
      byte oldValue; // last Values for key (debounce)
      boolean relayState; // relay status (also stored in EEPROM)
      };

      Relay Relays[noRelays];
      Bounce debouncerRELAY[noRelays];
      MyMessage msgRELAY[noRelays], msgMOTION(CHILD_ID_MOTION, V_TRIPPED), msgBUTTON1(CHILD_ID_BUTTON1,V_TRIPPED), msgBUTTON2(CHILD_ID_BUTTON2,V_TRIPPED), msgBUTTON3(CHILD_ID_BUTTON3,V_TRIPPED), msgBUTTON4(CHILD_ID_BUTTON4,V_TRIPPED);

      void setup()
      {
      //sensors.begin();
      //gw.begin();
      gw.begin(incomingMessage, AUTO, true);
      gw.sendSketchInfo("Motion/Button/relay", "1.0");

      // Setup the button
      pinMode(BUTTON1_PIN,INPUT);
      pinMode(BUTTON2_PIN,INPUT);
      pinMode(BUTTON3_PIN,INPUT);
      pinMode(BUTTON4_PIN,INPUT);
      // Activate internal pull-up
      digitalWrite(BUTTON1_PIN,HIGH);// Activate internal pull-up
      digitalWrite(BUTTON2_PIN,HIGH);
      digitalWrite(BUTTON3_PIN,HIGH);
      digitalWrite(BUTTON4_PIN,HIGH);

      gw.present(CHILD_ID_BUTTON1, S_DOOR);
      gw.present(CHILD_ID_BUTTON2, S_DOOR);
      gw.present(CHILD_ID_BUTTON3, S_DOOR);
      gw.present(CHILD_ID_BUTTON4, S_DOOR);

      // After setting up the button, setup debouncer
      

      button1debouncer.attach(BUTTON1_PIN);
      button1debouncer.interval(5);
      button2debouncer.attach(BUTTON2_PIN);
      button2debouncer.interval (5);
      button3debouncer.attach(BUTTON3_PIN);
      button3debouncer.interval(5);
      button4debouncer.attach(BUTTON4_PIN);
      button4debouncer.interval (5);

      // Register binary input sensor to gw (they will be created as child devices)
      // You can use S_DOOR, S_MOTION or S_LIGHT here depending on your usage.
      // If S_LIGHT is used, remember to update variable type you send in. See "msg" above.
      gw.present(CHILD_ID_BUTTON1, S_DOOR);
      gw.present(CHILD_ID_BUTTON2, S_DOOR);
      gw.present(CHILD_ID_BUTTON3, S_DOOR);
      gw.present(CHILD_ID_BUTTON4, S_DOOR);

      pinMode(DIGITAL_MOTION_SENSOR, INPUT_PULLUP); // sets the motion sensor digital pin as input
      motionsDebouncer.attach(DIGITAL_MOTION_SENSOR);
      motionsDebouncer.interval(400);
      // Register all sensors to gw (they will be created as child devices)
      gw.present(CHILD_ID_MOTION, S_MOTION, "Motion needs presentation", true);

      for (int i = 0; i < noRelays; i++)
      {
      Relays[i].buttonPin = buttonPin[i]; // assign physical pins
      Relays[i].relayPin = relayPin[i];
      msgRELAY[i].sensor = i; // initialize messages
      msgRELAY[i].type = V_LIGHT;
      debouncerRELAY[i] = Bounce(); // initialize debouncer
      debouncerRELAY[i].attach(buttonPin[i]);
      debouncerRELAY[i].interval(5);
      pinMode(Relays[i].buttonPin, INPUT_PULLUP);
      pinMode(Relays[i].relayPin, OUTPUT);
      Relays[i].relayState = gw.loadState(i); // retrieve last values from EEPROM
      digitalWrite(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF); // and set relays accordingly
      gw.send(msgRELAY[i].set(Relays[i].relayState ? true : false)); // make controller aware of last status
      gw.present(i, S_LIGHT); // present sensor to gateway
      delay(250);

      }

      }
      void loop()
      {
      gw.process();

      button1debouncer.update();
      // Get the update value
      int value = button1debouncer.read();

      if (value != oldValueButt1) {
      // Send in the new value
      gw.send(msgBUTTON1.set(value==HIGH ? 1 : 0));
      oldValueButt1 = value;
      }
      button2debouncer.update();
      // Get the update value
      value = button2debouncer.read();

      if (value != oldValueButt2) {
      // Send in the new value
      gw.send(msgBUTTON2.set(value==HIGH ? 1 : 0));
      oldValueButt2 = value;
      }
      button3debouncer.update();
      // Get the update value
      value = button3debouncer.read();

      if (value != oldValueButt3) {
      // Send in the new value
      gw.send(msgBUTTON3.set(value==HIGH ? 1 : 0));
      oldValueButt3 = value;
      }
      button4debouncer.update();
      // Get the update value
      value = button4debouncer.read();

      if (value != oldValueButt4) {
      // Send in the new value
      gw.send(msgBUTTON4.set(value==HIGH ? 1 : 0));
      oldValueButt4 = value;
      }

      for (byte i = 0; i < noRelays; i++)
      {
      debouncerRELAY[i].update();
      byte value = debouncerRELAY[i].read();
      if (value != Relays[i].oldValue && value == 0)
      {
      Relays[i].relayState = !Relays[i].relayState;
      digitalWrite(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF);
      gw.send(msgRELAY[i].set(Relays[i].relayState ? true : false));
      gw.saveState( i, Relays[i].relayState );
      } // save sensor state in EEPROM (location == sensor number)

      Relays[i].oldValue = value;
      

      }

      if (blockMotionTimer == 0) {
      if (motionsDebouncer.update()) {
      int value = motionsDebouncer.read();
      Serial.println( "PIR " + (String)value );
      gw.send( msgMOTION.set( value ), true ); // Also it might need inverted value
      blockMotionTimer = (millis() + SLEEP_TIME);
      }
      } else {
      motionsDebouncer.update(); // dummy update to prevent false trigger after timer expires
      if (blockMotionTimer < millis()) {
      blockMotionTimer = 0;
      }
      }

      }

      void incomingMessage(const MyMessage &message)
      {

      if (message.type == V_LIGHT)
      {
      if (message.sensor < noRelays) // check if message is valid for relays..... previous line [[[ if (message.sensor <=noRelays){ ]]]
      {
      Relays[message.sensor].relayState = message.getBool();
      digitalWrite(Relays[message.sensor].relayPin, Relays[message.sensor].relayState ? RELAY_ON : RELAY_OFF); // and set relays accordingly
      gw.saveState( message.sensor, Relays[message.sensor].relayState ); // save sensor state in EEPROM (location == sensor number)
      }
      }
      //gw.wait(50);

      }

      mfalkviddM Offline
      mfalkviddM Offline
      mfalkvidd
      Mod
      wrote on last edited by
      #2

      @Dick what you said in the introduction

      I use a sensor with 3 relais with button and 4 binary buttons. All 3 relais are working and 3 of the 4 buttons are working to but as soon as I hit the button on pin A1, the relay on pin A5 is switching.

      and the code you posted:

      const int relayPin[] = {A3, A7, A6}; // switch around pins to your desire
      const int buttonPin[] = {4, A5, 7}; // switch around pins to your desire

      don't match up.

      • You're saying you have 3 relays and 4 buttons, but you have only 3 elements in the buttonPin array?
      • You're saying you have a button on pin A1 when A1 isn't used at all?
      • You're saying the relay on pin A5 is switching, when A5 is used for a button?

      Could you clarify?
      Could you please use the code button to make the code section easier to read?

      DickD 2 Replies Last reply
      0
      • mfalkviddM mfalkvidd

        @Dick what you said in the introduction

        I use a sensor with 3 relais with button and 4 binary buttons. All 3 relais are working and 3 of the 4 buttons are working to but as soon as I hit the button on pin A1, the relay on pin A5 is switching.

        and the code you posted:

        const int relayPin[] = {A3, A7, A6}; // switch around pins to your desire
        const int buttonPin[] = {4, A5, 7}; // switch around pins to your desire

        don't match up.

        • You're saying you have 3 relays and 4 buttons, but you have only 3 elements in the buttonPin array?
        • You're saying you have a button on pin A1 when A1 isn't used at all?
        • You're saying the relay on pin A5 is switching, when A5 is used for a button?

        Could you clarify?
        Could you please use the code button to make the code section easier to read?

        DickD Offline
        DickD Offline
        Dick
        wrote on last edited by
        #3

        @mfalkvidd i thought is was ok because I defined 4 binary buttons 2, 8, A0 and A1 and they only work like a button. Beside these Buttons there is a class in use for the 3x relais with extra buttons to control the relais or do I make a mistake?

        1 Reply Last reply
        0
        • mfalkviddM mfalkvidd

          @Dick what you said in the introduction

          I use a sensor with 3 relais with button and 4 binary buttons. All 3 relais are working and 3 of the 4 buttons are working to but as soon as I hit the button on pin A1, the relay on pin A5 is switching.

          and the code you posted:

          const int relayPin[] = {A3, A7, A6}; // switch around pins to your desire
          const int buttonPin[] = {4, A5, 7}; // switch around pins to your desire

          don't match up.

          • You're saying you have 3 relays and 4 buttons, but you have only 3 elements in the buttonPin array?
          • You're saying you have a button on pin A1 when A1 isn't used at all?
          • You're saying the relay on pin A5 is switching, when A5 is used for a button?

          Could you clarify?
          Could you please use the code button to make the code section easier to read?

          DickD Offline
          DickD Offline
          Dick
          wrote on last edited by
          #4
          This post is deleted!
          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


          62

          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