อินโฟกราฟิกแสดงโครงงาน ESP32 ที่จอดรถอัตโนมัติ ใช้ IR Sensor ตรวจจับรถเข้า-ออก ควบคุม Servo เปิด-ปิดไม้กั้น พร้อมแสดงจำนวนรถบนจอ LCD พื้นหลังโทนเขียว-น้ำเงิน สื่อถึงระบบ IoT และ Automation

โครงงาน ESP32 ที่จอดรถอัตโนมัติด้วย IR Sensor + Servo Motor

ภาพรวมโครงงาน (Overview)

โครงงานนี้เหมาะสำหรับ นักศึกษา, Maker มือใหม่ หรือช่างไฟฟ้าที่อยากเริ่มทำระบบอัตโนมัติ โดยใช้บอร์ด ESP32 ควบคุม Servo Motor และ IR Sensor เพื่อทำระบบที่จอดรถอัตโนมัติ สามารถนับจำนวนรถเข้า-ออกได้แบบ Real-time และสั่งเปิด/ปิดไม้กั้นอัตโนมัติ

จุดเด่นของระบบนี้:

  • ไม่ต้องใช้คอมพิวเตอร์ควบคุมตลอดเวลา
  • สามารถแสดงผลจำนวนรถคงเหลือผ่านจอ LCD / OLED
  • ขยายระบบเชื่อมต่อ WiFi หรือส่งข้อมูลเข้าแอป Smart Farm / IoT ได้ง่าย
  • เป็นพื้นฐานต่อยอดระบบคิดค่าจอดหรือแจ้งเตือนผ่านมือถือ

อ่านเพิ่มเติม: ESP32 คืออะไร

อุปกรณ์ที่ใช้ (Components)

  1. ESP32 Dev Module
  2. IR Sensor แบบดิจิตอล จำนวน 2 ตัว (ตัวแรกวางที่ทางเข้า, ตัวที่สองวางที่ทางออก)
  3. Servo Motor (แนะนำ SG90 หรือ MG996R ถ้าต้องการแรงบิดสูง)
  4. จอ LCD 16×2 I2C หรือ OLED SSD1306 (ทางเลือก)
  5. สาย Jumper, Breadboard
  6. แหล่งจ่ายไฟ 5V 2A สำหรับ Servo

📌 แนะนำให้ดูการต่อจอ LCD เพิ่มเติม: การใช้งาน LCD I2C กับ ESP32

หลักการทำงานของระบบ (How It Works)

  1. IR Sensor ทำงานแบบ beam break (ตัดลำแสงอินฟราเรด)

  2. เมื่อ IR1 ตรวจจับรถเข้า → เพิ่มตัวแปร carCount++

  3. เมื่อ IR2 ตรวจจับรถออก → ลดตัวแปร carCount--

  4. ถ้า carCount น้อยกว่าหรือเท่ากับ 0 ให้คงค่าไว้ที่ 0 (ป้องกันค่าติดลบ)

  5. Servo Motor ทำหน้าที่เปิด-ปิดไม้กั้นอัตโนมัติ

  6. แสดงจำนวนรถบนจอ LCD / OLED แบบ Real-time

📌 อ่านเพิ่มเติมเกี่ยวกับการควบคุมอุปกรณ์: ESP32 Web Server Control Relay Module

การต่อวงจร (Circuit Diagram)

  • IR1 ต่อเข้าขา GPIO 14 ของ ESP32
  • IR2 ต่อเข้าขา GPIO 27 ของ ESP32
  • Servo ต่อ GPIO 18 (PWM)
  • จอ LCD ต่อ SDA/SCL ของ ESP32
  • Servo ใช้ไฟ 5V จากแหล่งจ่ายภายนอกเพื่อป้องกันรีเซ็ตบอร์ด

ดูภาพรวมตำแหน่งขา GPIO และการใช้งานเพิ่มเติมได้ที่ ESP32 Pinout Devkit V1

โค้ดตัวอย่าง Arduino IDE (Source Code)

กรุณา เข้าสู่ระบบ เพื่อดาวน์โหลด

/*
  ESP32 Auto Parking with IR Sensors + Servo + I2C LCD
  – ใช้ ESP32Servo (รองรับ ESP32)
  พินแนะนำ:
    IR1 -> GPIO14  (Active-LOW)
    IR2 -> GPIO27  (Active-LOW)
    SERVO -> GPIO18 (PWM/LEDC)
    LCD -> I2C (SDA/SCL ของบอร์ด ESP32)
*/

 

