ІЧ-пульт керує ESP32: приймач VS1838B і протокол NEC
Будь-який старий пульт від телевізора стає бездротовою клавіатурою. Приймач VS1838B, бібліотека IRremote 4.x, як влаштований кадр NEC, коди повтору при утриманні кнопки — і три світлодіоди, що перемикаються з пульта.
Про проєкт
Інфрачервоний пульт — найдешевше бездротове керування: жодного Wi-Fi, спарювання чи батареї на приймачі. Приймач VS1838B (або TSOP38238) сам фільтрує несучу 38 кГц і видає чисті цифрові імпульси, а бібліотека IRremote перетворює їх на коди кнопок. Керуватимемо трьома світлодіодами з поширеного 21-кнопкового пульта «Car MP3».
Що знадобиться
- ESP32 DevKit
- ІЧ-приймач VS1838B (окремо або на модулі) + будь-який пульт
- 3 світлодіоди й 3 резистори 220 Ом
- Бібліотека IRremote версії 4.x
Схема
| Приймач | ESP32 |
|---|---|
| OUT (лівий, якщо дивитися на лінзу) | GPIO15 |
| GND (середній) | GND |
| VCC (правий) | 3V3 |
Світлодіоди: GPIO25 / 26 / 27 → 220 Ом → LED → GND.
Розпіновка VS1838B і модулів відрізняється, тож перевірте свою. Переплутані VCC і GND вбивають приймач миттєво.
Протокол NEC
Пульт блимає світлодіодом із частотою 38 кГц, а приймач видає LOW, поки бачить це світло. Кадр NEC:
9 мс LOW │ 4.5 мс HIGH │ 32 біти: адреса, ~адреса, команда, ~команда │ стоп
біт «0»: 562 мкс LOW + 562 мкс HIGH біт «1»: 562 мкс LOW + 1687 мкс HIGH
- Адреса визначає пристрій (у дешевих пультів часто 0x00), команда — кнопку.
- Інверсні копії (~адреса, ~команда) слугують перевіркою: перешкода не перетвориться на хибну команду.
- Утримання кнопки: замість повторення кадру пульт кожні 108 мс шле короткий код повтору. IRremote позначає його прапорцем
IRDATA_FLAGS_IS_REPEAT.
Код
// ІЧ-пульт (NEC, 21 кнопка «Car MP3») → три світлодіоди. Бібліотека IRremote 4.x
#include <IRremote.hpp>
const int IR_PIN = 15;
const int LEDS[] = {25, 26, 27};
bool state[3] = {false, false, false};
void setup() {
Serial.begin(115200);
for (int i = 0; i < 3; i++) pinMode(LEDS[i], OUTPUT);
IrReceiver.begin(IR_PIN, ENABLE_LED_FEEDBACK);
Serial.println("Натискайте 1, 2, 3 або 0 на пульті");
}
void toggle(int i) {
state[i] = !state[i];
digitalWrite(LEDS[i], state[i]);
}
void loop() {
if (!IrReceiver.decode()) return;
IrReceiver.printIRResultShort(&Serial); // протокол, адреса й команда в порт
// утримувана кнопка шле коди повтору: реагуємо лише на перше натискання
if (!(IrReceiver.decodedIRData.flags & IRDATA_FLAGS_IS_REPEAT)) {
switch (IrReceiver.decodedIRData.command) {
case 0x0C: toggle(0); break; // 1
case 0x18: toggle(1); break; // 2
case 0x5E: toggle(2); break; // 3
case 0x16: // 0 — усе вимкнути
for (int i = 0; i < 3; i++) { state[i] = false; digitalWrite(LEDS[i], LOW); }
break;
}
}
IrReceiver.resume(); // готові до наступного коду
}
Як дізнатися коди свого пульта
Залиште в loop() тільки printIRResultShort(&Serial) і resume(), понатискайте кнопки й запишіть значення Command=0x…. Далі підставте їх у switch.
Старі туторіали використовують API IRremote 2.x (IRrecv irrecv(pin); decode_results results; results.value) з кодами на кшталт 0xFFA25D. Це той самий кадр, лише прочитаний у зворотному порядку бітів. Версія 4.x розбирає його на адресу й команду.
Корисно знати
- Сонце й енергоощадні лампи дають ІЧ-шум. Ставте приймач у тінь і додайте 100 нФ між VCC і GND біля нього.
- Не забувайте
resume(), інакше наступні коди не приймаються. - Відправляти теж можна: ІЧ-світлодіод 940 нм через транзистор і
IrSender.sendNEC(адреса, команда, 0)перетворюють ESP32 на пульт для кондиціонера чи телевізора.