#include <Wire.h> // ไลบรารีสำหรับ I2C
#include <LiquidCrystal_I2C.h> // ไลบรารีสำหรับ LCD I2C
#include <Servo.h> // ไลบรารีสำหรับ Servo
#include <NewPing.h> // ไลบรารีสำหรับ Ultrasonic Sensor
// กำหนดที่อยู่ของ LCD (ปกติจะเป็น 0x27 หรือ 0x3F ขึ้นอยู่กับโมดูล I2C)
LiquidCrystal_I2C lcd(0x27, 20, 4); // ที่อยู่ I2C, จำนวนคอลัมน์ 20 และจำนวนแถว 4
Servo myServo; // สร้างออบเจ็กต์ Servo
// กำหนดขา Trig และ Echo ของ HC-SR04
#define TRIG_PIN 5
#define ECHO_PIN 6
// กำหนดค่าการวัดระยะห่างสูงสุด (หน่วยเป็น cm)
#define MAX_DISTANCE 200
// สร้างออบเจ็กต์สำหรับ NewPing (ใช้สำหรับควบคุม HC-SR04)
NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE);
// กำหนดค่าเกณฑ์ระยะทางที่ต้องการ
#define THRESHOLD_DISTANCE 50
void setup() {
lcd.init(); // เริ่มต้นการทำงานของ LCD
lcd.backlight(); // เปิดไฟ backlight ของ LCD
lcd.setCursor(0, 0); // ตั้งตำแหน่งของ Cursor บน LCD
lcd.print("Distance(cm):"); // แสดงข้อความ "Distance(cm):"
myServo.attach(9); // กำหนด Servo ให้ควบคุมที่ขา 9
myServo.write(90); // หมุน Servo ไปที่ตำแหน่ง 90 องศา (ตำแหน่งกลาง)
Serial.begin(9600); // เริ่มต้นการเชื่อมต่อ Serial สำหรับการ debug
}
void loop() {
// วัดระยะทางจากเซนเซอร์
unsigned int distance = sonar.ping_cm();
// แสดงระยะทางบน LCD
lcd.setCursor(0, 1); // ตั้งตำแหน่ง Cursor บนแถวที่ 2
lcd.print(" "); // ลบข้อมูลเก่าบนแถวที่ 2
lcd.setCursor(0, 1); // ตั้ง Cursor ที่ตำแหน่งเริ่มต้นอีกครั้ง
lcd.print(distance); // แสดงระยะทาง
lcd.print(" cm"); // แสดงหน่วยเป็นเซนติเมตร
// แสดงข้อมูลใน Serial Monitor
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
// ควบคุมการหมุนของ Servo ตามระยะทางที่วัดได้
if (distance < THRESHOLD_DISTANCE && distance > 0) { // ตรวจสอบว่าระยะต่ำกว่า 50 ซม. และมีค่ามากกว่า 0
myServo.write(180); // หมุน Servo ไปที่ 180 องศา
} else {
myServo.write(0); // หมุน Servo กลับไปที่ 0 องศา
}
delay(500); // หน่วงเวลา 500 ms ก่อนทำงานซ้ำ
}