Переключение режимов

здравствуйте!

Моя проблема: когда я нажимаю свою кнопку m_1 (переключение режимов), светодиод из предыдущей задачи не выключается (здесь я сделал это, но я думаю, что это не очень хорошая идея, потому что я принудительно отключаю светодиод из предыдущей задачи…) может быть, есть более правильный программный подход?

для примера проблемы, с которой я столкнулся: Нажимаю вторую кнопку task_0 (r_1), - включаю ledPin_4, затем меняю задачу. ledPin_4 не выключается (я хочу, чтобы task_0 был полностью остановлен.). Я могу отключить его только тогда, когда вернусь к задаче 0.

#define MODE_AM 3    // количество режимов
const int ledPin_1 =  12;      // номер выхода светодиода
const int ledPin_2 =  11;
const int ledPin_3 =  10;
const int ledPin_4 =  5;
#include <EncButton.h>
// моя библиотека для более удобной работы с кнопкой
// скачать мождно здесь https://github.com/GyverLibs/EncButton
Button m_1(3);
Button r_1(2);

byte mode = 0;       // переменная режима
void setup() {
  Serial.begin(19200);
}
void loop() {
  m_1.tick();
  if (m_1.click()) {
    if (++mode >= MODE_AM) mode = 0;
  }
  // свитч крутится в цикле loop и задачи постоянно вызываются
  switch (mode) {
    case 0: task_0();
      break;
    case 1: task_1();
      break;
    case 2: task_2();
      break;
  }
}
// наши задачи
void task_0() {
  Serial.println("Task 0");
  digitalWrite(ledPin_3, LOW);
  digitalWrite(ledPin_1, HIGH);
  r_1.tick();
  if (r_1.click()) digitalWrite(ledPin_4, !digitalRead(ledPin_4));
}
void task_1() {
  Serial.println("Task 1");
  digitalWrite(ledPin_1, LOW);
  digitalWrite(ledPin_2, HIGH);

}
void task_2() {
  Serial.println("Task 2");
  digitalWrite(ledPin_3, HIGH);
  digitalWrite(ledPin_2, LOW);
}

А кто его и как отключать будет? Дед Мороз добровольно? )))

Нормальный подход.

1 лайк

Спасибо за ответ! Это для меня новое дело, поэтому “тот кто должен остановить” для меня не очевидно(
Собственно из-за этого вопрос и возник

Все от логики работы зависит. По той логике, что описано в #1 все сделано правильно.

Можно сделать так - перед сменой задачи (например в строке 21) выключать все четыре светодиода, а включать их в задачах только те что надо.

2 лайка

Можно сделать отдельно task_0_on() и task_0_off() и перед тем, как включать новую задачу, выключать старую.

1 лайк