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