ИК пульт для PC как передавать коды?

Нет ответов
7am
7am аватар
Offline
Зарегистрирован: 09.09.2015

Всем привет! Есть пульт с китая для ПК, у пульта много разных функций


при попытки считать коды распознать протокол не удается с использованием библиотеки IRremote
коды считываются, но вот как передавать эти коды с помощью Arduino?
По сути нужно продублировать некоторый функционал пульта но на Arduino.
Кто нибудь встречался с такими пультами?
1. Как правильно передавать команды с такого пульта через Arduino?

2. Как сделать чтобы одна кнопка подключенная к Arduino могла делать несколько функций? ( Нажал 1 раз, передалась команда на ик приемник "Пауза", еще раз нажал, "Воспроизведение". Нажал на кнопку два раза команда "Звук выкл"еще раз два раза нажал "Звук вкл".

Дмитрий Осипов показывал у себя в видео что можно использвоать кнопку reset
Пример кода: 

 



#include <IRremote.h> 


IRsend irsend; // Выход ИК передатчика "PIN 3".

#define NECAddress 0x4004 // Замените на ваш протокол - SONY или JVC.....

byte q ; // Счетчик нажатий кнопки Reset / taps counter reset button.

void setup() {
   

q = EEPROM.read(0) + 1; // При подачи питания, записываем в q, значение из ячейки №0 EEPROM, и прибавляем 1.

EEPROM.write(0, q); // Записываем в ячейку №0 EEPROM, увеличенное значение q.

pinMode(13, OUTPUT); // Загорелся 13 LED, значить запись увеличенного значения q в EEPROM, выполнена.

digitalWrite(13, HIGH); // Если хотим увеличить значение "q", нужно отпустить кнопку reset, и снова нажать.

delay(500); // Если кнопка reset будет удержана нажатой - более 500 миллисекунд.

EEPROM.write(0, 0); // Обнуляем ячейку 0 EEPROM, и начинаем слать соответствующий значению "q" IR код.

} // 

void loop() {


if (q == 1)irsend.sendNEC(NECAddress, 0xE248); // "1000809" замените на IR код от вашего пульта.

else if (q == 2)irsend.sendNEC(NECAddress, 0xE2A0);

else if (q == 3)irsend.sendNEC(NECAddress, 0x1004849);

else if (q == 4)irsend.sendNEC(NECAddress, 0x100C8C9);

else if (q == 5)irsend.sendNEC(NECAddress, 0x1002829);

else if (q == 6)irsend.sendNEC(NECAddress, 0x100A8A9);

else if (q == 7)irsend.sendNEC(NECAddress, 0x1006869);

else if (q == 8)irsend.sendNEC(NECAddress, 0x100E8E9);

else if (q == 9)irsend.sendNEC(NECAddress, 0x1008E8F);

else if (q >= 10)irsend.sendNEC(NECAddress, 0x1000E0F);

delay(100); // Пауза, для повторной отправки IR кода.



}

но как быть с функционалом двойного нажатия если кнопка внешняя?

Пример кода от Tomasina (c Амперки)

 

/*При однократном нажатии диод загорается , если еще раз нажать то тухнет.
При двойном нажатии диод загорается и тухнет через 5 минут
Если однократно нажать на кнопку то он погаснет, вне зависимости как его включили.
Бонус: по удержанию кнопки можно что-то ещё зафигачить :)
*/

#define BUTTON_PIN 7
#define LED_PIN 13

int bounceTime = 10;          // задержка для подавления дребезга
int holdTime = 300;          // время, в течение которого нажатие можно считать удержанием кнопки
int doubleTime = 500;        // время, в течение которого нажатия можно считать двойным

boolean lastReading = false;  // флаг предыдущего состояния кнопки
boolean buttonSingle = false; // флаг состояния "краткое нажатие"
boolean buttonDouble = false; // флаг состояния "двойное нажатие"
boolean buttonHold = false;  // флаг состояния "долгое нажатие"
boolean ledState = false;    // флаг состояния LED

long onTime = 0;              // переменная обработки временного интервала
long lastSwitchTime = 0;      // переменная времени предыдущего переключения состояния
long ledStartTime = 0;        // переменная-флаг времени начала включения LED
unsigned long ledTimeout = 300000;      // переменная времени отключения LED, 5 минут = 300 000 мс

void setup()
{
  Serial.begin(9600);
  pinMode(9, HIGH);          //! подаем +5В на кнопку - эта строка только для моей схемы, вам не нужно!
  pinMode(BUTTON_PIN, INPUT_PULLUP); // подключаем кнопку через внутренний резистор
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, ledState);  // принудительно гасим LED
  Serial.println("\nReady...");
}


void loop()
{


  // ================ обработчик состояния кнопки ====================
  boolean reading = !digitalRead(BUTTON_PIN);  // читаем состояние пина кнопки (инвертированное, т.к. подключено через внутренний резистор)
  // проверка первичного нажатия
  if (reading && !lastReading)
  {
    onTime = millis();
  }
  // проверка удержания
  if (reading && lastReading)
  {
    if ((millis() - onTime) > holdTime)
    {
      buttonHold = true;
    }
  }
  // проверка отпускания кнопки
  if (!reading && lastReading)
  {
    if (((millis() - onTime) > bounceTime) && !buttonHold)
    {
      if ((millis() - lastSwitchTime) >= doubleTime)
      {
        lastSwitchTime = millis();
        buttonSingle = true;
      }
      else
      {
        lastSwitchTime = millis();
        buttonDouble = true;
        buttonSingle = false;
        Serial.println("Button: double press");
        isButtonDouble();
        buttonDouble = false;  // сброс состояния после выполнения команды
      }
    }
    if (buttonHold)
    {
      buttonDouble = false;
      Serial.println("Button: hold");
      isButtonHold();
      buttonHold = false;  // сброс состояния после выполнения команды
    }
  }
  lastReading = reading;
  if (buttonSingle && (millis() - lastSwitchTime) > doubleTime)
  {
    buttonDouble = false;
    Serial.println("Button: single press");
    isButtonSingle();
    buttonSingle = false;  // сброс состояния после выполнения команды
  }
  // ================ конец обработчика состояния кнопки ==================

  // ================ обработчик отключения LED по таймауту ===============
  if ((ledStartTime !=0) && (millis() - ledStartTime > ledTimeout))  // если LED включен по даблклику и прошло больше 5 сек
  {
    Serial.println("Timeout");
    ledToggle();        // то гасим LED
    ledStartTime = 0;    // и обнуляем переменную-флаг
  }
  // ================ конец обработчика отключения LED ====================


} // конец loop


void isButtonSingle() // действия после одиночного нажатия кнопки
{
  //При однократном нажатии диод загорается , если еще раз нажать то тухнет.
  //Если однократно нажать на кнопку то он погаснет, вне зависимости как его включили.
  ledToggle();
}


void isButtonDouble() // действия после двойного нажатия кнопки
{
  //При двойном нажатии диод загорается и тухнет через 5 минут
  ledState = true;                    // однозначно включаем LED
  digitalWrite(LED_PIN, ledState);
  ledStartTime = millis();            // начинаем отсчет времени
  Serial.println("LED on. Will turn off after 5 min");
}


void isButtonHold() // действия после удержания кнопки
{
  // здесь код для этого действия
  Serial.println("nothing to do...");
}


void ledToggle()    // функция переключения (инвертирования) LED
{
  ledState = !ledState;
  digitalWrite(LED_PIN, ledState);
  ledState ? Serial.println("LED on"): Serial.println("LED off");
}

Прошу помочь и направить на верный путь, как собрать сие чудо)