Кнопки переходных процессов управляют непереходным поведением светодиодов.
Представьте себе систему, в которой у вас есть две временные неэксклюзивные кнопки и два светодиода.
Когда вы нажимаете кнопку 1, светодиод 1 горит ВЫСОКИМ, а светодиод 2 — НИЗКИМ (и остается таким).
Когда вы нажимаете кнопку 2, светодиод 1 горит НИЗКИМ, а светодиод 2 — ВЫСОКИМ (также остается в таком состоянии).
Какой код C++ позволяет мне поддерживать светодиод 1 включенным на неопределенный срок (пока не будет нажата кнопка 2)?
По сути, моя проблема в том, что кнопки являются временными, а поведение светодиодов не должно быть таким.
Вот код, который будет работать для постоянных эксклюзивных кнопок, но не работает для временных неэксклюзивных кнопок.
if (digitalRead(button1) == HIGH)
{
led1 = HIGH;
}
else
{
led2 = LOW;
}
if (digitalRead(button2) == HIGH)
{
led2 = HIGH;
}
else
{
led2 = LOW;
}
@GIA_96, 👍0
Обсуждение2 ответа
Лучший ответ:
Примерно так:
if (digitalRead(button1) == HIGH)
{
led1 = HIGH;
led2 = LOW;
}
if (digitalRead(button2) == HIGH)
{
led2 = HIGH;
led1 = LOW;
}
Не реагируйте на кнопку изменением светодиода; Вместо этого измените переменную состояния в памяти. При этом сохраняется информация о том, какая кнопка была нажата последней. Затем каждый раз при выполнении цикла устанавливайте светодиоды в соответствии с содержимым этой постоянной переменной. Помните, что это должна быть статическая переменная (глобальная или статическая локальная), поскольку автоматическая переменная будет исчезать и появляться снова после каждого выхода и повторного входа в цикл(), и вы не можете рассчитывать на ее содержимое, когда это произойдет.
Обновление:
Как предотвратить перезапись переменной состояния другим вводом?
Вы не можете предотвратить это — вы должны перезаписать его. Цель переменной состояния — запомнить, какая кнопка была нажата последней. Я имел в виду что-то вроде следующего, где lastButton
сохраняет номер последней кнопки:
void setup(){
pinmode(LED1PIN, OUTPUT);
pinmode(LED2PIN, OUTPUT);
pinmode(BUTN1PIN, INPUT_PULLUP); // возможно, вам не понадобится подтягивание
pinmode(BUTN2PIN, INPUT_PULLUP); // в зависимости от вашей проводки.
}
void loop(){
static uint8_t lastButton = 0;
// Сохраняем номер последней нажатой кнопки.
if (digitalRead(button1) == HIGH)
lastButton = 1;
else if (digitalRead(button2) == HIGH)
lastButton = 2;
// Устанавливаем светодиоды в соответствии с последней кнопкой
// Обратите внимание, что при запуске программы, когда ни одна кнопка не имеет
// еще не нажата, этот код оставляет оба светодиода выключенными.
if (lastButton == 1)
{
digitalWrite(LED1PIN, HIGH);
digitalWrite(LED2PIN, LOW);
}
else if(lastButton == 2)
digitalWrite(LED1PIN, LOW);
digitalWrite(LED2PIN, HIGH);
}
}
Спасибо, но как мне предотвратить повреждение переменной, нажав другую кнопку? Допустим, я создаю код, в котором что-то произойдет после того, как b1 (переменная состояния) станет истиной. Это отправит меня в цикл while, но когда вы как пользователь нажимаете кнопку Button2, b1 сбрасывается в значение false, и цикл завершается?. Как предотвратить перезапись переменной состояния другим вводом?, @GIA_96
Я мог бы уточнить свой вопрос и создать еще одну тему. Я не уверен, достаточно ли это ясно., @GIA_96
- esp32 Stack canary watchpoint срабатывает
- Почему функция server.on() из "ESPAsyncWebServer.h" выполняется на стороне setup(), а не на стороне loop()?
- ESP32 отправляет данные на другой ESP32 без установления соединения Wi-Fi
- Передача нестатической функции-члена с помощью bind
- Увеличить частоту дискретизации на плате ESP32
- Отправить только один пакет с одного ESP32 на другой ESP32 без подтверждения
- Использование лямбд в качестве функций обратного вызова
- Каков наилучший способ преобразования std::string в строку?
Является ли ответ простым: «удалить еще ветки и добавить сброс для других, ведущих к тем же ветвям»? И для этой «атаки» это не средство для решения домашних заданий. Без вашего кода это было бы слишком широко., @KIIV