#define Red1 16
#define Yellow1 17
#define Green1 18
#define Red2 19
#define Yellow2 32
#define Green2 21
#define Red3 22
#define Yellow3 23
#define Green3 35
#define Trigger1 25 // Trigger สำหรับแยกที่ 1
#define Echo1 26 // Echo สำหรับแยกที่ 1
#define Trigger2 34 // Trigger สำหรับแยกที่ 2
#define Echo2 35 // Echo สำหรับแยกที่ 2
#define Trigger3 27 // Trigger สำหรับแยกที่ 3
#define Echo3 14 // Echo สำหรับแยกที่ 3
long duration;
float distance[3]; // ตัวแปรระยะทางสำหรับแต่ละแยก
int carCount[3] = {0, 0, 0}; // ตัวแปรนับจำนวนรถสำหรับ 3 แยก
bool automaticMode[3] = {false, false, false}; // โหมดอัตโนมัติสำหรับแต่ละแยก
// สวิตช์ควบคุม
#define SelectSwitch 12 // สวิตช์สำหรับเลือกแยก
#define ControlRed 33 // สวิตช์ควบคุมไฟแดง
#define ControlYellow 25 // สวิตช์ควบคุมไฟเหลือง
#define ControlGreen 26 // สวิตช์ควบคุมไฟเขียว
int selectedIntersection = 0; // แยกที่เลือก (0, 1 หรือ 2)
void setup() {
Serial.begin(115200);
// กำหนดพินสำหรับไฟจราจร
pinMode(Red1, OUTPUT);
pinMode(Yellow1, OUTPUT);
pinMode(Green1, OUTPUT);
pinMode(Red2, OUTPUT);
pinMode(Yellow2, OUTPUT);
pinMode(Green2, OUTPUT);
pinMode(Red3, OUTPUT);
pinMode(Yellow3, OUTPUT);
pinMode(Green3, OUTPUT);
// กำหนดพินสำหรับเซ็นเซอร์อัลตราโซนิก
pinMode(Trigger1, OUTPUT);
pinMode(Echo1, INPUT);
pinMode(Trigger2, OUTPUT);
pinMode(Echo2, INPUT);
pinMode(Trigger3, OUTPUT);
pinMode(Echo3, INPUT);
// กำหนดพินสำหรับสวิตช์ควบคุม
pinMode(SelectSwitch, INPUT_PULLUP);
pinMode(ControlRed, INPUT_PULLUP);
pinMode(ControlYellow, INPUT_PULLUP);
pinMode(ControlGreen, INPUT_PULLUP);
// เริ่มต้นด้วยไฟแดงสำหรับทั้งสามแยก
digitalWrite(Red1, HIGH);
digitalWrite(Yellow1, LOW);
digitalWrite(Green1, LOW);
digitalWrite(Red2, HIGH);
digitalWrite(Yellow2, LOW);
digitalWrite(Green2, LOW);
digitalWrite(Red3, HIGH);
digitalWrite(Yellow3, LOW);
digitalWrite(Green3, LOW);
}
void loop() {
// อ่านระยะทางจาก Ultrasonic Sensor ของแต่ละแยก
readDistance();
// เพิ่มจำนวนรถให้กับแยกที่ตรวจจับได้
detectCars();
// ตรวจสอบสวิตช์เพื่อเลือกแยก
selectIntersection();
// แสดงสถานะปัจจุบันของแยกที่เลือก
Serial.print("กำลังควบคุมแยก: ");
Serial.println(selectedIntersection + 1);
// ควบคุมไฟจราจรตามสวิตช์
controlTrafficLights();
// ควบคุมแยกที่ไม่ได้เลือกให้ทำงานตามปกติ
controlOtherIntersections();
delay(100); // ดีเลย์เพื่อให้เห็นการเปลี่ยนแปลง
}
// ฟังก์ชันอ่านระยะทาง
void readDistance() {
// อ่านระยะทางจากแยกที่ 1
digitalWrite(Trigger1, LOW);
delayMicroseconds(2);
digitalWrite(Trigger1, HIGH);
delayMicroseconds(10);
digitalWrite(Trigger1, LOW);
duration = pulseIn(Echo1, HIGH);
distance[0] = (duration * 0.034) / 2;
// อ่านระยะทางจากแยกที่ 2
digitalWrite(Trigger2, LOW);
delayMicroseconds(2);
digitalWrite(Trigger2, HIGH);
delayMicroseconds(10);
digitalWrite(Trigger2, LOW);
duration = pulseIn(Echo2, HIGH);
distance[1] = (duration * 0.034) / 2;
// อ่านระยะทางจากแยกที่ 3
digitalWrite(Trigger3, LOW);
delayMicroseconds(2);
digitalWrite(Trigger3, HIGH);
delayMicroseconds(10);
digitalWrite(Trigger3, LOW);
duration = pulseIn(Echo3, HIGH);
distance[2] = (duration * 0.034) / 2;
// แสดงระยะทาง
Serial.print("ระยะทาง แยก 1: "); Serial.print(distance[0]); Serial.println(" cm");
Serial.print("ระยะทาง แยก 2: "); Serial.print(distance[1]); Serial.println(" cm");
Serial.print("ระยะทาง แยก 3: "); Serial.print(distance[2]); Serial.println(" cm");
}
// ฟังก์ชันเพิ่มจำนวนรถในแยกที่ตรวจจับได้
void detectCars() {
for (int i = 0; i < 3; i++) {
if (distance[i] < 50) { // ถ้าระยะน้อยกว่า 50 cm มีรถ
carCount[i]++; // เพิ่มจำนวนรถในแยกที่ตรวจจับ
} else {
if (carCount[i] > 0) {
carCount[i]--; // ลดจำนวนรถเมื่อไม่มีรถ
}
}
}
Serial.print("จำนวนรถในแยกที่ ");
Serial.print(selectedIntersection + 1);
Serial.print(": ");
Serial.println(carCount[selectedIntersection]);
}
void selectIntersection() {
if (digitalRead(SelectSwitch) == LOW) {
selectedIntersection = (selectedIntersection + 1) % 3; // เปลี่ยนแยก
delay(300);
}
}
void controlTrafficLights() {
if (digitalRead(ControlRed) == LOW) {
setTrafficLights(1);
}
else if (digitalRead(ControlYellow) == LOW) {
setTrafficLights(2);
}
else if (digitalRead(ControlGreen) == LOW) {
setTrafficLights(3);
}
}
void setTrafficLights(int light) {
digitalWrite(Red1 + (selectedIntersection * 3), LOW);
digitalWrite(Yellow1 + (selectedIntersection * 3), LOW);
digitalWrite(Green1 + (selectedIntersection * 3), LOW);
if (light == 1) {
digitalWrite(Red1 + (selectedIntersection * 3), HIGH);
} else if (light == 2) {
digitalWrite(Yellow1 + (selectedIntersection * 3), HIGH);
} else if (light == 3) {
digitalWrite(Green1 + (selectedIntersection * 3), HIGH);
}
}
void controlOtherIntersections() {
for (int i = 0; i < 3; i++) {
if (i != selectedIntersection) {
trafficLightCycle(i);
}
}
}
// ฟังก์ชันสำหรับการทำงานของไฟจราจรในแยกที่ไม่ได้เลือก
void trafficLightCycle(int intersection) {
// เปิดไฟเขียว
digitalWrite(Green1 + (intersection * 3), HIGH);
delay(60000); // ไฟเขียวเปิด 60 วินาที
// เปิดไฟเหลือง
digitalWrite(Green1 + (intersection * 3), LOW);
digitalWrite(Yellow1 + (intersection * 3), HIGH);
delay(5000); // ไฟเหลืองเปิด 5 วินาที
// เปิดไฟแดง
digitalWrite(Yellow1 + (intersection * 3), LOW);
digitalWrite(Red1 + (intersection * 3), HIGH);
delay(30000); // ไฟแดงเปิด 30 วินาที
}