นี่คือโปรเจคสำหรับมือใหม่หัดเล่น ไฟจราจร แต่ไม่ใช่ไฟจราจรธรรมดาแน่นอน! โปรเจคนี้มีทั้งไฟจราจรสำหรับคนข้ามถนนและรถยนต์ทำงานประสานกัน แถมยังมีจอแสดงเวลาว่าไฟคนข้ามจะกลับมาแดงอีกเมื่อไหร่ มีปุ่มกดให้คนข้ามถนนสามารถร้องขอได้ด้วย ตรงนี้แหละที่มันมีลูกเล่น ถ้ามีคนกดปุ่มและข้ามถนนไปแล้ว ไฟรถจะแดงไปเลย แต่ถ้าภายใน 30 วินาทีมีคนกดปุ่มอีกครั้ง ไฟคนข้ามจะกลับมาเขียวอีกที!

Chronological Sequencing: The Traffic Light FSM
การสร้างลำดับไฟจราจรด้วย delay(1000) นี่มันคือการออกแบบเมืองที่ล้มเหลวขั้นพื้นฐานเลยนะเว้ย! ถ้ามีคนข้ามถนนกดปุ่ม "ข้ามถนน" อย่างบ้าคลั่ง ขณะที่ Arduino ของเรากำลังติดแหง็กอยู่ใน delay() 15 วินาทีเพื่อรอให้ไฟเขียวหมดเวลา ตัวประมวลผลจะไม่สนใจพวกเขาเลย และพวกเขาก็ต้องรอจนกว่า loop จะเริ่มใหม่! โปรเจค Pedestrian Crossing Traffic Lights นี้ เราทิ้ง delay() ออกจากสถาปัตยกรรมหลักไปเลย เราใช้ millis() ภายใน Finite State Machine (FSM) แบบเข้มงวดแทน ทำให้ Arduino สามารถดูทั้งนาฬิกาของไฟจราจร และ สถานะของปุ่มกดคนข้ามถนนได้พร้อมกัน 100% แบบไม่ต้องรอ!
The Non-Blocking millis() Execution Core
ฟังก์ชัน delay() นี่มันทำให้แกนซิลิกอนของเราพิการชั่วคราวเลย millis() เนี่ยมันเหมือนกับนาฬิกาจับเวลาที่เดินเงียบๆ อยู่เบื้องหลัง
- Arduino ตรวจสอบนาฬิกาจับเวลานี้เป็นล้านครั้งต่อวินาทีโดยไม่หยุด!
if (currentTime - previousTime >= 5000){ ไฟเหลือง! }- แต่ในเวลาเดียวกัน ภายในลูปเดียวกันนี้ มันก็ตรวจสอบ
if (digitalRead(BUTTON) == LOW)อย่างรวดเร็วด้วย!
unsigned long previousMillis = 0;
const long greenTime = 10000; // 10 seconds of traffic flow natively.
boolean pedestrianWaiting = false;
void loop() {
unsigned long currentMillis = millis(); // Check the watch!
// The brutal BUTTON INTERCEPTOR! Never blocking!
if (digitalRead(pedButton) == LOW) {
pedestrianWaiting = true; // Flag the system!
}
// If the Green time is fully organically up... OR a pedestrian forced an early interrupt!
if (currentMillis - previousMillis >= greenTime || (pedestrianWaiting && currentMillis - previousMillis >= 3000)) {
// If they walk-button was pressed, immediately force Yellow light after 3 baseline seconds!
triggerYellowProtocol();
triggerPedestrianWalk(); // Safely halt traffic entirely!
pedestrianWaiting = false; // Reset the flag cleanly!
previousMillis = currentMillis; // Reset the stopwatch!
}
}
จำลองการทำงานของระบบไฟจราจรในโลกจริง
ระบบไฟจราจรของจริงเค้าใช้ไฟ 240VAC กันเลยนะน้อง ผ่านคอนแทคเตอร์ตัวเบิ้มๆ
- ฉะนั้น เวลาจะจำลองให้มันจิ๋วลงมาให้ Arduino ควบคุมได้ เราก็ใช้ LED 5mm ธรรมดาๆนี่แหละ
- กฎเหล็กเรื่องตัวต้านทาน (Resistor): LED ทุกดวง (แดง, เหลือง, เขียว, คนข้ามแดง, คนข้ามเขียว) ต้องมีตัวต้านทาน
220 โอห์มของตัวเองต่อแบบอนุกรมเท่านั้น! - ห้ามเอาแคโทด (ขาลบ) ของ LED หลายดวงมารวมกันแล้วใช้ตัวต้านทานตัวเดียวนะตัวนี้! เพราะ LED สีแดงต้องการแรงดันตกคร่อม ~2V ส่วนสีเขียวต้องการ ~3.2V ถ้าเอามารวมกัน มันจะทะเลาะกันเองทางไฟฟ้า ทำให้แสงสว่างลดฮวบ และอาจจะเผาไส้ LED สีเขียว (ที่แพงกว่า) เสียหายแบบคาดเดาไม่ได้เลย!

อุปกรณ์ช่างสำหรับสร้างแบบจำลองโครงสร้างพื้นฐาน
- Arduino Uno/Nano (จัดการ Finite State Machine (FSM) แบบมัลติทาสก์ความเร็วสูงได้ฉลุย!)
- ปุ่มอาร์เคดกดหนักๆ (เอาไว้จำลองคนข้ามถนนที่ใจร้อนกดปุ่มร้องขอสัญญาณ "เดิน" แบบสุดพลัง)
- ชุด LED Array (แดง, เหลือง, เขียว) x2 (ชุดนึงสำหรับรถยนต์ อีกชุด [แดง/เขียว] สำหรับคนเดินถนนโดยเฉพาะ)
- ตัวต้านทาน 220 โอห์ม / 330 โอห์ม หลายๆตัว (เพื่อแยกแรงดันตกคร่อมของ LED แต่ละสีให้เป๊ะเวอร์)
- ความเข้าใจลึกซึ้งในตรรกะของ State Machine (โปรเจคนี้สอนแก่นแท้ของการเขียนโปรแกรมฝังตัวด้วย C++ นั่นคือ "State Machines" แบบไม่บล็อกการทำงาน!)