// พินที่ใช้สำหรับไฟจราจร
int signal1[] = {26, 25, 33}; // ไฟจราจรแยก 1 (แดง, เหลือง, เขียว)
int signal2[] = {19, 18, 5}; // ไฟจราจรแยก 2 (แดง, เหลือง, เขียว)
int signal3[] = {17, 16, 15}; // ไฟจราจรแยก 3 (แดง, เหลือง, เขียว)
// พินที่ใช้สำหรับเซ็นเซอร์อัลตราโซนิก
int triggerpin1 = 13, echopin1 = 12;
int triggerpin2 = 27, echopin2 = 14;
int triggerpin3 = 22, echopin3 = 23;
// ตัวแปรสำหรับโหมดการทำงาน
int mode = 0; // 0 = อัตโนมัติ, 1 = ควบคุมด้วยมือ
// ตัวแปรสำหรับการเก็บค่าจำนวนรถจากเซ็นเซอร์
float distance1, distance2, distance3;
void setup() {
Serial.begin(115200);
// กำหนดพินของไฟจราจร
for (int i = 0; i < 3; i++) {
pinMode(signal1[i], OUTPUT);
pinMode(signal2[i], OUTPUT);
pinMode(signal3[i], OUTPUT);
}
// กำหนดพินของเซ็นเซอร์อัลตราโซนิก
pinMode(triggerpin1, OUTPUT);
pinMode(echopin1, INPUT);
pinMode(triggerpin2, OUTPUT);
pinMode(echopin2, INPUT);
pinMode(triggerpin3, OUTPUT);
pinMode(echopin3, INPUT);
// เซ็ตโหมดเริ่มต้นเป็นอัตโนมัติ
mode = 0;
}
void loop() {
if (mode == 0) { // โหมดอัตโนมัติ
// อ่านค่าระยะทางจากเซ็นเซอร์
distance1 = getDistance(triggerpin1, echopin1);
distance2 = getDistance(triggerpin2, echopin2);
distance3 = getDistance(triggerpin3, echopin3);
// คำนวณจำนวนรถจากระยะทาง
int carCount1 = calculateCarCount(distance1);
int carCount2 = calculateCarCount(distance2);
int carCount3 = calculateCarCount(distance3);
// เช็คจำนวนรถเพื่อเลือกแยกที่จะให้ไฟเขียว
if (carCount1 >= carCount2 && carCount1 >= carCount3) {
controlTraffic(signal1, carCount1);
} else if (carCount2 >= carCount1 && carCount2 >= carCount3) {
controlTraffic(signal2, carCount2);
} else {
controlTraffic(signal3, carCount3);
}
} else { // โหมดควบคุมด้วยมือ
manualControl(); // ฟังก์ชันสำหรับควบคุมด้วยสวิตช์
}
}
// ฟังก์ชันสำหรับการควบคุมไฟจราจรในโหมดอัตโนมัติ
void controlTraffic(int signal[], int carCount) {
// ไฟเขียว
digitalWrite(signal[2], HIGH);
delay(carCount > 5 ? 60000 : 30000); // เลือกเวลา 30 หรือ 60 วินาที
// ไฟเหลือง
digitalWrite(signal[2], LOW);
digitalWrite(signal[1], HIGH);
delay(5000); // ไฟเหลืองทำงาน 5 วินาที
// ไฟแดง
digitalWrite(signal[1], LOW);
digitalWrite(signal[0], HIGH);
delay(5000); // ไฟแดงทำงานเท่ากับเวลาไฟเหลือง
// ปิดไฟแดง
digitalWrite(signal[0], LOW);
}
// ฟังก์ชันการอ่านระยะทางจากเซ็นเซอร์อัลตราโซนิก
float getDistance(int triggerPin, int echoPin) {
long duration;
float distance;
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2; // คำนวณระยะทางจากเวลา
return distance;
}
// ฟังก์ชันคำนวณจำนวนรถจากระยะทาง
int calculateCarCount(float distance) {
if (distance < 10) return 10; // รถมาก
if (distance < 20) return 5; // รถปานกลาง
return 1; // รถน้อย
}
// ฟังก์ชันสำหรับควบคุมไฟจราจรด้วยมือ
void manualControl() {
// ตัวอย่างการควบคุมด้วยสวิตช์ สามารถเขียนโค้ดเพิ่มเติมได้
// เช่น การใช้ปุ่มสวิตช์ในการเปลี่ยนสีไฟจราจร
}