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