← До всіх проєктів
Бездротовий зв’язок Початковий

ІЧ-пульт керує ESP32: приймач VS1838B і протокол NEC

Будь-який старий пульт від телевізора стає бездротовою клавіатурою. Приймач VS1838B, бібліотека IRremote 4.x, як влаштований кадр NEC, коди повтору при утриманні кнопки — і три світлодіоди, що перемикаються з пульта.

Складність
Початковий
Час
40 min
Категорія
Бездротовий зв’язок
Оновлено

Про проєкт

Інфрачервоний пульт — найдешевше бездротове керування: жодного 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 на пульт для кондиціонера чи телевізора.