Co je IR přijímač HX1838?
IR přijímač HX1838 umožňuje detekovat signály z infračervených dálkových ovladačů. Po připojení k ESP32 lze tyto signály převést na konkrétní akce v programu – stisk tlačítka na ovladači spustí cokoliv co si naprogramujete.
Velkou výhodou je univerzálnost – funguje jak s přiloženým ovladačem v sadě, tak s libovolným ovladačem z domácnosti, například od televize nebo DVD přehrávače.
Hlavní vlastnosti
- Frekvence 38 kHz – standard pro většinu ovladačů
- Napájení 2,7–5,5V – kompatibilní s ESP32 (3,3V)
- Dosah až 8 metrů, úhel příjmu 60°
- Zapojení na 3 vodiče – VCC, GND, IN
- Kompatibilní s protokolem NEC
Potřebné komponenty
- ESP32
- IR přijímač HX1838
- Dálkový ovladač (přiložený v sadě nebo libovolný z domácnosti)
- Propojovací vodiče
Zapojení
Pin IN (signál) připojte na GPIO 23 ESP32. Pin GND připojte na GND. Pin VCC připojte na 3,3V.
Pohled zepředu na HX1838 (strana s kupolí): levý pin = IN, prostřední = GND, pravý = VCC.
⚠️ Záměna VCC a GND přijímač zničí – před zapnutím zkontrolujte zapojení.
Instalace knihovny
V Arduino IDE otevřete Library Manager, vyhledejte IRremote od shirriff, z3t0, ArminJo a nainstalujte ji.
Kód 1 – zjištění kódů vašeho ovladače
Pokud používáte jiný ovladač než přiložený v sadě, nejdřív zjistěte jeho kódy. Nahrajte tento kód a otevřete Serial Monitor:
1#include <IRremote.hpp>
2
3#define IR_PIN 23
4
5void setup() {
6 Serial.begin(115200);
7 IrReceiver.begin(IR_PIN);
8 Serial.println("Mačkejte tlačítka na ovladači...");
9}
10
11void loop() {
12 if (IrReceiver.decode()) {
13 Serial.print("Kód: 0x");
14 Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
15 IrReceiver.printIRResultShort(&Serial);
16 IrReceiver.resume();
17 }
18}Zapište si kódy všech tlačítek, která chcete použít, a doplňte je do kódu níže.
Kód 2 – kompletní mapování tlačítek ovladače
Tento kód obsahuje přesné kódy pro standardní ovladač přiložený v sadě z drátek.cz (NEC protokol). Při stisku každého tlačítka se v Serial Monitoru zobrazí jeho název:
1#include <IRremote.hpp>
2
3#define IR_PIN 23
4
5void detekceKlaves(uint32_t kod);
6
7void setup() {
8 Serial.begin(115200);
9 IrReceiver.begin(IR_PIN);
10 Serial.println("IR přijímač připraven – čekám na ovladač...");
11}
12
13void loop() {
14 if (IrReceiver.decode()) {
15 // odkomentujte pro zobrazení surového kódu při testování nového ovladače:
16 // Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
17
18 // přeskočení NEC repeat kódu (přidržení tlačítka)
19 if (!(IrReceiver.decodedIRData.flags & IRDATA_FLAGS_IS_REPEAT)) {
20 detekceKlaves(IrReceiver.decodedIRData.decodedRawData);
21 }
22
23 IrReceiver.resume();
24 }
25}
26
27void detekceKlaves(uint32_t kod) {
28 switch (kod) {
29 case 0xFFA25D: Serial.println("Stisknuto: CH-"); break;
30 case 0xFF629D: Serial.println("Stisknuto: CH"); break;
31 case 0xFFE21D: Serial.println("Stisknuto: CH+"); break;
32 case 0xFF22DD: Serial.println("Stisknuto: PREV"); break;
33 case 0xFF02FD: Serial.println("Stisknuto: NEXT"); break;
34 case 0xFFC23D: Serial.println("Stisknuto: PLAY/PAUSE"); break;
35 case 0xFFE01F: Serial.println("Stisknuto: VOL-"); break;
36 case 0xFFA857: Serial.println("Stisknuto: VOL+"); break;
37 case 0xFF906F: Serial.println("Stisknuto: EQ"); break;
38 case 0xFF6897: Serial.println("Stisknuto: 0"); break;
39 case 0xFF9867: Serial.println("Stisknuto: 100+"); break;
40 case 0xFFB04F: Serial.println("Stisknuto: 200+"); break;
41 case 0xFF30CF: Serial.println("Stisknuto: 1"); break;
42 case 0xFF18E7: Serial.println("Stisknuto: 2"); break;
43 case 0xFF7A85: Serial.println("Stisknuto: 3"); break;
44 case 0xFF10EF: Serial.println("Stisknuto: 4"); break;
45 case 0xFF38C7: Serial.println("Stisknuto: 5"); break;
46 case 0xFF5AA5: Serial.println("Stisknuto: 6"); break;
47 case 0xFF42BD: Serial.println("Stisknuto: 7"); break;
48 case 0xFF4AB5: Serial.println("Stisknuto: 8"); break;
49 case 0xFF52AD: Serial.println("Stisknuto: 9"); break;
50 default: Serial.println("Stisknuto: neznámé tlačítko"); break;
51 }
52
53 delay(200);
54}Po nahrání a otevření Serial Monitoru bude výstup vypadat například takto:
1IR přijímač připraven – čekám na ovladač...
2Stisknuto: PREV
3Stisknuto: 0
4Stisknuto: 2
5Stisknuto: VOL+
6Stisknuto: PLAY/PAUSEJak to funguje
Každé stisknuté tlačítko pošle sérii IR pulsů na frekvenci 38 kHz. HX1838 je zachytí, demoduluje a pošle digitální signál na GPIO pin ESP32. Knihovna IRremote změří přesné časování pulsů a dekóduje je na hex kód – ten pak porovnáváme ve funkci detekceKlaves() pomocí switch/case.
Klíčový je řádek s IRDATA_FLAGS_IS_REPEAT – ten přeskočí opakovaný kód, který ovladač posílá při přidržení tlačítka. Bez toho by se jedna akce spouštěla opakovaně.
IrReceiver.resume() musíte volat po každém přijatém signálu, jinak přijímač nečeká na další kód.
Časté problémy
V Serial Monitoru se nic nezobrazuje → Zkontrolujte zapojení – IN pin je vlevo při pohledu na kupoli přijímače → Ověřte že GND a VCC nejsou prohozeny → Zkuste jiný GPIO pin
Kódy neodpovídají mapě výše → Máte jiný ovladač – použijte Kód 1 pro zjištění kódů vašeho ovladače a doplňte je do switch/case
Stejné tlačítko opakuje akci při přidržení → Přidejte kontrolu IRDATA_FLAGS_IS_REPEAT jako v Kódu 2 výše
Možná rozšíření
- Ovládejte LED nebo relé tlačítky ovladače – zapínání a vypínání spotřebičů
- Přidejte servo motor a ovládejte jeho polohu šipkami VOL+/VOL-
- Kombinujte s OLED displejem – zobrazujte název stisknutého tlačítka
- Použijte ovladač jako vstup pro RC auto s motorovým driverem L298N
- Kombinujte s Deep Sleep – ESP32 se probudí při příjmu IR signálu