#include <ESP32Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// ===== Pin Mapping =====
#define IR1_PIN     14
#define IR2_PIN     27
#define SERVO_PIN   18

 

// ===== Objects =====
Servo gateServo;
LiquidCrystal_I2C lcd(0x27, 16, 2);

 

// ===== State =====
volatile int carCount = 0;
bool ir1Prev = false;
bool ir2Prev = false;

 

// ค่าพัลส์เซอร์โว (us) – ปรับตามรุ่นเซอร์โวของคุณ
const int SERVO_MIN_US = 500;
const int SERVO_MAX_US = 2400;

 

// มุมเปิด/ปิดของไม้กั้น (ปรับได้ตามกลไกจริง)
const int GATE_OPEN_ANGLE  = 90;
const int GATE_CLOSE_ANGLE = 0;

 

// หน่วงกันเด้ง (ms)
const uint16_t DEBOUNCE_MS = 30;

 

// ระยะเวลาถือเปิดไม้กั้น (ms)
const uint16_t GATE_OPEN_TIME = 2000;

 

void setup() {
  Serial.begin(115200);

 

  // IR ส่วนใหญ่เป็น Active-LOW -> ใช้ PULLUP จะนิ่งกว่า
  pinMode(IR1_PIN, INPUT_PULLUP);
  pinMode(IR2_PIN, INPUT_PULLUP);

 

  // Servo
  gateServo.setPeriodHertz(50); // 50Hz สำหรับ servo
  gateServo.attach(SERVO_PIN, SERVO_MIN_US, SERVO_MAX_US);
  closeGate();

 

  // LCD
  lcd.init();
  lcd.backlight();
 
  lcd.clear();
  lcd.setCursor(0, 0); lcd.print(“ESP32 Parking”);
  lcd.setCursor(0, 1); lcd.print(“Car Count: 0”);
  delay(700);
  lcd.clear();
  lcd.setCursor(0, 0); lcd.print(“Car Count:”);
  printCount();
}

 

void loop() {
  // อ่านค่า IR (LOW = ลำแสงถูกตัด)
  bool ir1 = (digitalRead(IR1_PIN) == LOW);
  bool ir2 = (digitalRead(IR2_PIN) == LOW);

 

  // ตรวจจับขอบขึ้น (rising edge) เพื่อกันนับซ้ำ
  if (ir1 && !ir1Prev) {
    carCount++;
    openGatePulse();
    printCount();
  }

 

  if (ir2 && !ir2Prev) {
    carCount–;
    if (carCount < 0) carCount = 0; // กันค่าติดลบ
    openGatePulse();
    printCount();
  }

 

  ir1Prev = ir1;
  ir2Prev = ir2;

 

  delay(DEBOUNCE_MS); // กันเด้งเล็กน้อย
}

 

// ===== Helpers =====
void openGate() {
  gateServo.write(GATE_OPEN_ANGLE);
}

 

void closeGate() {
  gateServo.write(GATE_CLOSE_ANGLE);
}

 

void openGatePulse() {
  openGate();
  delay(GATE_OPEN_TIME);
  closeGate();
}

 

void printCount() {
  lcd.setCursor(10, 1);
  lcd.print(”   “);     // ลบค่าเก่า
  lcd.setCursor(10, 1);
  lcd.print(carCount);
}
เริ่มต้นกับ Arduino esp32 ง่าย ๆ เพียงอ่าน Arduino IDE Guide — อธิบายตั้งแต่การติดตั้งจนถึงการอัปโหลดโค้ดให้บอร์ด

อธิบายโค้ด (Code Explanation) – เวอร์ชัน ESP32

