Вопрос про ИК приёмник

Sem553

✩✩✩✩✩✩✩
10 Янв 2021
91
8
Здравствуйте, есть код ик приёмника:
C++:
#include "IRremote.h"
IRrecv irrecv(4);
decode_results results;
void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn();
}
void loop() {
  if (irrecv.decode(&results))
  {
    int res = results.value;
    if(res==0xA8020829)// Если нажата кнопка "1"
    {
    Serial.println("hello 1");
    }
    else if(res==0xFFFFA857)// Если нажата кнопка "2"
    {
    Serial.println("hello 2");
    }
    irrecv.resume();
  }
}
Подскажите пожалуйста, как сделать так, что бы:
если пришел код 0xA8020829 выводит hello 1, но сделать интервал на уникальность кода 5 секунд,
например, если раз в секунду отправлять 0xA8020829 то выведит его только 1 раз за 5 секунд, так же если придет 0xFFFFA857 оно его выведит один раз в 5 секунд, если две команды будет приходить, то будет выводить только 1 раз за 5 секунд, что нужно добавить в код ?

Заранее благодарен

Up. Чт предпологаю что мне поможет
C++:
// будем искать слово hello
char target[] = "hello";

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

void loop() {
  if (Serial.available() > 0) {
    if (Serial.find(target))
      Serial.println("found");
    // вывести found, если было послано
  }
}
И добавить Serial.setTimeout(time)
 
Изменено:

IamNikolay

★★★✩✩✩✩
15 Янв 2020
820
175
Самый простой способ - добавить задержку delay(5000); чтобы контроллер эти 5 сек. не проверял что принимает приемник
 

Sem553

✩✩✩✩✩✩✩
10 Янв 2021
91
8
@IamNikolay, в таком случае я понимаю что он первый код примет а если прийдет второй код (другой) в течении 5 сек то он его не примет?
 

poty

★★★★★★✩
19 Фев 2020
3,261
948
Сохранять предыдущее значение. Если новое значение одинаковое - идти по одной ветке, где проверять, не прошло ли 5 секунд. Если прошло, обнулять переменную предыдущего значения. Вторая ветка - стандартная обработка значения, запоминание millis и сохранение значения в переменной.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
Я тут вижу маленькую несуразность.. 5 секунд не должна повторятся любая команда , или только последняя ?
К прмеру имеем 3 команды: старт, стоп, пауза.
Старт и старт не должны работать чаще чем раз в 5 секунд
Старт и стоп, должны сработать обе
Старть, стоп и старт , должны сработать все все или без последнего старт?
Если все. то вариант poty, а если только 2, то надо для каждой команды запоминать время выполнения
 

IamNikolay

★★★✩✩✩✩
15 Янв 2020
820
175
Складывается ощущение что кому то(@poty) платят за строчки кода😆

P.S. Если кроме приемника и вывода в сериал на контроллере планируется использовать еще какие либо функции, требующие вызова чаще чем раз в 5 секунд, то решение через delay не подойдет, а для текущего кода - вполне рабочий вариант.
 
Изменено:

IamNikolay

★★★✩✩✩✩
15 Янв 2020
820
175
@poty, делать на миллис - выйдет по объему больше, а запоминание предыдущего значения не требуется, так как только 1 команда в интервал 5 секунд должна обрабатываться, согласно
если две команды будет приходить, то будет выводить только 1 раз за 5 секунд
отсюда и шутка:)
 

Sem553

✩✩✩✩✩✩✩
10 Янв 2021
91
8
Наконец-то )) получилось (пока еще протестировал с одним кодом)
C++:
#include "IRremote.h"
IRrecv irrecv(4);
decode_results results;

 unsigned long previousMillis = 0; // последний момент смены состояния
 int updateMills = 5000; // 5 сек между обновлением
 
void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn();
}
void loop() {
   unsigned long currentMillis = millis(); // текущее время в миллисекундах
  if (irrecv.decode(&results))
  {
    int res = results.value;
    Serial.println(res, HEX);
    if(res==0x40BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis)
      {
        Serial.println("hello 1");
        previousMillis = currentMillis; // запоминаем момент времени

      } else { Serial.println("error 1 (ochen bistro)");
    }
    } else { Serial.println("error 2 (ne tot nomer");
    }
    if(res==0xFFFFA857)// Если нажата кнопка "-"
    {
    }
    irrecv.resume();
  }
}
 

Sem553

✩✩✩✩✩✩✩
10 Янв 2021
91
8
@IamNikolay, да, я в курсе, тамвторая кнопка как шаблон просто стоит, вот итоговый скетч:
C++:
#include "IRremote.h"
IRrecv irrecv(4);
decode_results results;

 unsigned long previousMillis = 0; // последний момент смены состояния
 unsigned long previousMillis2 = 0; // последний момент смены состояния
 unsigned long previousMillis3 = 0; // последний момент смены состояния
 unsigned long previousMillis4 = 0; // последний момент смены состояния
 unsigned long previousMillis5 = 0; // последний момент смены состояния
 unsigned long previousMillis6 = 0; // последний момент смены состояния
 unsigned long previousMillis7 = 0; // последний момент смены состояния
 unsigned long previousMillis8 = 0; // последний момент смены состояния
 unsigned long previousMillis9 = 0; // последний момент смены состояния
 unsigned long previousMillis10 = 0; // последний момент смены состояния
 unsigned long previousMillis11 = 0; // последний момент смены состояния
 unsigned long previousMillis12 = 0; // последний момент смены состояния
 unsigned long previousMillis13 = 0; // последний момент смены состояния
 unsigned long previousMillis14 = 0; // последний момент смены состояния
 unsigned long previousMillis15 = 0; // последний момент смены состояния
 unsigned long previousMillis16 = 0; // последний момент смены состояния
 unsigned long previousMillis17 = 0; // последний момент смены состояния
 unsigned long previousMillis18 = 0; // последний момент смены состояния
 unsigned long previousMillis19 = 0; // последний момент смены состояния
 unsigned long previousMillis20 = 0; // последний момент смены состояния
 unsigned long previousMillis21 = 0; // последний момент смены состояния
 unsigned long previousMillis22 = 0; // последний момент смены состояния
 unsigned long previousMillis23 = 0; // последний момент смены состояния
 unsigned long previousMillis24 = 0; // последний момент смены состояния
 unsigned long previousMillis25 = 0; // последний момент смены состояния
 unsigned long previousMillis26 = 0; // последний момент смены состояния
 unsigned long previousMillis27 = 0; // последний момент смены состояния
 unsigned long previousMillis28 = 0; // последний момент смены состояния
 unsigned long previousMillis29 = 0; // последний момент смены состояния
 unsigned long previousMillis30 = 0; // последний момент смены состояния
 unsigned long previousMillis31 = 0; // последний момент смены состояния
 unsigned long previousMillis32 = 0; // последний момент смены состояния
 unsigned long previousMillis33 = 0; // последний момент смены состояния
 
 int updateMills = 10000; // 10 сек между обновлением
 
