IoTLabs

Nghiên cứu, Sáng tạo và Thử nghiệm

Series ESP32 & Cảm biến: Bài 23 – Đọc cảm biến IR Receiver (VS1838B / TSOP): nhận tín hiệu remote & theo dõi realtime

Sau RFID (nhận dạng) và MicroSD (ghi log), chúng ta đến một nhóm rất quen thuộc: điều khiển từ xa bằng hồng ngoại (IR Remote).

Với IR Receiver (VS1838B / TSOP), ESP32 có thể:

  • Nhận tín hiệu từ remote TV, điều hoà, quạt…
  • Chuyển tín hiệu đó thành event IoT
  • Gửi realtime lên IoTLabs Cloud MQTT
  • Làm nền tảng cho Smart Home / Control Panel

1. IR Receiver trong hệ IoT dùng để làm gì?

IR Receiver sinh ra event, không phải sensor liên tục.

Ứng dụng phổ biến:

  • Điều khiển bật/tắt thiết bị
  • Gửi lệnh từ remote → cloud
  • Mô phỏng nút bấm vật lý
  • Làm gateway: IR → MQTT → hệ thống khác

👉 IR rất phù hợp cho Human Interaction IoT.

2. Giới thiệu IR Receiver (VS1838B / TSOP)

Các module IR phổ biến:

  • VS1838B
  • TSOP1738 / TSOP1838

Đặc điểm:

  • Nhận tín hiệu IR tần số 38 kHz
  • Giao tiếp: Digital (1 pin DATA)
  • Hoạt động tốt với hầu hết remote phổ thông

📌 IR Receiver chỉ nhận, không phát (phát sẽ dùng IR LED – bài sau).

3. Chuẩn bị phần cứng & nối dây

Thiết bị

  • ESP32-C3 SuperMini
  • IR Receiver (VS1838B hoặc TSOP)

Kết nối

IR ReceiverESP32-C3
VCC3.3V
GNDGND
DATAGPIO5

📌 Có thể đổi GPIO khác nếu cần.

4. Thư viện sử dụng

Sử dụng thư viện rất phổ biến:

  • IRremote (Arduino-IRremote)

📌 Thư viện này hỗ trợ:

  • NEC
  • Sony
  • Samsung
  • LG
  • Và nhiều protocol khác

5. Ví dụ 1: Nhận tín hiệu remote (local)

#include <IRremote.h>

#define IR_PIN 5

void setup() {
  Serial.begin(115200);
  IrReceiver.begin(IR_PIN, ENABLE_LED_FEEDBACK);
  Serial.println("IR Receiver ready");
}

void loop() {
  if (IrReceiver.decode()) {
    uint32_t code = IrReceiver.decodedIRData.decodedRawData;
    uint8_t protocol = IrReceiver.decodedIRData.protocol;

    Serial.print("Protocol: ");
    Serial.print(protocol);
    Serial.print(" | Code: 0x");
    Serial.println(code, HEX);

    IrReceiver.resume();
  }
}

📌 Nhấn nút remote → bạn sẽ thấy IR code trên Serial.

6. Phân biệt IR “code” và “event”

Một tín hiệu IR hợp lý nên được hiểu là event:

{
  "ts": 1760000000,
  "event": {
    "type": "ir_remote",
    "protocol": "NEC",
    "code": "0xFFA25D"
  }
}

👉 Khác với sensor:

  • Không gửi liên tục
  • Chỉ gửi khi có hành động người dùng

7. Ví dụ 2: Gửi IR event realtime lên IoTLabs Cloud MQTT

#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include <IRremote.h>

#define IR_PIN 5

// ===== WIFI / MQTT =====
const char* WIFI_SSID = "YOUR_WIFI";
const char* WIFI_PASS = "YOUR_PASS";

const char* MQTT_HOST = "mqtt.iotlabs.vn";
const int MQTT_PORT = 8883;
const char* MQTT_USER = "YOUR_MQTT_USER";
const char* MQTT_PASS = "YOUR_MQTT_PASS";

const char* MQTT_TOPIC =
  "iotlabs/<orgId>/devices/<deviceId>/events";

WiFiClientSecure net;
PubSubClient mqtt(net);

void connectWiFi() {
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) delay(500);
}

void connectMQTT() {
  net.setInsecure();
  mqtt.setServer(MQTT_HOST, MQTT_PORT);
  while (!mqtt.connected()) {
    mqtt.connect("esp32c3-ir", MQTT_USER, MQTT_PASS);
    delay(1000);
  }
}

void setup() {
  Serial.begin(115200);
  IrReceiver.begin(IR_PIN, ENABLE_LED_FEEDBACK);

  connectWiFi();
  connectMQTT();
}

void loop() {
  if (!mqtt.connected()) connectMQTT();
  mqtt.loop();

  if (IrReceiver.decode()) {
    uint32_t code = IrReceiver.decodedIRData.decodedRawData;
    uint8_t protocol = IrReceiver.decodedIRData.protocol;

    long ts = millis() / 1000;

    String payload = "{";
    payload += "\"ts\":" + String(ts) + ",";
    payload += "\"event\":{";
    payload += "\"type\":\"ir_remote\",";
    payload += "\"protocol\":" + String(protocol) + ",";
    payload += "\"code\":\"0x" + String(code, HEX) + "\"";
    payload += "}}";

    mqtt.publish(MQTT_TOPIC, payload.c_str());
    Serial.println(payload);

    IrReceiver.resume();
  }
}

8. Kinh nghiệm thực tế khi dùng IR Receiver

  • Tránh ánh sáng mặt trời chiếu trực tiếp
  • Nên debounce (delay nhẹ) để tránh double event
  • Mapping:
    • IR code → hành động (ON / OFF / MODE)
  • Có thể kết hợp:
    • IR + Relay
    • IR + MQTT Rule
    • IR + Cloud Dashboard

9. Ứng dụng thực tế từ Bài 23

Sau bài này, bạn có thể:

  • Làm Smart Remote Hub
  • Điều khiển thiết bị từ remote → cloud
  • Log lịch sử thao tác người dùng
  • Kết hợp IR + RFID + RTC để tạo hệ điều khiển thông minh

👉 Đây là bước rất gần Smart Home thật sự.

10. Tổng kết Bài 23

Bạn đã:

  • Đọc tín hiệu IR remote bằng ESP32
  • Hiểu event-driven IoT
  • Gửi sự kiện realtime lên IoTLabs Cloud
  • Mở rộng hệ IoT sang tương tác con người