0

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]);
 }
 }
asked Oct 19, 2019 at 19:22
0

1 Answer 1

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.

answered Oct 19, 2019 at 20:05
4
  • 1
    Thank 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/… " Commented 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. Commented 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 signal Commented 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 replace INPUT_PULLUP with INPUT. Commented Oct 25, 2019 at 6:47

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.