Подключение ИК-приёмника VS1838B к ESP32
Приёмник инфракрасного пульта
ИК-приёмник VS1838B к ESP32 — три провода: питание 3,3 В, земля и выход OUT на GPIO. Приёмник сам демодулирует сигнал 38 кГц и выдаёт цифровой импульс.
Схема подключения ИК-приёмника VS1838B к ESP32
| ИК-приёмник (VS1838B) | ESP32 |
|---|---|
| OUT | GPIO15 |
| VCC | 3V3 |
| GND | GND |
Схема из примера «ИК-пульт: приём кода».
Выводы ИК-приёмник (VS1838B)
| Вывод | Назначение |
|---|---|
| OUT | выход сигнала |
| VCC | питание |
| GND | общий провод |
Код для ESP32
// Приём ИК-пульта на блоке RMT.
//
// Обычным digitalRead этот сигнал не поймать: кадр NEC укладывает
// тридцать два разряда в шестьдесят миллисекунд импульсами по 560 мкс.
// RMT ловит их сам и складывает в память парами «уровень и длительность».
#include <driver/rmt.h>
const rmt_channel_t CH = RMT_CHANNEL_0;
const gpio_num_t IR_PIN = GPIO_NUM_15;
// Допуск на длительность: у настоящих пультов разброс заметный, и
// сравнивать с точностью до микросекунды бессмысленно.
bool near(int value, int want) {
return value > want - 250 && value < want + 250;
}
void setup() {
Serial.begin(115200);
rmt_config_t cfg = RMT_DEFAULT_CONFIG_RX(IR_PIN, CH);
cfg.clk_div = 80; // такт в микросекунду
cfg.mem_block_num = 2; // кадру NEC нужно 68 записей, в блоке 64
cfg.rx_config.idle_threshold = 12000; // тишина 12 мс — конец кадра
cfg.rx_config.filter_en = true;
cfg.rx_config.filter_ticks_thresh = 100;
rmt_config(&cfg);
rmt_driver_install(CH, 1024, 0);
rmt_rx_start(CH, true);
Serial.println("жду пульт");
}
void loop() {
RingbufHandle_t rb = NULL;
rmt_get_ringbuf_handle(CH, &rb);
if (!rb) return;
size_t size = 0;
rmt_item32_t *items = (rmt_item32_t *)xRingbufferReceive(rb, &size, pdMS_TO_TICKS(200));
if (!items) return;
int count = size / sizeof(rmt_item32_t);
// Заголовок: 9 мс несущей и 4.5 мс паузы. По нему кадр и опознаётся.
if (count >= 34 && near(items[0].duration0, 9000) && near(items[0].duration1, 4500)) {
uint32_t code = 0;
for (int i = 1; i <= 32; i++) {
// Разряд задаёт не импульс, а пауза после него: 560 мкс — ноль,
// 1690 — единица.
code = (code << 1) | (items[i].duration1 > 1000 ? 1 : 0);
}
Serial.printf("код 0x%08X\n", code);
} else {
Serial.printf("кадр не похож на NEC: %d записей\n", count);
}
vRingbufferReturnItem(rb, (void *)items);
}
Скетч можно править и запускать в симуляторе без платы и установки среды.
Что учесть на ESP32
- VS1838B работает от 2,7 до 5,5 В: на 3,3 В всё в порядке, и выход совместим с ESP32.
- Приём по аппаратному RMT ESP32 считает длительности импульсов в железе, без прерываний, и не теряет посылки, если
loop()занят.
В железе
Порядок выводов у разных приёмников разный (у VS1838B и TSOP1838 — не совпадает). Сверяйтесь с маркировкой модуля или паспортом.
Частые ошибки при подключении к ESP32
- Целиться пультом мимо приёмника: он видит в конусе около 45° и на расстоянии нескольких метров.
- Ловить пульт на солнце или под люминесцентной лампой: помехи дают случайные коды.
- Код из старых примеров (
irrecv.decode(&results)) не собирается — в IRremote 3+ другой интерфейс:IrReceiver.decode(). - Коды «прыгают» — солнечный свет или люминесцентная лампа засвечивают приёмник.
- Держание кнопки даёт код повтора (у NEC — 0xFFFFFFFF или флаг repeat), а не код кнопки.
- Забыт
resume()— принимается только первая команда.
Ещё по теме
Другие детали для ESP32
HC-SR04DHT22 (AM2302)BME280DS3231SSD1306 OLED 0,96″LCD 1602 с I2CMAX7219TM1637MPU6050 (GY-521)Модуль релеWS2812B (NeoPixel)KY-040Клавиатура 4×4HX711ФоторезисторМодуль microSDRGB-светодиодСервопривод SG9074HC595TFT ST7735 1,8″Шаговый двигательКнопкаПотенциометрПьезопищалкаСветодиодDS18B20Ползунковый переключательHC-SR501TTP223Датчик влажности почвыMQ-2LM35Джойстик KY-023DHT11HTU21DSN65HVD230