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 43Bounce 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 desireclass 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 debouncerbutton1debouncer.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);}
-
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 43Bounce 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 desireclass 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 debouncerbutton1debouncer.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);}
@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 desiredon'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? -
@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 desiredon'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?
-
@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 desiredon'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?
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