Здравствуйте. Хотел бы обратиться за помощью

NUB1

✩✩✩✩✩✩✩
16 Окт 2022
1
0
Заголовок должен отражать суть темы. Переформулируй или тема будет удалена.
Имеется код для ИК приемника. Каждая кнопка на пульте ик отвечает за отдельный режим светодиода. 1 - мигание, 2 - плавное затухание/зажигание, 3 плавное зажигание. Так вот, режимы почему то переключаются только в такой последовательности 1 - 2 - 3 и кода доходит до 3 режима, с него нельзя переключится на другой рандомный. В программирование я новичок, помогите пожалуйста, заранее спасибо.
C++:
#include <IRremote.h>
int RECV_PIN = 6;
IRrecv irrecv(RECV_PIN);
decode_results results;
int LED = 5;
int ledstate = LOW;

bool ledblink = false;
bool ledfading = false;
bool automat = false;

int val = 0;
int dir = true;

void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(LED, OUTPUT);
}

void loop() {

  if (irrecv.decode(&results)) {
    switch (results.value) {
      case 0xFFA25D: // режим 1
        ledblink = !ledblink;
        break;

      case 0xFF629D: // режим 2
        ledfading = !ledfading;
        break;

      case 0xFFE21D: // режим 3
        automat = !automat;
        break;
    }




    Serial.println(results.value, HEX);


    irrecv.resume();
  }


  if (ledblink) {
    Flashled();
  }
  if (ledfading) {
    Fading();
  }
  if (automat) {
    Automatled();
  }
}

void Flashled() {
  static unsigned long lasttime = 0;
  if (millis() - lasttime > 500) {
    lasttime = millis();
    if (ledstate == LOW) {
      ledstate = HIGH;
    }
    else ledstate = LOW;
    digitalWrite(LED, ledstate);
  }
}

void Fading() {
  static unsigned long lasttime = 0;
  if (millis() - lasttime > 10) {
    lasttime = millis();
    if (dir == 1)val++;
    else val--;
    if (val >= 255 || val <= 0) dir = !dir;
    analogWrite(LED, val);
  }
}
void Automatled() {
  analogWrite(LED, (millis() / 10) % 256);
}
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
500
145
@NUB1,
В обработке нажатий кнопок добавьте отключение других режимов
Например
C++:
case 0xFFA25D: // режим 1
    ledblink = !ledblink;
    ledfading = false;
    automat = false;
    break;
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
631
150
А если в оброботчике нажатий сразу вызывать нужную подпрограмму зажигания светодиода. А инвертирование флагов с последующей проверкой их состояния выбросить совсем.
C++:
if (irrecv.decode(&results)) 
{ switch (results.value) 
{ case 0xFFA25D: // режим 1
Flashled();
break;
case 0xFF629D: // режим 2
Fading(); break; 
case 0xFFE21D: // режим 3 
automatled();
break; }
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
@viktor1703, боюсь в таком варианте работать не будет, так как условие сработает только 1 раз при получении сигнала с пульта. Как только пульт перестанет отправлять сигнал - все функции внутри условия не будут выполняться.