Базовый вопрос по Arduino. Пытаюсь выключить светодиоды, включённые через последовательный монитор, с помощью кнопки .

Я новичок в использовании последовательного монитора. У меня настроен код, который включает светодиоды при вводе данных с клавиатуры. Я знаю, как их выключить с помощью клавиатуры, но не могу понять, почему светодиоды не выключаются при нажатии кнопки.

    #define led1 10 //10th,
    #define led2 11 //11th
    #define led3 12 //12th
    #define led4 13 //13th
    #define ButtonA 9

    int ButtonState;
    int ButtonState2;
    int state;
    int StateNow;
    int PreviousState = HIGH;

    void setup(){
      pinMode(led1,OUTPUT);
      pinMode(led2,OUTPUT);
      pinMode(led3,OUTPUT);
      pinMode(led4,OUTPUT);
      pinMode(ButtonA,INPUT_PULLUP);
      Serial.begin(9600);
      Serial.println("Enter ch a, b, c, or d:");
    }

    void loop() {
    if (Serial.available()) 
    {
      ButtonState = digitalRead(ButtonA);
      delay(10);
      ButtonState2 = digitalRead(ButtonA);  // устранение дребезга
      if (ButtonState != ButtonState2)
      {
        StateNow = ButtonState2;
      }
      else
      {
        StateNow = ButtonState;
      }
      if(StateNow == LOW && PreviousState == HIGH) 
  {
    digitalWrite(led1,LOW);
    digitalWrite(led2,LOW);
    digitalWrite(led3,LOW);
    digitalWrite(led4,LOW);
    Serial.println("Turned off all LEDs");
    PreviousState = LOW;
  }
  else if(StateNow == HIGH && PreviousState == LOW) 
  {
    PreviousState = HIGH;
  }
  state = Serial.read();
  if (state == 'a' || state == 'A') 
  {
    digitalWrite(led1,HIGH);
    Serial.println("Turned on led 1");
  }
  else if (state == 'b' || state == 'B') 
  {
    digitalWrite(led2,HIGH);
    Serial.println("Turned on led 2");
  }
  else if (state == 'c' || state == 'C') 
  {
    digitalWrite(led3,HIGH);
    Serial.println("Turned on led 3");
  }
  else if (state == 'd' || state == 'D') 
  {
    digitalWrite(led4,HIGH);
    Serial.println("Turned on led 4");
  }
}

}

Светодиоды включаются правильно, и я знаю, что схема подключена правильно, так что это определенно что-то, чего мне не хватает в программном обеспечении

, 👍1

Обсуждение

вы проверяете кнопку только при подключенном последовательном порте, @jsotola

Так мне следует проверить кнопку за пределами последовательного соединения?, @Martin

а зачем вы вообще спрашиваете? просто попробуйте., @jsotola


1 ответ


1

Чтобы выключить все светодиоды при нажатии кнопки, необходимо обнаружить рост или падение сигнала кнопки.

В вашем коде вы обнаруживаете изменение только в том случае, если доступен последовательный порт, но вы должны делать это в цикле.

Простейший способ обнаружить изменение — делать это в каждом цикле:

if (StateNow != PreviousState) {
  if (StateNow == LOW && PreviousState == HIGH) //кнопка нажата
  {
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    Serial.println("Turned off all LEDs");
  }
  PreviousState = StateNow;
}

Я упрощаю ваш код и добавляю несколько комментариев:

#define led1 10 //10-й,
#define led2 11 //11th
#define led3 12 //12th
#define led4 13 //13th
#define ButtonA 9

int state;
int StateNow;
int PreviousState;

void setup() {
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(ButtonA, INPUT_PULLUP);
  Serial.begin(9600);
  Serial.println("Enter ch a, b, c, or d:");
  PreviousState = digitalRead(ButtonA);
}

void loop() {
  //обнаружить изменения в сигнале кнопки для выключения светодиодов
  StateNow = digitalRead(ButtonA);
  if (StateNow != PreviousState) {
    if (StateNow == LOW && PreviousState == HIGH) //кнопка нажата
    {
      digitalWrite(led1, LOW);
      digitalWrite(led2, LOW);
      digitalWrite(led3, LOW);
      digitalWrite(led4, LOW);
      Serial.println("Turned off all LEDs");
    }
    PreviousState = StateNow;
  }

  //проверьте последовательный буфер, чтобы включить светодиоды
  if (Serial.available())
  {
    state = Serial.read();
    if (state == 'a' || state == 'A')
    {
      digitalWrite(led1, HIGH);
      Serial.println("Turned on led 1");
    }
    else if (state == 'b' || state == 'B')
    {
      digitalWrite(led2, HIGH);
      Serial.println("Turned on led 2");
    }
    else if (state == 'c' || state == 'C')
    {
      digitalWrite(led3, HIGH);
      Serial.println("Turned on led 3");
    }
    else if (state == 'd' || state == 'D')
    {
      digitalWrite(led4, HIGH);
      Serial.println("Turned on led 4");
    }
  }
}
,