Binary button conflicting Relais with button



  • 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);

    }


  • Mod

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



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



  • This post is deleted!

Log in to reply
 

814
Online

6.9k
Users

7.8k
Topics

82.8k
Posts

Suggested Topics

Looks like your connection to MySensors Forum was lost, please wait while we try to reconnect.