Программирование простой светодиодной схемы кнопки с Arduino

У меня две кнопки и пять светодиодов подключены. В схеме это порядок кнопки, пять светодиодов и кнопка. Порядок светодиодов слева направо (начиная с первой кнопки) красный, зеленый, синий, зеленый и красный. Я использую синий (средний) светодиод, чтобы различать левую и правую стороны. Когда нажата левая кнопка, включается соответствующая зеленая кнопка, а когда кнопка отпущена, включается красная кнопка. Та же функциональность и для правой стороны. Итак, что я хочу сделать, это когда обе кнопки нажаты, зеленый индикатор остается выключенным, а синий — включается. Однако при нажатии обеих кнопок загораются как зеленые, так и синие огни. Ошибка программирования проблемы схемы? Вот мой код:

//Using Arduino UNO

int switchL = 0; //Left button
int switchR = 0; //Right button

void setup() {            //LED from left to right
pinMode(3, OUTPUT); //Red
pinMode(4, OUTPUT); //Green
pinMode(5, OUTPUT); //Blue
pinMode(6, OUTPUT); //Green
pinMode(7, OUTPUT); //Red
Serial.begin(9600);

}

void loop() {
switchL = digitalRead(2);
switchR = digitalRead(8);

if (switchL == HIGH) {
digitalWrite(4, HIGH);
digitalWrite(3, LOW);
} else {
digitalWrite(4, LOW);
digitalWrite(3, HIGH);
}
if (switchR == HIGH) {
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
} else {
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
}
if (switchL == HIGH && switchR == HIGH){
digitalWrite(5, HIGH);
if (digitalRead(5) == HIGH) {
digitalWrite(4, LOW);
digitalWrite(3, LOW);
digitalWrite(7, LOW);
digitalWrite(6, LOW);
} else {
digitalWrite(5, LOW);
}
}
}

0

Решение

Было бы проще, если бы вы нарисовали карту ввода / вывода:

switchL switchR |  lR   lG   mB   rG   rR
0       0    |  1    0    0    0    1
0       1    |  1    0    0    1    0
1       0    |  0    1    0    0    1
1       1    |  0    0    1    0    0

и просто запишите результаты как функцию входов:

digitalWrite(3, !switchL            );
digitalWrite(4,  switchL && !switchR);
digitalWrite(5,  switchL &&  switchR);
digitalWrite(6, !switchL &&  switchR);
digitalWrite(7,             !switchR);

Если вы предпочитаете продолжать использовать вложенные IFs, вы всегда должны иметь в виду, что каждый выход является функцией и то и другое входы.

3

Другие решения

У меня есть смутное понимание функций, которые вы использовали, однако именно ваш ответ побудил меня решить мою проблему. Все, что мне нужно было добавить еще одно условие в два из моих ifs,

    if (switchL == HIGH && switchR == LOW) { //When the left button is pressed but the right button is not
digitalWrite(4, HIGH);
digitalWrite(3, LOW);
} else {
digitalWrite(4, LOW);
digitalWrite(3, HIGH);
}
if (switchR == HIGH && switchL == LOW) { //When the right button is pressed but the left button is not
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
} else {
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
}
0

Вы пытались переосмыслить это. Во-первых, во втором if тест, вы устанавливаете D5 HIGH а затем сразу же проверить, если это HIGH, Больше ничего не может быть, поэтому else в финале if никогда не будет действовать.

Все, что я хотел бы сделать, это переместить ваш хитрый бит (двойной тест) в верхнюю часть вашего кода, а затем протестировать каждую из остальных кнопок внутри else этого теста выше. Теперь это читается сложнее, чем нужно. Вот код:

void loop() {
switchL = digitalRead(2);
switchR = digitalRead(8);

// first test if both buttons are pressed
if (switchL == HIGH && switchR == HIGH){
digitalWrite(5, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
} else {
// now that's out the way, we test for everything else as a whole here
// first test switchL
if (switchL == HIGH) {
digitalWrite(4, HIGH);
digitalWrite(3, LOW);
} else {
digitalWrite(4, LOW);
digitalWrite(3, HIGH);
} // end if switchL
// then test switchR
if (switchR == HIGH) {
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
} else {
digitalWrite(6, LOW);
digitalWrite(7, HIGH);
} //end if switchR
}     //end else of both high
}
0