Skip to contentSkip to main navigation Skip to footer

Arduino и ИК пульт

Описание


В наборе GyverKIT идёт комплект ИК управления:

  • Пульт с интерфейсом NEC
  • Приёмник TL1838
  • ИК светодиод

С его помощью можно:

  • Управлять своим устройством с пульта (комплектный пульт + приёмник)
  • Управлять своим устройством с любого пульта (от телевизора/люстры + приёмник)
  • Управлять телевизором, эмулируя его пульт (ИК светодиод)
  • Передавать данные с одной Ардуины на другую (ИК светодиод + приёмник), например библиотека GyverTransfer

Подключение


Модуль ИК приёмника подключается следующим образом:

  • S: сигнальный пин, любой цифровой пин МК
  • -: GND
  • Средний (не подписан): VCC

Библиотеки


  • IRremote – очень тяжёлая универсальная “стандартная” библиотека
  • IRLremote – более оптимизированная и продвинутая библиотека от NicoHood
  • NecDecoder – наша библиотека для интерфейса NEC (Hash), на котором работают все китайские пульты

В примерах на этом сайте мы будем использовать NecDecoder как очень лёгкую и простую в использовании. Библиотека идёт в архиве к набору GyverKIT, а свежую версию всегда можно установить/обновить из встроенного менеджера библиотек Arduino по названию NecDecoder. Краткая документация находится по ссылке выше, базовые примеры есть в самой библиотеке.

Примеры


Примеры для библиотеки NecDecoder версии 2.x!

Чтение кодов пульта

Перед использованием нужно знать коды кнопок пульта, загружаем вот этот пример и открываем порт:

// приём команд с пульта
// приёмник подключать на прерывание по FALLING

#include <NecDecoder.h>
NecDecoder ir;

void setup() {
  Serial.begin(9600);
  // подключил на D2, прерывание 0
  attachInterrupt(0, irIsr, FALLING);
}

// в прерывании вызываем tick()
void irIsr() {
  ir.tick();
}

void loop() {
  // если пакет успешно принят
  if (ir.available()) {
    // вывести команду (8 бит)
    Serial.print("0x");
    Serial.println(ir.readCommand(), HEX);
  }
}

Нажимаем кнопку на пульте – получаем её код

Коды кнопок пульта из набора
#define IR_1    0xA2
#define IR_2    0x62
#define IR_3    0xE2
#define IR_4    0x22
#define IR_5    0x2
#define IR_6    0xC2
#define IR_7    0xE0
#define IR_8    0xA8
#define IR_9    0x90
#define IR_STAR 0x68
#define IR_0    0x98
#define IR_HASH 0xB0
#define IR_UP   0x18
#define IR_LEFT 0x10
#define IR_OK   0x38
#define IR_RIGHT 0x5A
#define IR_DOWN 0x4A
Парсим нажатия
// приёмник на D2

#define IR_1    0xA2
#define IR_2    0x62
#define IR_3    0xE2
#define IR_4    0x22
#define IR_5    0x2
#define IR_6    0xC2
#define IR_7    0xE0
#define IR_8    0xA8
#define IR_9    0x90
#define IR_STAR 0x68
#define IR_0    0x98
#define IR_HASH 0xB0
#define IR_UP   0x18
#define IR_LEFT 0x10
#define IR_OK   0x38
#define IR_RIGHT 0x5A
#define IR_DOWN 0x4A

#include <NecDecoder.h>
NecDecoder ir;

void setup() {
  Serial.begin(9600);
  attachInterrupt(0, irIsr, FALLING);
}

void irIsr() {
  ir.tick();
}

void loop() {
  if (ir.available()) {
    switch (ir.readCommand()) {
      // выводим в порт, тут может быть ваш код
      case IR_1: Serial.println("Pressed 1"); break;
      case IR_2: Serial.println("Pressed 2"); break;
      case IR_3: Serial.println("Pressed 3"); break;
      case IR_4: Serial.println("Pressed 4"); break;
      case IR_5: Serial.println("Pressed 5"); break;
      case IR_6: Serial.println("Pressed 6"); break;
      case IR_7: Serial.println("Pressed 7"); break;
      case IR_8: Serial.println("Pressed 8"); break;
      case IR_9: Serial.println("Pressed 9"); break;
      case IR_STAR: Serial.println("Pressed *"); break;
      case IR_0: Serial.println("Pressed 0"); break;
      case IR_HASH: Serial.println("Pressed #"); break;
      case IR_UP: Serial.println("Pressed up"); break;
      case IR_LEFT: Serial.println("Pressed left"); break;
      case IR_OK: Serial.println("Pressed ok"); break;
      case IR_RIGHT: Serial.println("Pressed right"); break;
      case IR_DOWN: Serial.println("Pressed down"); break;
    }
  }
}

Домашнее задание


  • Попробовать примеры из библиотеки IRLremote

 

Полезный пример?

Похожие примеры
9 Комментариев
  • Алекс! Не работает ir.available() если в loop выполняются FastLED.show() и др , ставлю другую(но более большую ) библиотеку, то все работает. Код на гитхабе ,версия 1 не работает версия2 с другой библиотекой работает. Подскажи ,это мой косяк или в библиотеке что-то не так? (код с мусором,грязный,пока тестирую)

  • Спасибо за библиотеку!) Вопрос, а как настроить длительность нажатия? Чтобы, например, команда срабатывала лишь после двух секунд удержания кнопки нажатой. Эдакая защита от случайного нажатия)

  • Попробовал скомпилировать два идентичных скетча (запуск и остановка сирены с пульта, + вывод команд в сериал) с библиотеками NecDecoder и TinyIRReceiver из IRremote. C TinyIRReceiver собралось на ~200 байт компактнее и в консоль команды сыплет более уверенно. NecDecoder не опознал некоторые кнопки. Есть куда допиливать либу.

Оставить комментарий

Ваш адрес email не будет опубликован.