โค้ดนี้ใช้ไลบรารี ESP32Servoเพื่อให้ทำงานได้กับบอร์ด ESP32 โดยไม่ติดปัญหาความเข้ากันของไลบรารีเดิม

  • กำหนดพิน (Pin Mapping)

    • IR1_PIN = GPIO14 สำหรับ IR Sensor ด้านทางเข้า

    • IR2_PIN = GPIO27 สำหรับ IR Sensor ด้านทางออก

    • SERVO_PIN = GPIO18 ใช้ควบคุม Servo Motor แบบ PWM

    • จอ LCD เชื่อมผ่าน I2C (SDA/SCL) ของ ESP32

  • setup()

    1. ตั้งค่า Pin ของ IR Sensor ให้เป็น INPUT_PULLUP เพื่อกันสัญญาณลอย

    2. เริ่มต้น Servo ที่ความถี่ 50Hz และมุมปิดไม้กั้น (closeGate())

    3. เริ่มต้นจอ LCD และแสดงค่าเริ่มต้นของ carCount

  • loop()

    1. อ่านค่าจาก IR1 และ IR2 (Active-LOW → LOW = มีรถตัดลำแสง)

    2. ตรวจจับขอบสัญญาณขึ้น (rising edge) เพื่อป้องกันการนับซ้ำ

      • IR1 ตรวจจับ → carCount++

      • IR2 ตรวจจับ → carCount-- (มีเช็กไม่ให้ติดลบ)

    3. เรียก openGatePulse() เพื่อเปิดไม้กั้น 2 วินาทีแล้วปิด

    4. อัปเดตค่าบนจอ LCD ด้วย printCount()

  • ฟังก์ชันเสริม

    • openGate() / closeGate() → สั่ง Servo เปิดหรือปิด

    • openGatePulse() → เปิดชั่วคราวตามเวลาที่กำหนด

    • printCount() → แสดงจำนวนรถคงเหลือบนจอ LCD

📌 จุดเด่นโค้ดนี้

  • ใช้ไลบรารีที่รองรับ ESP32 โดยตรง → คอมไพล์ผ่านไม่ต้องแก้ core

  • มีระบบ debounce ด้วย delay(DEBOUNCE_MS) เพื่อกันการนับซ้ำจากการสั่นของเซ็นเซอร์

  • ป้องกันค่าจำนวนรถติดลบในตัว

📌 เพิ่มลูกเล่น: ส่งข้อมูลไปหน้าเว็บด้วย ESPAsyncWebServer Guide

การต่อยอดระบบ (Next Steps)

  • เชื่อม WiFi → ส่งข้อมูลเข้า แอป PoPo
  • บันทึก Log จำนวนรถด้วย Preferences
  • ทำระบบคิดค่าจอดโดยจับเวลารถเข้า/ออก
  • เพิ่มเซ็นเซอร์ตรวจจับช่องจอดว่าง
📌 เรียนรู้การบันทึกข้อมูลภาวรด้วย Preferences ถ้าต้องการให้ carCount จำค่าได้แม้ปิดเครื่อง

สรุป (Conclusion)

ระบบ ESP32 ที่จอดรถอัตโนมัติด้วย IR Sensor นี้

  • ทำงานแม่นยำ ใช้งานง่าย

  • ใช้ต้นทุนต่ำ เหมาะสำหรับการเรียนรู้และทำโครงงาน

  • สามารถต่อยอดเป็นระบบจริงขนาดเล็ก หรือเชื่อมต่อ IoT ได้ทันที

คำถามที่พบบ่อย (FAQ – ESP32 Parking)

Q: IR Sensor แบบไหนใช้ได้กับ ESP32?
A: → แบบ Digital Output ทำงานง่ายที่สุด

 

Q: Servo ต้องจ่ายไฟแยกไหม?
A: → แนะนำให้แยก เพื่อป้องกัน ESP32 รีเซ็ต

 

Q: ทำไม carCount ติดลบ?
A: → ต้องมีเงื่อนไขไม่ให้ค่าติดลบในโค้ด

 

Q: ใช้ 3 จุดนับรถได้ไหม?
A: → ได้ แต่ต้องเพิ่มเงื่อนไขในโค้ด

 

Q: ระบบจะพังไหมถ้าไฟดับ?
A: → ถ้าไม่เก็บค่าด้วย Preferences ค่า carCount จะหาย

 

Q: ทำให้เปิด-ปิดช้าลงได้ไหม?
A: → ปรับค่า delay ในฟังก์ชัน openGate() ตัวแปร GATE_OPEN_TIME

 

Q: ใช้จอ OLED แทน LCD ได้หรือไม่?
A: → ได้ เพียงเปลี่ยนไลบรารีและโค้ดแสดงผล

 

Q: ESP32 ต้องต่อกับ Breadboard ตลอดหรือเปล่า?
A: → ไม่จำเป็น ทำเป็น PCB ก็ได้

 

Q: สามารถใช้กับ Arduino UNO ได้ไหม?
A: → ได้ แต่จะไม่มี WiFi ในตัว

 

Q: เชื่อมต่อแอปมือถือควรใช้วิธีไหน?
A: → ใช้ WebSocket หรือ MQTT ผ่าน WiFi

Shopping Cart
Scroll to Top