Установка flag в switch case при мигающем светодиоде с millis

Братцы помогите калеке! Суть вопроса такова, необходимо
что бы при нажатии кнопки на ИК пульте загорались два светодиода и у каждого своя частота. И при повторном нажатии на эту же кнопку они выключались. Заранее скажу, что на форуме мне давали подсказку о внедрении команды flag в саму функцию case, а так же установить в loop() цикличность millis. ОЧЕНЬ прошу подробнее рассказать, потому как кудрявые неумелые пальцы в связке с незнающим языка С мозгом это беда. Заранее менторам своего дела - СПАСИБО!, за внимание к моему посту.

#include <IRremote.hpp>
#define IR_RECEIVE_PIN 8
uint32_t tmr1;
uint32_t tmr2;
bool flag1;
bool flag2;
#define period1 1500
#define period2 50
#define period3 3500
#define period4 50
int ledPin1 = 3;
int ledPin2 = 9;
int ledPin3 = 10;

void setup() {
  Serial.begin (9600);
  IrReceiver.begin (IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
  pinMode (ledPin1, OUTPUT);
  pinMode (ledPin2, OUTPUT);
  pinMode (ledPin3, OUTPUT);
}

void loop() {
  if (IrReceiver.decode ()) {
    switch (IrReceiver.decodedIRData.decodedRawData) {
        case 0xEE11FB04:
        Serial.println ("кнопка №1");
        digitalWrite (ledPin1, !digitalRead (ledPin1));
        break; 
        case 0xED12FB04:
        Serial.print ("кнопка №2");
          if (millis() - tmr1 >= (flag1 ? period1 : period2)) {
          tmr1 = millis();
          digitalWrite (ledPin2, flag1);
          flag1 = !flag1; 
          }
          if (millis() - tmr2 >= (flag2 ? period3 : period4)) {
          tmr2 = millis();
          digitalWrite (ledPin3, flag2);
          flag2 = !flag2;
          }
        break;
    }
    IrReceiver.resume ();
  }
}

P.S. Кнопка под цифрой 1 работает нормально (включается и выключается). Проблема с кнопкой 2 (тоже ключается и выключается, но морганий не происходит).

Спойлер
uint32_t tmr1;
uint32_t tmr2;
uint32_t btntmr;
bool flag1;
bool flag2;
#define period1 1500
#define period2 50
#define period3 3500
#define period4 50
int ledPin1 = 3;
int ledPin2 = 9;
int ledPin3 = 10;
int btn2Pin = 2;
bool BTN2 = false;
uint8_t chkbtn = 500;

void setup() {
 Serial.begin (9600);

 pinMode (ledPin1, OUTPUT);
 pinMode (ledPin2, OUTPUT);
 pinMode (ledPin3, OUTPUT);
 pinMode(btn2Pin, INPUT_PULLUP);
}

void loop() {
if (millis() - tmr1 >= (flag1 ? period1 : period2) && BTN2) {
         tmr1 = millis();
         digitalWrite (ledPin2, flag1);
         flag1 = !flag1; 
         }
         if (millis() - tmr2 >= (flag2 ? period3 : period4) && BTN2) {
         tmr2 = millis();
         digitalWrite (ledPin3, flag2);
         flag2 = !flag2;
         }

         // кнопка упрощённо, вместо пульта

 if (millis() - btntmr > chkbtn && !digitalRead(btn2Pin)) {
     btntmr = millis();
      
       // А дальше switch и case пошли...


//case:
       Serial.print ("кнопка №2");
        BTN2 = !BTN2 ;
       
   }
   
}

Могу помочь сокращённым примером.
Сейчас времени нет

А сама она моргать и не будет, ее состояние меняется только при приходе радиокоманды

Прошу прощения, не очень понял Вас.

попробуйте сравнить свой код с примером от @Дим-мычъ в сообщении #2

Его код мигать будет, а ваш - нет.

В первом case, при нажатии кнопки ИК пульта у меня загорается диод, при повторном нажатии он гаснет. В случае второго case, при нажатии другой кнопки пульта должны загореться 2 других диода которые не просто загораются а мерцают с определенным временем. Дак вот мерцания не происходит потому как я понимаю, что код у меня написан не верно. В следствии чего и обращаюсь к мастодонтам своего дела.

я в указанном скече от @Дим-мычъ не очень понял для чего там btn2Pin который установлен на 2 порт, и почему не используется библиотека IRremote

Слушайте, ну неужели вы не видите?
Все ваши упражнения с миллис находятся внутри условия

а значит , в лучшем случае, вам нужно будет нажимать кнопку на пульте на каждое мигание лампочки.

Данную ошибку я увидел, сравнив со скетчем в ответе #2. После того как я вынес millis (а я и изначально так и делал), у меня минуя все нажатия кнопок пульта диоды моргают самостоятельно по написанной программе millis. И именно поэтому мне и указали вписать flag в case. Но увы у меня не ничего путевого не вышло.

Эх…

Спойлер
#include <IRremote.hpp>
#define IR_RECEIVE_PIN 8
uint32_t tmr1;
uint32_t tmr2;
bool flag1;
bool flag2;
#define period1 1500
#define period2 50
#define period3 3500
#define period4 50
int ledPin1 = 3;
int ledPin2 = 9;
int ledPin3 = 10;
bool BTN2 = false;

void setup() {
  Serial.begin (9600);
  IrReceiver.begin (IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
  pinMode (ledPin1, OUTPUT);
  pinMode (ledPin2, OUTPUT);
  pinMode (ledPin3, OUTPUT);
}

void loop() {
	if (millis() - tmr1 >= (flag1 ? period1 : period2) && BTN2) {
         tmr1 = millis();
         digitalWrite (ledPin2, flag1);
         flag1 = !flag1; 
         }
         if (millis() - tmr2 >= (flag2 ? period3 : period4) && BTN2) {
         tmr2 = millis();
         digitalWrite (ledPin3, flag2);
         flag2 = !flag2;
         }
	
  if (IrReceiver.decode ()) {
    switch (IrReceiver.decodedIRData.decodedRawData) {
        case 0xEE11FB04:
        Serial.println ("кнопка №1");
        digitalWrite (ledPin1, !digitalRead (ledPin1));
        break; 
        case 0xED12FB04:
        Serial.print ("кнопка №2");
        BTN2 = !BTN2 ;
        break;
    }
    IrReceiver.resume ();
  }
}

P.S.
Не проверял

1 лайк

@Дим-мычъ , @MMM , вы соучастники. Знайте это, когда спать ложитесь.

Я крайне Вам благодарен!!! Все работает на УРА! И еще отдельное спасибо за то, что не оттолкнули новичка.

Я , как ещё вчерашний новичок, могу себе позволить “сочувствие” к себе подобным.

А чем МММ провинился, вообще не понял.

1 лайк

@Дим-мычъ тем, что помогаете получить образование неквалифицированным и (самое главное!) не увлеченным темой людям. Что они сделают получив образование? Хорошо если не принесут вреда, просто не станут работать по официальной профессии. Да, я в этом вопросе принципиален. Насмотрелся на “цирк Шапито” вокруг себя, когда круглое носят, а квадратное катают.
Я ж тоже не профессионал, так, самоучка. Но большинство таких с “корочками” заткну за пояс. Это не бахвальство, просто факт. Тем не менее не смогу взять на себя ответственность в делах, в которых я хоть на 14% что-то не понимаю, не имею права.
И вообще! Не слушай меня! Я выпил смелой воды, пятница же)))

1 лайк

ты… это… градус то повышай, а и то не пиво и не водка.
вино сам знаешь кто пьет (шутка)

А вы уверены что я здесь получаю образование? Я этим занялся как хобби, профильно чуточку другим. И что бы фляга не потекла от того чем занимаюсь как основным видом деятельности, для разнообразия программирую (хотя с моими навыками тяжело так назвать), а времени на учебу так называемую нет. И вроде вы находитесь в разделе ПЕСОЧНИЦА! Тут профессоров не наблюдаю. А то что человек мне помог справится с некими трудностями, я его поблагодарил за это.

И еще не очень понимаю такой момент - почему у Вас так желч брызжет, практически от любых вопросов в данном разделе? Всех под одну гребенку расчесываете, будто тут все курсовые работы выполняют. Не сочтите за грубость!

Можете написать свою почту, нужна помощь.