Попеременное мигание светодиода при нажатии кнопки
У меня есть задание для курса: нужно заставить два светодиода мигать попеременно с помощью кнопки. Я разобрался, как это сделать, но время от времени один из светодиодов мигает дважды подряд, а другой — нет. Нужна помощь в понимании того, что заставляет это делать в моём коде. Я использую Tinkercad с Arduino UNO.
int buttonPin = 7;
int redledpin = 11;
int orangeledpin = 12;
void setup() {
pinMode(buttonPin, INPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
}
void loop ()
{
if(digitalRead(buttonPin) == HIGH) {
digitalWrite(11, LOW);
digitalWrite(12, LOW);
}
else {
digitalWrite(11, HIGH);
delay(500);
digitalWrite(11, LOW);
delay(500);
}
if(digitalRead(buttonPin) == HIGH) {
digitalWrite(11, LOW);
digitalWrite(12, LOW);
}
else {
digitalWrite(12, HIGH);
delay(500);
digitalWrite(12, LOW);
delay(500);
}
if(digitalRead(buttonPin) == HIGH) {
digitalWrite(11, LOW);
digitalWrite(12, LOW);
}
}
1 ответ
Ваше поведение зависит исключительно от времени нажатия кнопок. Я предполагаю, что на buttonPin низкий уровень, поэтому при нажатии кнопки вы вызовете оператор if, который вернёт значение false, но какой именно? Всё зависит от того, какую инструкцию выполняет основной цикл при нажатии кнопки, что объясняет, почему иногда ваше поведение работает, а иногда — нет.
Есть несколько вариантов. Простой вариант — два цикла while (последовательных, не вложенных), каждый из которых ждёт, когда на buttonPin перейдёт низкий уровень. Оба цикла while поддерживают низкий уровень на выводах светодиода, затем вы мигаете светодиодом 1 после завершения первого цикла while и мигаете светодиодом 2 после завершения второго.
Другое простое решение — создать новую переменную, соответствующую последнему миганию светодиода. При каждом нажатии кнопки проверяйте переменную: если она равна 0, мигает светодиод 1 и устанавливает переменную в 1, а если она равна 1, мигает светодиод 2 и устанавливает переменную в 0.
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- avrdude ser_open() can't set com-state
- Как подключиться к Arduino с помощью WiFi?
- Mac OSX Yosemite не отображает последовательные порты для Uno R3
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
У вас есть непоследовательность в мышлении... вы устанавливаете состояние двух светодиодов в первой части блока
if, но затем вы устанавливаете состояние только одного светодиода во второй части блокаif, @jsotola