ESP32 + IR Sensor: ตรวจจับวัตถุอินฟราเรด และสั่งงาน LED
Project Overview
ในโปรเจกต์นี้ เราจะทดลองใช้งาน IR Sensor (อินฟราเรดตรวจจับวัตถุ) ร่วมกับบอร์ด ESP32 เพื่อเรียนรู้การทำงานเบื้องต้นของ Interrupt และการควบคุม LED โดยมีเงื่อนไขการทำงานดังนี้
- ✅ ไม่มีวัตถุ → LED ที่ต่อกับขา GPIO 25 กระพริบทุก 500 ms
- ✅ มีวัตถุตัดผ่าน → ESP32 รับสัญญาณจาก IR Sensor แล้วเกิด Interrupt → LED สว่างค้าง 5 วินาที
ก่อนจะเริ่มทำโปรเจกต์ ลองไปทำความรู้จัก ESP32 และฟีเจอร์เด่นที่คุณควรรู้ กันก่อน
📹 วิดีโอสาธิตประกอบการทดลอง
แผนผังวงจรการต่อ IR Sensor กับ ESP32
การต่อวงจรทำง่าย ๆ ดังนี้:
- IR Sensor → ขา GPIO32 ของ ESP32
- LED → ขา GPIO25 ผ่าน R 220Ω–330Ω
- VCC → 3.3V
- GND → GND
ถ้าคุณยังเลือกไม่ถูกว่าจะใช้ GPIO ขาไหนของ ESP32 ให้เริ่มจากบทความ ESP32 DevKit V1 Pinout ก่อน
แต่ถ้าคุณอยากรู้วิธีควบคุม GPIO แบบสั่งเปิด-ปิดหรืออ่านค่าสัญญาณ ให้ต่อด้วยบทความ ESP32 – Digital Read และ Digital Write

ตัวอย่างโค้ด Arduino IDE
ถ้าเพิ่งเริ่มต้นกับ Arduino, ESP32 และไม่แน่ใจว่าจะดาวน์โหลด IDE ยังไง แนะนำให้อ่าน Arduino IDE Download & Install — คู่มือดาวน์โหลดและติดตั้งแบบง่าย ๆ สำหรับมือใหม่
/* Deva DIY */
// กำหนด GPIOs ของ Sensor และ LED
const int led = 25;
const int Sensor = 32;
// ตัวแปร Timer
uint32_t now_time = millis(); // บันทึกเวลาปัจจุบันที่ทำงาน
uint32_t lasttime_trigger = 0; // บันทึกเวลาเมื่อตรวจจับวัตถุ
uint32_t led_time = 0; // เวลากระพริบ LED
// Flag เมื่อเกิด interrupt กำหนดเป็น True
bool Sensor_Check = false;
// ตัวแปรสถานะ HIGH or LOW LED
int State_led = 0;
// เมื่อเซนเซอร์ตรวจพบวัตถุตัดผ่าน เกิด Interrupt
void IRAM_ATTR IRSensordetects() {
Sensor_Check = true;
lasttime_trigger = millis() + 5000;
}
void setup() {
Serial.begin(115200);
// กำหนดให้ pin sensor เป็น INPUT
pinMode(Sensor, INPUT);
// ตั้งค่า Interrupt ในฟังก์ชั่น
attachInterrupt(digitalPinToInterrupt(Sensor), IRSensordetects, FALLING);
// กำหนดให้ LED เป็น OUTPUT
// LED เป็น LOW
pinMode(led, OUTPUT);
digitalWrite(led, State_led);
}
void loop() {
/*
ทุกๆ 500 ms. ให้ LED กระพริบ
เมื่อเซนเซอร์ไม่พบวัตถุตัดผ่าน
*/
if ((led_time <= millis()) && (!Sensor_Check)) {
led_time = millis() + 500;
State_led = !State_led;
digitalWrite(led, State_led);
}
/*
เมื่อมีวัตถุตัดผ่านเซนเซอร์จริง
ให้หลอด LED สว่างค้าง 5 วินาที
*/
now_time = millis();
if (Sensor_Check) {
State_led = 1;
digitalWrite(led, State_led);
Serial.println("SENSOR DETECTED");
delay(100);
// เมื่อ LED สว่างถึง 5 วินาที
if (now_time >= lasttime_trigger) {
Sensor_Check = false;
State_led = 0;
digitalWrite(led, State_led);
}
}
}คำอธิบายโค้ด
- attachInterrupt() → ใช้ตรวจจับสัญญาณจาก IR Sensor แบบ Interrupt
- IRAM_ATTR IRSensordetects() → ฟังก์ชันที่จะทำงานทันทีเมื่อ IR ตรวจจับวัตถุ
- เมื่อ ไม่พบวัตถุ → LED จะกระพริบตามค่า Timer ทุก 500 ms
- เมื่อ ตรวจพบวัตถุ → LED จะติดค้าง 5 วินาที แล้วกลับสู่โหมดกระพริบ
ดาวน์โหลดไฟล์
กรุณา เข้าสู่ระบบ เพื่อดาวน์โหลด
FAQ (คำถามพบบ่อย)
Q1: IR Sensor ใช้ไฟกี่โวลต์?
A: ส่วนใหญ่โมดูล IR ใช้ไฟ 3.3–5V ได้ ใช้กับ ESP32 ได้โดยตรง
Q2: ระยะตรวจจับได้กี่เซนติเมตร?
A: ประมาณ 2–30 ซม. แล้วแต่โมดูลและการปรับโพเทนชิออมิเตอร์
Q3: ใช้ Interrupt แทน digitalRead() ธรรมดาทำไม?
A: Interrupt ทำให้ ESP32 ตอบสนองทันที แม้ใน loop จะทำงานอย่างอื่นอยู่
Q4: ถ้าอยากต่อกับ Relay แทน LED ได้ไหม?
A: ได้ เพียงเปลี่ยนขา LED ไปควบคุม Relay Module
Q5: แสงแดด/แสงไฟฟลูออเรสเซนต์รบกวนไหม?
A: มีผลบ้าง ควรใช้เซนเซอร์ที่มีฟิลเตอร์ IR หรือวางในตำแหน่งร่ม



