У меня две кнопки и пять светодиодов подключены. В схеме это порядок кнопки, пять светодиодов и кнопка. Порядок светодиодов слева направо (начиная с первой кнопки) красный, зеленый, синий, зеленый и красный. Я использую синий (средний) светодиод, чтобы различать левую и правую стороны. Когда нажата левая кнопка, включается соответствующая зеленая кнопка, а когда кнопка отпущена, включается красная кнопка. Та же функциональность и для правой стороны. Итак, что я хочу сделать, это когда обе кнопки нажаты, зеленый индикатор остается выключенным, а синий — включается. Однако при нажатии обеих кнопок загораются как зеленые, так и синие огни. Ошибка программирования проблемы схемы? Вот мой код:
//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);
}
}
}
Было бы проще, если бы вы нарисовали карту ввода / вывода:
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);
Если вы предпочитаете продолжать использовать вложенные IF
s, вы всегда должны иметь в виду, что каждый выход является функцией и то и другое входы.
У меня есть смутное понимание функций, которые вы использовали, однако именно ваш ответ побудил меня решить мою проблему. Все, что мне нужно было добавить еще одно условие в два из моих 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);
}
Вы пытались переосмыслить это. Во-первых, во втором 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
}