IR-технология
IR-технология базируется на передаче информации от передатчика к приёмнику с помощью модулированного инфракрасного излучения через окружающую среду. Передатчиком обычно служит излучающий полупроводниковый диод. Приёмником – чувствительный фотодиод. Передаваемое излучение воздействует на чувствительную зону фотодиода, далее происходит процесс демодуляции сигнала и преобразование его в выходной логический сигнал интерфейса.В данном процессе большое внимание уделяется среде, через которую идёт передача сигнала, поскольку именно она в основном влияет на качество сигнала.
Технология инфракрасного излучения в течение нескольких десятилетий зарекомендовала себя с лучшей стороны относительно использования радиочастот. Она позволяет:
- отказаться от использования радиочастот ввиду засорённости радиоэфира;
- обеспечить скоростную передачу любой информации. В этом случае скорость передачи зависит только от использованного светодиода и усилителя.
TSOP22
TSOP22 – представляет собой небольшой приёмник для ИК-сигнала от устройств дистанционного управления. Основными элементами приемника являются N-P-N транзистор (выходной элемент) и светочувствительный диод.Принцип работы данного приёмника основан на воздействии луча на транзистор. При попадании излучения с определённой частотой (обычно это 36, 38, 40 кГц) в чувствительную зону происходит открытие транзистора. Тем самым, можно передавать двоичные сигналы, чередуя длинные и короткие импульсы.
Зона видимости между светодиодом и TSOP22 может составлять до 20 метров.
Как подключить IR Receiver к ESP8266
Подключение IR приемника довольно простое. У приемника три ноги: GND, 5V и DATA. Подключаем его согласно схеме ниже. ИК приемники есть разных типов, внимательно посмотрите datasheet, так как при неправильном подключении, он может выйти из строя.Подключаем библиотеку
Библиотека для работы с приемником не относится к стандартным библиотекам, поэтому её скачиваем здесь. Добавляем, как .ZIP библиотеку.Скетч для ИК приемника ESP8266
Примечание. Большинство приборов поддерживают протокол инфракрасного управления NEC на частоте 38 кГц приведенного в данном скетче. Для получения более подробных данных, используйте скетч из примера по управлению кондиционерами с помощью ESP 8266.
#include <IRremoteESP8266.h>
#include <IRutils.h>
const uint16_t kRecvPin = 2; // D4, ПИН ИК приемника
IRrecv irrecv(kRecvPin);
decode_results results;
void setup() {
Serial.begin(115200);
irrecv.enableIRIn(); // Инициализируем ИК приемник
}
void loop() {
if (irrecv.decode(&results)) { // Если данные пришли, то выполняем код ниже
serialPrintUint64(results.value, HEX); // Вывод в консоль
Serial.println("");
irrecv.resume(); // Принимаем следующий сигнал от приемника
}
delay(50);
}
Немного усложним
Подключим дисплей OLED SSD1306 и выведем на него значение кнопок с пульта дистанционного управления. Статьи по подключению дисплея и вывода русских символов, а также скетч, представлены ниже.Показать / Cкрыть скетч
#include <IRremoteESP8266.h>
#include <IRutils.h>
#include <SSD1306Wire.h>
#include "fontsRus.h" // Добавляем русский шрифт
SSD1306Wire display(0x3c, 5, 4); // D2, D1
const uint16_t kRecvPin = 2; // D4, пин, к которому подключен ИК приемник
IRrecv irrecv(kRecvPin);
decode_results results;
char ircode[10];
void setup() {
Serial.begin(115200);
irrecv.enableIRIn(); // Инициализируем ИК приемник
display.init(); // Инициализируем дисплей
display.flipScreenVertically();
display.setFontTableLookupFunction(FontUtf8Rus);
display.setFont(ArialRus_Plain_10);
display.setContrast(255);
display.clear();
display.drawString(5, 0, "ИК ПРИЕМНИК");
display.drawString(5, 20, "Код кнопки:");
display.drawString(5, 35, "Нет данных");
display.display();
}
void loop() {
if (irrecv.decode(&results)) { // Если данные пришли, то выполняем код ниже
serialPrintUint64(results.value, HEX); // Вывод в консоль
sprintf(ircode, "%X", results.value); // Преобразуем в строку для вывода на дисплей
irrecv.resume();
display.clear();
display.drawString(5, 0, "ИК ПРИЕМНИК");
display.drawString(5, 20, "Код кнопки:");
display.drawString(5, 35, ircode); // Выводим считанный код
display.display();
}
delay(100);
}
// Функция для руссификации текста на дисплее
byte FontUtf8Rus(const byte ch) {
static uint8_t LASTCHAR;
if ((LASTCHAR == 0) && (ch < 0xC0)) {
return ch;
}
if (LASTCHAR == 0) {
LASTCHAR = ch;
return 0;
}
uint8_t last = LASTCHAR;
LASTCHAR = 0;
switch (last) {
case 0xD0:
if (ch == 0x81) return 0xA8;
if (ch >= 0x90 && ch <= 0xBF) return ch + 0x30;
break;
case 0xD1:
if (ch == 0x91) return 0xB8;
if (ch >= 0x80 && ch <= 0x8F) return ch + 0x70;
break;
}
return (uint8_t) 0;
}