Вы находитесь тут

Использование произвольного ИК ПДУ с Arduino

Тэги: 
Категории: 

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

Нам потребуется:

  • 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 приемник и лента корректно взаимодействуют, если работу с лентой выполнять когда данные на ИК приемник не приходят.