void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn();
}
void loop() {
   unsigned long currentMillis = millis(); // текущее время в миллисекундах
  if (irrecv.decode(&results))
  {
    int res = results.value;
    ///////////////////////////////////////////////////////////////////
    if(res==0x01BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis)
      {
        Serial.println("1");
        previousMillis = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x02BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis2)
      {
        Serial.println("2");
        previousMillis2 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x03BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis3)
      {
        Serial.println("3");
        previousMillis3 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x04BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis4)
      {
        Serial.println("4");
        previousMillis4 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x05BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis5)
      {
        Serial.println("5");
        previousMillis5 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x06BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis6)
      {
        Serial.println("6");
        previousMillis6 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x07BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis7)
      {
        Serial.println("7");
        previousMillis7 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x08BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis8)
      {
        Serial.println("8");
        previousMillis8 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x09BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis9)
      {
        Serial.println("9");
        previousMillis9 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x10BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis10)
      {
        Serial.println("10");
        previousMillis10 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x11BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis11)
      {
        Serial.println("11");
        previousMillis11 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x12BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis12)
      {
        Serial.println("12");
        previousMillis12 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x13BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis13)
      {
        Serial.println("13");
        previousMillis13 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x14BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis14)
      {
        Serial.println("14");
        previousMillis14 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x15BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis15)
      {
        Serial.println("15");
        previousMillis15 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x16BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis16)
      {
        Serial.println("16");
        previousMillis16 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x17BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis17)
      {
        Serial.println("17");
        previousMillis17 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x18BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis18)
      {
        Serial.println("18");
        previousMillis18 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x19BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis19)
      {
        Serial.println("19");
        previousMillis19 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x20BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis20)
      {
        Serial.println("20");
        previousMillis20 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x21BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis21)
      {
        Serial.println("21");
        previousMillis21 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x22BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis22)
      {
        Serial.println("22");
        previousMillis22 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x23BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis23)
      {
        Serial.println("23");
        previousMillis23 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x24BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis24)
      {
        Serial.println("24");
        previousMillis24 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x25BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis25)
      {
        Serial.println("25");
        previousMillis25 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x26BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis26)
      {
        Serial.println("26");
        previousMillis26 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x27BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis27)
      {
        Serial.println("27");
        previousMillis27 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x28BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis28)
      {
        Serial.println("28");
        previousMillis28 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x29BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis29)
      {
        Serial.println("29");
        previousMillis29 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x30BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis30)
      {
        Serial.println("30");
        previousMillis30 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x31BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis31)
      {
        Serial.println("31");
        previousMillis31 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x32BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis32)
      {
        Serial.println("32");
        previousMillis32 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    if(res==0x33BF08F7)// Если нажата кнопка "1"
    {
      if(currentMillis - updateMills >= previousMillis33)
      {
        Serial.println("33");
        previousMillis33 = currentMillis; // запоминаем момент времени

      } else {
    }
    } else {
    }
    //////////////////////////////////////////////////////////////////////
    
    irrecv.resume();
  }
}
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,272
1,303
Москва
Я сначала тоже думал офигеть. НО! Если код у него заработал как хотел, то это уже достижение. И гордиться стоит, может и не сильно, но все же.
А потом послушать @bort707, а я что то отвлекся и забыл все. Но тема полезная многим. И варианты как сократить код и кол-во переменных есть.
Например есть 33 команды (кнопки) что бы за 10 секунд нажать все 33 надо в 1 сек нажимать 3 кнопки. А ИК так часто вроде не работает. Не помню Но довольно редко. Тогда можно взять массив с НОМЕРАМИ команд и хранить его как последние команды. При этом периодически чистить его по тайм-ауту. Наверное надо и время команды хранить Типа пришла команда с номером 12, смотрим была ли она нажата в массиве из 10 команд, если да, то игнорировать, если нет. то может стоит самую старую удалить и дописать эту как новую. Будет проигрыш в скорости, но выигрыш в памяти. Тут уже смотреть что нужнее.
 

IamNikolay

★★★✩✩✩✩
15 Янв 2020
820
175
Похоже здесь "Проблема XY" и нужно совсем другое решение
 

Sem553

✩✩✩✩✩✩✩
10 Янв 2021
91
8
@Старик Похабыч, Вы правы, очень рад что получилось, @bort707,а вот про оптимизацию ещё не знал, ещё дойду до этого, главное что есть рабочий вариант того что хотел) @Геннадий П, да, обязательно прочитаю, спасибо)