Подобный вопрос неоднократно всплывает в различных сообществах посещаемых мной и я решил дать на него развернутый ответ.
Нам потребуется:
- Arduino Nano
- приемник ИК сигнала vs1838
- библиотека IRLremote
- библиотека IRremote
- IDE Arduino или PlatformIO
Выход ИК приемника VS1838 (или подобного) необходимо подключать ко входу на котором есть аппаратное прерывание для Arduino Nano это D2 или D3.
 |
Назначение выводов vs1838. |
Скетчь загружаем как обычно:
#define IR_PIN 3 // указываем вывод, к которому подключен приемник
#include "IRLremote.h"
CHashIR IRLremote;
uint32_t IRdata;
void setup()
{
Serial.begin(9600);
IRLremote.begin(IR_PIN); // запускаем прием
Serial.println("Start devis");
}
void loop() {
if ( IRLremote.available()) { // если данные пришли
auto data = IRLremote.read();
IRdata = data.command;
Serial.println(IRdata, HEX);
Serial.println("Next cycle");
switch ( IRdata ) {
case 0xFFA25D:
Serial.println("CH-");
break;
case 0xFFE21D :
Serial.println("CH++");
break;
}
}
}
В коде скетча приведен пример как вы можете распознавать полученый код и выполнять действия в своем скетче, на основе оператора case.
Далее открываем терминал вашего IDE и смотрим коды поступающие при нажатии кнопк пульта.
Составляем таблицу такого плана:
// ----- КНОПКИ ПУЛЬТА -----WavGAT
#define BUTT_UP 0xF39EEBAD
#define BUTT_DOWN 0xC089F6AD
#define BUTT_LEFT 0xE25410AD
#define BUTT_RIGHT 0x14CE54AD
#define BUTT_OK 0x297C76AD
#define BUTT_1 0x4E5BA3AD
#define BUTT_2 0xE51CA6AD
#define BUTT_3 0xE207E1AD
#define BUTT_4 0x517068AD
#define BUTT_5 0x1B92DDAD
#define BUTT_6 0xAC2A56AD
#define BUTT_7 0x5484B6AD
#define BUTT_8 0xD22353AD
#define BUTT_9 0xDF3F4BAD
#define BUTT_0 0xF08A26AD
#define BUTT_START 0x68E456AD
#define BUTT_HASH 0x151CD6AD
// ----- КНОПКИ ПУЛЬТА -----
Или такую:
// ----- КНОПКИ ПУЛЬТА KEYES -----
#if IR_RCT == 2
#define BUTT_UP 0xE51CA6AD
#define BUTT_DOWN 0xD22353AD
#define BUTT_LEFT 0x517068AD
#define BUTT_RIGHT 0xAC2A56AD
#define BUTT_OK 0x1B92DDAD
#define BUTT_1 0x68E456AD
#define BUTT_2 0xF08A26AD
#define BUTT_3 0x151CD6AD
#define BUTT_4 0x18319BAD
#define BUTT_5 0xF39EEBAD
#define BUTT_6 0x4AABDFAD
#define BUTT_7 0xE25410AD
#define BUTT_8 0x297C76AD
#define BUTT_9 0x14CE54AD
#define BUTT_0 0xC089F6AD
#define BUTT_START 0xAF3F1BAD
#define BUTT_HASH 0x38379AD
#endif
// ----- КНОПКИ ПУЛЬТА KEYES -----
Или такую:
// ----- КНОПКИ ПУЛЬТА CAR mp3 -----
/* #define BUTT_UP 0xE207E1AD // CH+
#define BUTT_DOWN 0x4E5BA3AD // CH-
#define BUTT_LEFT 0x517068AD // <<
#define BUTT_RIGHT 0x1B92DDAD // >>
#define BUTT_OK 0xDF3F4BAD // EQ
#define BUTT_1 0x18319BAD // 1
#define BUTT_2 0xF39EEBAD // 2
#define BUTT_3 0x4AABDFAD // 3
#define BUTT_4 0xE25410AD // 4
#define BUTT_5 0x297C76AD // 5
#define BUTT_6 0x14CE54AD // 6
#define BUTT_7 0xAF3F1BAD // 7
#define BUTT_8 0xC089F6AD // 8
#define BUTT_9 0x38379AD // 9
#define BUTT_0 0x68E456AD // ноль
#define BUTT_START 0xAC2A56AD // >||
#define BUTT_HASH 0x151CD6AD
*/
При минимальном уровне сообразительности вы можете взять уже считанные коды из примеров.
Стоит обратить внимание на комментарии к библиотеке Arduino-IRremote.
Если коротко то вам необходимо самостоятельно позаботиться о разрешении конфликтов прерываний при работе с ИК ПДУ, АЦП и др.
Пример работы с библиотекой FastLed и светодиодной лентой ws2812b:
if (!IRLremote.receiving()) // если на ИК приёмник не приходит сигнал
FastLED.show(); // отправить значения на ленту
IR приемник и лента корректно взаимодействуют, если работу с лентой выполнять когда данные на ИК приемник не приходят.