สอนใช้งาน IR Sensor ตรวจจับวัตถุอินฟาเรด ร่วมกับ ESP32

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

รูปวงจร: IR Sensor → GPIO32, LED → GPIO25 พร้อม R) การต่อวงจรทำง่าย ๆ ดังนี้: IR Sensor → ขา GPIO32 ของ ESP32 LED → ขา GPIO25 ผ่าน R 220Ω–330Ω VCC → 3.3V GND → GND

ตัวอย่างโค้ด 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 หรือวางในตำแหน่งร่ม

Shopping Cart
Scroll to Top