Dears,
I have a problem that I could not solve for a while, I tried the code below but it did not work. There will be 4 buttons controlling 4 relays but in a way that button one will turn relays 1&3 on, if button 2 is pressed only relay 2 turns on, if button 3 is pressed relays 1,2 and 3 will turn on, if button 4 is pressed it is supposed to toggle relays 1&4. one more thing: I need to be able to pass from any button to any of the others and the corresponding relays will be activated while the others will go off.
#include <Bounce2.h>
const int BUTTON_COUNT = 4;
const int16_t DEBOUNCE_DELAY = 50;
const uint8_t buttonPins[BUTTON_COUNT] = {28, 29, 30, 31};
const uint8_t ledPins[BUTTON_COUNT] = {34, 35, 36, 37};
Bounce buttons[BUTTON_COUNT];
uint8_t ledStates[BUTTON_COUNT];
void setup() {
for (int i = 0; i < BUTTON_COUNT; i++) {
buttons[i].attach(buttonPins[i], INPUT);
buttons[i].interval(DEBOUNCE_DELAY);
pinMode(ledPins[i], OUTPUT);
ledStates[i] = HIGH;
digitalWrite(ledPins[i], ledStates[i]);
}
}
void loop() {
// Update the debouncers.
for (int i = 0; i < BUTTON_COUNT; i++)
buttons[i].update();
// When the first "laban" button is pressed:
if (buttons[0].rose()) {
// Light up the first LED.
digitalWrite(ledPins[1], LOW);
digitalWrite(ledPins[3], LOW);
// and turn off all the others.
for (int i = 0; i < BUTTON_COUNT; i++) {
ledStates[0] = HIGH;
ledStates[2] = HIGH;
digitalWrite(ledPins[i], ledStates[i]);
}
}
// When the first button is released:
if (buttons[0].fell()) {
// turn off relays.
digitalWrite(ledPins[1], HIGH);
digitalWrite(ledPins[3], HIGH);
}
// When the first "Soda" button is pressed:
if (buttons[1].rose()) {
// Light up the first LED.
digitalWrite(ledPins[2], LOW);
// and turn off all the others.
for (int i = 0; i < BUTTON_COUNT; i++) {
ledStates[0] = HIGH;
ledStates[1] = HIGH;
ledStates[3] = HIGH;
digitalWrite(ledPins[i], ledStates[i]);
}
}
// When the first button is released:
if (buttons[1].fell()) {
// turn off the first LED.
digitalWrite(ledPins[2], HIGH);
}
// When the first "labanUP" button is pressed:
if (buttons[2].rose()) {
// Light up the first LED.
digitalWrite(ledPins[1], LOW);
digitalWrite(ledPins[2], LOW);
digitalWrite(ledPins[3], LOW);
// and turn off all the others.
for (int i = 0; i < BUTTON_COUNT; i++) {
ledStates[0] = HIGH;
digitalWrite(ledPins[i], ledStates[i]);
}
}
// When the first button is released:
if (buttons[0].fell()) {
// turn off the first LED.
digitalWrite(ledPins[1], HIGH);
digitalWrite(ledPins[2], HIGH);
digitalWrite(ledPins[3], HIGH);
}
// When circulation button is pressed:
if (buttons[3].rose()) {
// Toggle its state.
ledStates[3] = !ledStates[3];
digitalWrite(ledPins[3], ledStates[3]);
digitalWrite(ledPins[0], ledStates[0]);
}
}
1 Answer 1
Below code is an simple example of what you described, each button will turn on the relays defined for them and turn off other relays. except for button 4 which will toggle relay 1 and 4.
int relay1 = 2;
int relay2 = 3;
int relay3 = 4;
int relay4 = 5;
int sw1 = 6;
int sw2 = 7;
int sw3 = 8;
int sw4 = 9;
int sw1Status, sw2Status, sw3Status, sw4Status;
int order = 1; // default is to set all relays off.
void setup() {
pinMode(relay1, OUTPUT);
pinMode(relay2, OUTPUT);
pinMode(relay3, OUTPUT);
pinMode(relay4, OUTPUT);
// input pull-up, so default state of buttons is HIGH.
pinMode(sw1, INPUT_PULLUP);
pinMode(sw2, INPUT_PULLUP);
pinMode(sw3, INPUT_PULLUP);
pinMode(sw4, INPUT_PULLUP);
}
void loop() {
// read the buttons status
sw1Status = digitalRead(sw1);
sw2Status = digitalRead(sw2);
sw3Status = digitalRead(sw3);
sw4Status = digitalRead(sw4);
if (sw1Status == LOW) { // if button 1 pressed
order = 2; // go to case 2
}
if (sw2Status == LOW) {
order = 3;
}
if (sw3Status == LOW) {
order = 4;
}
if (sw4Status == LOW) { // button 4 toggle
if (order != 5) { // if order is not equal 5 turn on relay 1 & 4
order = 5;
}
else { // else go to case 1, which will turns off all relays
order = 1;
}
}
switch (order) {
case 1: // if order equals 1
digitalWrite(relay1, LOW);
digitalWrite(relay2, LOW);
digitalWrite(relay3, LOW);
digitalWrite(relay4, LOW);
break;
case 2: // if order equals 2
digitalWrite(relay1, HIGH);
digitalWrite(relay2, LOW);
digitalWrite(relay3, HIGH);
digitalWrite(relay4, LOW);
break;
case 3: // if order equals 3
digitalWrite(relay1, LOW);
digitalWrite(relay2, HIGH);
digitalWrite(relay3, LOW);
digitalWrite(relay4, LOW);
break;
case 4: // if order equals 4
digitalWrite(relay1, HIGH);
digitalWrite(relay2, HIGH);
digitalWrite(relay3, HIGH);
digitalWrite(relay4, LOW);
break;
case 5: // if order equals 5
digitalWrite(relay1, HIGH);
digitalWrite(relay2, LOW);
digitalWrite(relay3, LOW);
digitalWrite(relay4, HIGH);
break;
default: // if none of above cases is valid go to case 1
order = 1;
break;
}
}
Having a tidy code format and using simple coding style (if possible) will help to debug/edit/improve the code more easily.
Don't forget to de-bounce the buttons.
-
1Thank you very much, but unfortunately, it did not work the way we were expecting. I thought it maybe my connections so I used the simulator with dc motors instead of the relays and it was the same :( " tinkercad.com/things/k1VCQrax95J-copy-of-arduino-simulator-or/… "medo– medo2019年10月24日 09:10:59 +00:00Commented Oct 24, 2019 at 9:10
-
@medo You shouldn't connect the push buttons to the positive line, we already used the INPUT_PULLUP. remove the resistor and just connect the push button directly to the negative line.ElectronSurf– ElectronSurf2019年10月24日 11:56:24 +00:00Commented Oct 24, 2019 at 11:56
-
Highly appreciated @newbie. What do you think changes need to be made if I replace the push buttons with "TTP 223" touch sensors? any idea of changes on the code? since the sensor has 3 lines; ground, vcc and signalmedo– medo2019年10月25日 04:53:14 +00:00Commented Oct 25, 2019 at 4:53
-
@medo well sensors also have high/low output too, in case of using a sensor instead of push button you have to detect sensor status and apply it in the code:
sw1Status, sw2Status ...
. also you should replaceINPUT_PULLUP
withINPUT
.ElectronSurf– ElectronSurf2019年10月25日 06:47:23 +00:00Commented Oct 25, 2019 at 6:47