Базовый вопрос по 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");
}
}
}
Светодиоды включаются правильно, и я знаю, что схема подключена правильно, так что это определенно что-то, чего мне не хватает в программном обеспечении
@Martin, 👍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");
}
}
}
- Печатать только тогда, когда кнопка нажата и больше не нажимается
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Использовать все контакты как цифровые входы/выходы
- Float печатается только 2 десятичных знака после запятой
- Arduino как USB HID
- Serial1' was not declared in this scope
- Очень простая операция Arduino Uno Serial.readString()
вы проверяете кнопку только при подключенном последовательном порте, @jsotola
Так мне следует проверить кнопку за пределами последовательного соединения?, @Martin
а зачем вы вообще спрашиваете? просто попробуйте., @jsotola