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

при попытки считать коды распознать протокол не удается с использованием библиотеки 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");
}
Прошу помочь и направить на верный путь, как собрать сие чудо)