ИК-пульт дистанционного управления на UNO

Я работаю над кодом ИК-удаления, работающим на Arduino UNO. Я уже могу заставить это работать. но когда я нажимаю кнопку и удерживаю ее, выходные данные повторно отправляются с одним и тем же значением. Итак, вопрос в том, как мне сделать так, чтобы он отправлял только один вывод, пока я нажимаю и удерживаю кнопку.

это мой код

#include <IRremote.h>
int RECV_PIN = 5;
#define PB  3392264773 // код кнопки
#define VUP  3476004267 // код кнопки
#define VDN  2998643817 // код кнопки
#define SRC  387001607 // код кнопки
#define MUTE  305976139 // код кнопки

IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Запускаем приемник
}
void loop() {
  if (irrecv.decode(&results)) {

    if (results.value == PB) { 
      Serial.println("Power");
    }
    if (results.value == VUP) { 
      Serial.println("Vol UP");
    }
    if (results.value == VDN) { 
      Serial.println("Vol Down");
    }
    if (results.value == SRC) { 
      Serial.println("Select");
    }
    if (results.value == MUTE) { 
      Serial.println("Mute");
    }

    irrecv.resume(); // Получаем следующее значение

  }
}

и это выводится, когда я нажимаю и удерживаю кнопку

Power
Power
Power
Power
Power
Vol UP
Vol UP
Vol UP
Vol UP
Vol UP
Vol UP
Vol UP
Vol UP

Спасибо за все ответы. Танва

, 👍-2

Обсуждение

вы не можете ничего сделать, чтобы он отправлял только один выход... вы не можете модифицировать пульт дистанционного управления, @jsotola

одна вещь пришла мне в голову... возможно, пульт дистанционного управления использует "повторяющийся" код вместо кода клавиши, когда кнопка удерживается нажатой... если это так, то ИК-библиотеку можно модифицировать для генерации повторяющегося кода это отличается от кода нажатия клавиши, @jsotola


2 ответа


0

Как отмечалось в комментариях, вы не можете изменить то, что отправляет пульт. Хотя я думаю, что для вас было бы нормально просто отреагировать на первое появление определенного значения, отправленного последовательно. Для этого вам сначала нужно проверить время между отправкой этих последовательных значений, удерживая кнопку. Это (плюс небольшой запас) будет порогом для распознавания нескольких отдельных нажатий кнопок. Примечание. В зависимости от скорости, с которой пульт дистанционного управления передает сигналы при удерживании кнопки, это может означать, что вы не сможете отличить удерживание кнопки от многократного быстрого нажатия.

Сначала определите переменную для хранения предыдущих результатов декодирования и временную метку для сохранения при их получении:

decode_results previous_results;
unsigned long previous_timestamp;

При получении нового значения через IR проверьте, совпадает ли новое значение с previous_results. Если да, не выполняйте проверку кода на фактическое значение. Если нет, обновите previous_results новым значением и действуйте в соответствии с фактически полученным значением. Затем установите временную метку на текущее значение millis() и возобновите прием.

if (irrecv.decode(&results)) {
  if(results != previous_results){
    previous_results = results;
    if (results.value == PB) { 
      Serial.println("Power");
    }
    ....
  }
  previous_timestamp = millis();
  irrecv.resume(); // Receive the next value
}

Теперь вам нужно сбросить переменную previous_results после определенного временного порога, чтобы можно было регистрировать последовательные нажатия одной и той же кнопки. Добавьте соответствующий оператор millis() в вашу функцию loop():

if(millis() - previous_timestamp > 500){
  previous_results = 0;
}

Примечание. Значение 500 мс — всего лишь предположение. Как описано в начале, вам нужно найти это значение самостоятельно, подходящее для вашего пульта. Поиграйте немного с этим значением, пока не будете удовлетворены.

В целом примерно так:

#include <IRremote.h>
int RECV_PIN = 5;
#define PB  3392264773 // код кнопки
#define VUP  3476004267 // код кнопки
#define VDN  2998643817 // код кнопки
#define SRC  387001607 // код кнопки
#define MUTE  305976139 // код кнопки

IRrecv irrecv(RECV_PIN);
decode_results results;
decode_results previous_results;
unsigned long previous_timestamp;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Запускаем приемник
}
void loop() {
  if (irrecv.decode(&results)) {
    if(results != previous_results){
      previous_results = results;
      if (results.value == PB) { 
        Serial.println("Power");
      }
      if (results.value == VUP) { 
        Serial.println("Vol UP");
      }
      if (results.value == VDN) { 
        Serial.println("Vol Down");
      }
      if (results.value == SRC) { 
        Serial.println("Select");
      }
      if (results.value == MUTE) { 
        Serial.println("Mute");
      }
    }
    previous_timestamp = millis();
    irrecv.resume(); // Получаем следующее значение
  }

  if(millis() - previous_timestamp > 500){
    previous_results = 0;
  }
}

Примечание. Я никоим образом не проверял этот код.

,

Я сделал это, адаптировав ваш комментарий. Большое спасибо, @Tanwa Kankang


1

адаптировав идею Крисла, я добился цели. код здесь.

#include <IRremote.h>
int RECV_PIN = 5;
#define PB  3392264773 // код кнопки
#define VUP  3476004267 // код кнопки
#define VDN  2998643817 // код кнопки
#define SRC  387001607 // код кнопки
#define MUTE  305976139 // код кнопки


int pre_p  = 0;
int pre_src  = 0;
int pre_mu  = 0;

//курок
int p = 0;
int src = 0;
int mu = 0;

int pw = 0;
int s = 0;
int m = 0;

IRrecv irrecv(RECV_PIN);
decode_results results;

unsigned long previous_timestamp;
unsigned long check_timestamp;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Запускаем приемник
}
void loop() {
  if (irrecv.decode(&results)) {
    
        if (results.value == PB){
           p = 1;
          if(p != pre_p){
           pw = !pw;
            //Serial.println(pw);
              Serial.println("pw");
              Serial.println(pw);
          }
        }
      if (results.value == VUP) { 
        Serial.println("Vol UP");
      }
      if (results.value == VDN) { 
        Serial.println("Vol Down");
      }
      if (results.value == SRC) { 
        src = 1;
          if(src != pre_src){
           s = !s;
          Serial.println("s");
          Serial.println(s); 
          //Serial.println("Выбрать");
          }
      }
      if (results.value == MUTE) {
        mu = 1;
          if(mu != pre_mu){
           m = !m;
          //Serial.println("Отключить звук");
          Serial.println("mu");
          Serial.println(m); 
          } 
      }
    
    irrecv.resume(); // Получаем следующее значение
    pre_p = p;
    pre_src  = src;
    pre_mu  = mu;

    p=0;
    src = 0;
    mu = 0;

    previous_timestamp = millis();
   
  }
    if(millis() - previous_timestamp > 200){
    pre_p = 0;
    pre_src  = 0;
    pre_mu  = 0;
  }
}
,