Board and part

ESP32-S3 IR Receiver Simulator: Wiring, Code and a Live Circuit

This is a 38 kHz IR receiver wired to an ESP32-S3 DevKitC-1 with a remote control beside it, decoded live with the IRremote library: open it in the editor, press a button on the remote, and the serial monitor prints its command code.

  • 3.3 V logic
  • Library: IRremote.hpp
  • OUT on GPIO 4
  • NEC protocol, 38 kHz
ESP32-S3 · IR Receiverlive0.000 s 0.00x
Click to open it in the editor
The circuit itself, running on the simulator with the sketch below. Press what can be pressed; click anything else to open it in the editor.
Connections

Wiring the IR Receiver to the ESP32-S3

Three wires to the receiver: power, GND, and OUT to GPIO 4. The remote speaks NEC, the protocol of most cheap kit remotes.

Every connection in the circuit above, with the board’s own pin names.

IR Receiver pinESP32-S3 pinWhy
VCC3V3The VS1838B-style receiver runs from 2.7 to 5.5 V.
GNDGGround.
OUTGPIO 4Low while a 38 kHz burst arrives, high otherwise: the demodulated code.
IR (light)The remoteIn the editor the infrared light path is drawn as a gray wire from the remote.

Power

Power the receiver from 3V3 on the ESP32-S3: its output then swings to 3.3 V, the board’s own level. Fed from 5 V, its output would idle at 5 V on a 3.3 V pin.

Pins to leave alone on the ESP32-S3

GPIO 19 and 20 are the USB port’s data lines, GPIO 35 to 37 belong to the PSRAM on octal-PSRAM boards such as the N8R8, and GPIO 0, 3, 45 and 46 are strapping pins.

On a real bench

The DevKitC-1 has two USB sockets: UART for uploading and the serial monitor, USB for the S3’s own USB device. Plug into UART while you work with the IR Receiver. The board is wide, so a single breadboard leaves only one row free on one side.

The sketch

The code, and what it does.

The sketch the circuit above runs. Open it in the editor, change a line and press Run: it compiles in your browser.

IR receiver on ESP32-S3 GPIO 4
#include <IRremote.hpp>

const int IR_PIN = 4;   // OUT, GPIO 4

void setup() {
  Serial.begin(115200);
  IrReceiver.begin(IR_PIN);
  Serial.println("Point the remote and press a button");
}

void loop() {
  if (IrReceiver.decode()) {
    if (!(IrReceiver.decodedIRData.flags & IRDATA_FLAGS_IS_REPEAT)) {
      Serial.print("Command: 0x");
      Serial.println(IrReceiver.decodedIRData.command, HEX);
    }
    IrReceiver.resume();   // ready for the next one
  }
}

IrReceiver.begin(IR_PIN) starts the IRremote library listening on the pin. decode() returns true once a whole code has arrived, and decodedIRData.command holds the button’s command byte, 0x47 for the button pressed in this demo.

Holding a button makes an NEC remote send short repeat frames, which the library flags with IRDATA_FLAGS_IS_REPEAT. The sketch prints only the first frame of each press. resume() must be called after each code or nothing more is decoded.

Serial.begin(115200) opens the serial monitor. Serial is UART0 on the board’s UART socket, at 115200 baud in this sketch.

Pitfalls

Common mistakes with the IR Receiver on the ESP32-S3

Old IRremote code

Sketches written for IRremote 2.x use IRrecv irrecv(pin), irrecv.enableIRIn() and results.value. Version 3 and later use IrReceiver and decodedIRData, as here. Mixing the two is the most common reason an IR sketch will not compile.

Forgetting resume()

After decode() returns true, the library holds the code until resume() is called. Leave it out and the first button press is the only one you ever see.

Using the USB or PSRAM pins

GPIO 19 and 20 are the USB port’s data lines and GPIO 35 to 37 belong to the PSRAM on N8R8 boards. Wire the receiver output to one of those and the USB socket or the memory stops working on a real board, even though the simulator carries on. Stay on GPIO 4 to 18.

FAQ

Questions and answers

Can I simulate an IR remote with an ESP32-S3 DevKitC-1?

Yes. The circuit at the top of this page is an ESP32-S3 DevKitC-1 with a IR receiver and remote, running in your browser on a simulated ESP32-S3 (Xtensa LX7). Click a button on the simulated remote: it sends a real NEC frame, which the receiver demodulates onto the pin. Press Run it in the editor to change the wiring or the code; it is free and needs no account.

How do I find my remote’s codes?

Run this sketch and press each button: the command printed is the code to compare against. Address and command are both in decodedIRData if you need to tell two remotes apart.

Why does every press print FFFFFFFF?

That is the repeat code of an NEC remote as old versions of the library reported it. The current library flags repeats instead, which the sketch checks.

Which receiver is this?

A three-pin 38 kHz demodulating receiver like the VS1838B or TSOP38238. Check the pin order on yours: it differs between makers.

Build your own IR Receiver project

Open this circuit in the editor, change the wiring or the code, and keep your version in a free account.