Кнопки переходных процессов управляют непереходным поведением светодиодов.

Представьте себе систему, в которой у вас есть две временные неэксклюзивные кнопки и два светодиода.

Когда вы нажимаете кнопку 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; 
}

, 👍0

Обсуждение

Является ли ответ простым: «удалить еще ветки и добавить сброс для других, ведущих к тем же ветвям»? И для этой «атаки» это не средство для решения домашних заданий. Без вашего кода это было бы слишком широко., @KIIV


2 ответа


Лучший ответ:

0

Примерно так:

if (digitalRead(button1) == HIGH) 
{   
    led1 = HIGH; 
    led2 = LOW; 
}
if (digitalRead(button2) == HIGH) 
{ 
    led2 = HIGH; 
    led1 = LOW; 
}
,

1

Не реагируйте на кнопку изменением светодиода; Вместо этого измените переменную состояния в памяти. При этом сохраняется информация о том, какая кнопка была нажата последней. Затем каждый раз при выполнении цикла устанавливайте светодиоды в соответствии с содержимым этой постоянной переменной. Помните, что это должна быть статическая переменная (глобальная или статическая локальная), поскольку автоматическая переменная будет исчезать и появляться снова после каждого выхода и повторного входа в цикл(), и вы не можете рассчитывать на ее содержимое, когда это произойдет.

Обновление:

Как предотвратить перезапись переменной состояния другим вводом?

Вы не можете предотвратить это — вы должны перезаписать его. Цель переменной состояния — запомнить, какая кнопка была нажата последней. Я имел в виду что-то вроде следующего, где 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