#include <LiquidCrystal_I2C.h>
// Pin Definitions
const int pirPin = 32; // ขาเชื่อมต่อกับ PIR sensor เพื่อจับการเคลื่อนไหว
const int trigPin = 33; // ขาส่งสัญญาณ (Trigger) ของเซ็นเซอร์ Ultrasonic
const int echoPin = 34; // ขารับสัญญาณ (Echo) ของเซ็นเซอร์ Ultrasonic
// Variables
long duration; // ตัวแปรเก็บค่าระยะเวลาในการส่งและรับสัญญาณจากเซ็นเซอร์ Ultrasonic
int distance; // ตัวแปรเก็บค่าระยะทางที่คำนวณได้จากเซ็นเซอร์ Ultrasonic
bool motionDetected = false; // ตัวแปรเก็บสถานะการตรวจจับการเคลื่อนไหวจาก PIR sensor
// จอ LCD I2C (16x2)
LiquidCrystal_I2C lcd(0x27, 16, 2); // ที่อยู่ I2C ของจอ LCD อาจเป็น 0x27 หรือ 0x3F
unsigned long previousMillis = 0; // ตัวแปรเก็บเวลาในการเปลี่ยนแปลงการแสดงผล
const long interval = 5000; // เวลาในการเปลี่ยนแปลง (5 วินาที)
int displayMode = 0; // ตัวแปรเก็บโหมดการแสดงผล (0: ระยะทาง, 1: การเคลื่อนไหว)
void setup() {
// เริ่มต้นการสื่อสารผ่าน Serial Monitor เพื่อใช้ในการ debug
Serial.begin(115200);
// กำหนดโหมดของขาแต่ละขา (เช่น INPUT สำหรับเซ็นเซอร์)
pinMode(pirPin, INPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// เริ่มต้นการทำงานของจอ LCD
lcd.init();
lcd.backlight(); // เปิดไฟ backlight ของจอ
lcd.clear(); // ล้างจอเพื่อเตรียมแสดงผล
lcd.setCursor(0, 0); // กำหนดตำแหน่งเริ่มต้นที่บรรทัดแรก
lcd.print("Starting..."); // แสดงข้อความเริ่มต้น
delay(2000); // หน่วงเวลา 2 วินาทีเพื่อแสดงข้อความ
lcd.clear(); // ล้างจออีกครั้ง
}
void loop() {
unsigned long currentMillis = millis(); // อ่านเวลาปัจจุบัน
// อ่านค่าจาก PIR sensor เพื่อตรวจจับการเคลื่อนไหว
motionDetected = digitalRead(pirPin);
// ส่งสัญญาณจาก Trigger ของ Ultrasonic sensor
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// วัดระยะเวลาที่สัญญาณ Echo กลับมา
duration = pulseIn(echoPin, HIGH, 30000); // เพิ่ม timeout เพื่อป้องกันการค้าง
// ตรวจสอบว่า duration ได้รับค่าที่เหมาะสม
if (duration == 0) {
distance = -1; // ใช้ -1 เพื่อระบุว่ามีข้อผิดพลาดในการวัดระยะทาง
} else {
// คำนวณระยะทางจากเวลาที่สัญญาณ Echo กลับมา
distance = duration * 0.0344 / 2;
}
// แสดงผลระยะทางที่วัดได้ใน Serial Monitor
Serial.print("Distance: ");
if (distance == -1) {
Serial.println("Error"); // แสดงข้อความข้อผิดพลาด
} else {
Serial.print(distance);
Serial.println(" cm");
}
// สลับการแสดงผลทุก 5 วินาที
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis; // อัปเดตเวลาในการเปลี่ยนแปลง
displayMode = (displayMode + 1) % 2; // สลับโหมดการแสดงผล
}
// แสดงผลข้อมูลบนจอ LCD ตามโหมดการแสดงผลที่เลือก
lcd.clear(); // ล้างจอเพื่อแสดงข้อมูลใหม่
lcd.setCursor(0, 0); // กำหนดตำแหน่งบรรทัดแรก
if (displayMode == 0) {
lcd.print("Distance: ");
if (distance == -1) {
lcd.print("Error"); // แสดงข้อความข้อผิดพลาด
} else {
lcd.print(distance); // แสดงระยะทางที่วัดได้
lcd.print(" cm");
}
} else {
lcd.print("Motion: ");
lcd.print(motionDetected ? "YES" : "NO"); // แสดงสถานะการตรวจจับการเคลื่อนไหว
}
// หน่วงเวลาเล็กน้อยเพื่อให้ข้อมูลคงที่
delay(5000); // ปรับเวลาตามความต้องการ
}