Posted in

โปรเจค Arduino เครื่องนับคนเข้า-ออก (Bi-Directional Counter) ด้วย IR Sensor

โปรเจค Arduino เครื่องนับคนเข้า-ออก (Bi-Directional Counter) ด้วย IR Sensor

อยากสร้างระบบนับจำนวนคนเข้า-ออกแบบอัตโนมัติไหม? โปรเจคนี้ใช้เพียง Arduino และเซ็นเซอร์ IR 2 ตัว
ก็สามารถสร้างระบบนับจำนวนแบบเรียลไทม์ พร้อมแสดงผลบนหน้าจอ LCD ได้ง่าย ๆ
เหมาะมากสำหรับผู้เริ่มต้น


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


หลักการทำงานของระบบ

ระบบนับคนเข้า-ออกทำงานโดยใช้เซ็นเซอร์ IR จำนวน 2 ตัว วางไว้ที่ทางเข้า/ออก
เพื่อใช้ตรวจจับ “ทิศทางการเคลื่อนที่”

  • ถ้าเซ็นเซอร์ตัวที่ 1 → ตัวที่ 2 → เพิ่มจำนวนเข้า (IN)
  • ถ้าเซ็นเซอร์ตัวที่ 2 → ตัวที่ 1 → เพิ่มจำนวนออก (OUT)

ระบบจะคำนวณจำนวนคนปัจจุบัน และแสดงผลบนหน้าจอ LCD
โดยไม่ต้องใช้ AI หรือกล้องซับซ้อน


โครงสร้างระบบ (System Architecture)

  • IR Sensor → ตรวจจับการเคลื่อนไหว
  • Arduino → ประมวลผลทิศทาง
  • LCD → แสดงผลจำนวนคน

การใช้เซ็นเซอร์ 2 ตัวมีความสำคัญมาก เพราะช่วยให้รู้ “ทิศทาง”
ซึ่งเซ็นเซอร์ตัวเดียวไม่สามารถทำได้


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

  • IR Sensor 1 → ขา D2
  • IR Sensor 2 → ขา D3
  • LCD I2C → SDA / SCL
  • จ่ายไฟ 12V ผ่าน Barrel Jack


หลักการเขียนโปรแกรม

โค้ดจะทำงานโดย:

  • ตรวจสอบว่าเซ็นเซอร์ตัวไหนถูกกระตุ้นก่อน
  • ตรวจสอบเซ็นเซอร์ตัวถัดไปภายในช่วงเวลา (Timeout)
  • ตัดสินใจว่าเป็น “เข้า” หรือ “ออก”
  • อัปเดตค่าและแสดงผลบน LCD

โค้ดโปรแกรม Arduino


#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

const int irPin1 = 2;
const int irPin2 = 3;

int in_count = 0;
int out_count = 0;
int current_count = 0;

const unsigned long timeout = 50;

void setup() {
  lcd.init();
  lcd.backlight();

  lcd.setCursor(0, 0);
  lcd.print("IN: 0   OUT: 0");
  lcd.setCursor(0, 1);
  lcd.print("Current: 0");

  pinMode(irPin1, INPUT_PULLUP);
  pinMode(irPin2, INPUT_PULLUP);
}

void loop() {

  if (digitalRead(irPin1) == LOW) {
    unsigned long startTime = millis();
    while ((millis() - startTime) < timeout) {
      if (digitalRead(irPin2) == LOW) {
        ++in_count;
        updateDisplay();
        break;
      }
    }
    while (!digitalRead(irPin1) || !digitalRead(irPin2));
  }

  else if (digitalRead(irPin2) == LOW) {
    unsigned long startTime = millis();
    while ((millis() - startTime) < timeout) {
      if (digitalRead(irPin1) == LOW) {
        if (out_count < in_count) {
          ++out_count;
          updateDisplay();
          break;
        }
      }
    }
    while (!digitalRead(irPin1) || !digitalRead(irPin2));
  }
}

void updateDisplay() {
  lcd.setCursor(4, 0);
  lcd.print("   ");
  lcd.setCursor(4, 0);
  lcd.print(in_count);

  lcd.setCursor(13, 0);
  lcd.print("   ");
  lcd.setCursor(13, 0);
  lcd.print(out_count);

  current_count = in_count - out_count;

  lcd.setCursor(9, 1);
  lcd.print("   ");
  lcd.setCursor(9, 1);
  lcd.print(current_count);
}

การทดสอบระบบ

  • เดินผ่านเซ็นเซอร์ตามลำดับ → ตรวจสอบค่า IN
  • เดินออก → ตรวจสอบค่า OUT
  • ดูค่าปัจจุบันบน LCD

สรุป

โปรเจคนี้เป็นตัวอย่างที่ดีในการเรียนรู้ระบบตรวจจับทิศทาง
โดยใช้เซ็นเซอร์ IR และ Arduino

สามารถนำไปต่อยอดได้ เช่น:

  • ระบบนับคนในห้าง
  • นับรถในลานจอด
  • ระบบ Smart Building

โปรเจคง่าย ๆ แต่ใช้งานจริงได้ และต่อยอดเป็นระบบใหญ่ได้สบาย