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

0

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

//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);
          }
    }
} 
  • 1
    Если кнопки не подключены к светодиодам, проблема программирования.
Теги:
arduino
arduino-ide
circuit

3 ответа

3

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

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, вы всегда должны помнить, что каждый выход является функцией обоих входов.

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 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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню