從單一元件的基礎控制,進階至多個元件協同運作的系統整合,是嵌入式開發的核心挑戰。本章節將前一階段的 LED 控制知識,擴展至一個更貼近真實場景的智慧交通號誌模型。此系統不僅包含主幹道的紅、黃、綠燈循環,更導入了由外部按鈕觸發的行人穿越號誌。這個過程不僅是硬體電路的堆疊,更重要的是軟體層面的邏輯抽象與狀態管理。透過引入全局狀態變數來協調主交通流與行人請求,並規劃模組化的程式結構,為後續利用 Goroutine 處理非同步事件奠定基礎。此專案完整體現了軟硬體整合開發中,如何透過精細的程式邏輯來駕馭複雜的物理互動。
智慧交通控制系統的建構:TinyGo實戰與硬體互動(續)
玄貓深信,從基礎的硬體控制到複雜的系統整合,是高科技養成中不可或缺的環節。在上一章成功點亮LED後,本章將引導開發者運用TinyGo和Arduino UNO,逐步建構一個功能完善的智慧交通控制系統。這不僅涉及多個外部LED的控制,還將引入按鈕輸入、GPIO操作、電阻知識以及TinyGo的Goroutine應用,全面提升硬體與軟體協同開發的能力。
整合行人燈的智慧交通控制系統
玄貓現在將整合之前所學的所有知識,建構一個更為複雜且貼近現實的交通控制系統,其中包含主幹道的紅綠燈以及由按鈕觸發的行人燈。這將涉及更多LED、按鈕以及更精細的程式邏輯。
所需組件
- 五顆LED:建議兩顆紅色(主幹道紅燈、行人紅燈)、一顆黃色(主幹道黃燈)、兩顆綠色(主幹道綠燈、行人綠燈)。
- 五個220歐姆電阻:每個LED一個,用於限流。
- 一個10K歐姆電阻:作為按鈕的下拉電阻。
- 一個四腳按鈕。
- 14條跳線。
建構交通燈與行人燈電路
玄貓將分步驟搭建這個複雜的電路:
主幹道交通燈組件
- 放置紅色LED:陰極G12,陽極G13。
- 放置黃色LED:陰極G15,陽極G16。
- 放置綠色LED:陰極G18,陽極G19。
- 連接紅色LED電阻:220歐姆電阻連接F13和D13。
- 連接黃色LED電阻:220歐姆電阻連接F16和D16。
- 連接綠色LED電阻:220歐姆電阻連接F19和D19。
- 連接紅色LED至GPIO:Arduino數位引腳13連接A13。
- 連接黃色LED至GPIO:Arduino數位引腳12連接A16。
- 連接綠色LED至GPIO:Arduino數位引腳11連接A19。
- 連接LED陰極至接地:F12、F15、F18分別連接麵包板接地線。
行人燈組件
- 放置行人紅燈LED:陰極G22,陽極G23。
- 放置行人綠燈LED:陰極G25,陽極G26。
- 連接行人紅燈電阻:220歐姆電阻連接F23和D23。
- 連接行人綠燈電阻:220歐姆電阻連接F26和D26。
- 連接行人紅燈至GPIO:Arduino數位引腳5連接A23。
- 連接行人綠燈至GPIO:Arduino數位引腳4連接A26。
- 連接行人LED陰極至接地:F22、F25分別連接麵包板接地線。
按鈕與電源組件
- 放置按鈕:將四腳按鈕的左側引腳插入E29和F29,右側引腳插入E31和F31。
- 連接下拉電阻:10K歐姆電阻連接麵包板接地線和B29。
- 連接按鈕至GPIO:Arduino數位引腳2連接C29。
- 連接按鈕至電源:A31連接麵包板電源匯流排的正極。
- 連接麵包板電源:麵包板電源匯流排正極連接Arduino UNO的5V埠。
- 連接麵包板接地:麵包板電源匯流排接地線連接Arduino UNO的GND埠。
這個電路將所有組件整合在一起,形成一個完整的交通控制系統。
@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_
skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100
package "智慧交通控制系統電路架構" {
component "Arduino UNO" as Arduino {
port "D13 (主紅)" as D13
port "D12 (主黃)" as D12
port "D11 (主綠)" as D11
port "D5 (行人紅)" as D5
port "D4 (行人綠)" as D4
port "D2 (按鈕)" as D2
port "5V" as V5
port "GND" as GND_Arduino
}
component "麵包板" as Breadboard {
rectangle "主交通燈LED組" as MainTrafficLEDs {
[主紅LED] as RedLED_Main
[主黃LED] as YellowLED_Main
[主綠LED] as GreenLED_Main
[R220Ω(主紅)] as R_RedMain
[R220Ω(主黃)] as R_YellowMain
[R220Ω(主綠)] as R_GreenMain
}
rectangle "行人燈LED組" as PedestrianLEDs {
[行人紅LED] as RedLED_Ped
[行人綠LED] as GreenLED_Ped
[R220Ω(行人紅)] as R_RedPed
[R220Ω(行人綠)] as R_GreenPed
}
rectangle "按鈕組" as ButtonGroup {
[按鈕] as Button
[R10KΩ(下拉)] as R_PullDown
}
rectangle "電源匯流排" as PowerBus {
port "5V_Bus" as V5_Bus
port "GND_Bus" as GND_Bus
}
}
Arduino -- V5_Bus : 5V
Arduino -- GND_Bus : GND
D13 -- R_RedMain
R_RedMain -- RedLED_Main
RedLED_Main -- GND_Bus
D12 -- R_YellowMain
R_YellowMain -- YellowLED_Main
YellowLED_Main -- GND_Bus
D11 -- R_GreenMain
R_GreenMain -- GreenLED_Main
GreenLED_Main -- GND_Bus
D5 -- R_RedPed
R_RedPed -- RedLED_Ped
RedLED_Ped -- GND_Bus
D4 -- R_GreenPed
R_GreenPed -- GreenLED_Ped
GreenLED_Ped -- GND_Bus
D2 -- Button
Button -- V5_Bus
Button -- R_PullDown
R_PullDown -- GND_Bus
}
@enduml看圖說話:
此圖示描繪了智慧交通控制系統的電路架構,清晰展示了Arduino UNO、麵包板以及各個電子元件之間的連接關係。Arduino UNO作為核心控制器,其數位引腳D13、D12、D11分別連接主交通燈的紅、黃、綠LED,D5和D4則連接行人燈的紅、綠LED。所有LED都串聯了220歐姆的限流電阻,並最終連接到麵包板的接地匯流排。按鈕連接到D2引腳,並透過一個10K歐姆的下拉電阻連接到接地,同時按鈕的另一端連接到5V電源匯流排。麵包板的電源匯流排則直接連接到Arduino UNO的5V和GND埠,為整個電路提供電力。這個架構圖直觀地呈現了所有硬體元件的協同工作方式。
程式邏輯:整合交通燈與行人燈控制
玄貓現在將為這個完整的系統編寫程式碼。為了保持程式碼的清晰和模組化,我們將邏輯分為三個主要部分:初始化邏輯、主邏輯循環和交通燈切換邏輯。
建立專案結構
在Chapter02資料夾下,建立一個名為traffic-lights-pedestrian的新資料夾,並在其中建立main.go檔案。
your_project_root/
├── Chapter02/
│ └── traffic-lights-pedestrian/
│ └── main.go
初始化邏輯
在main函數的開頭,我們需要初始化一些全局變數和引腳配置。
stopTraffic變數:宣告一個布林型變數stopTraffic。這個變數將用於控制交通燈的正常流程是否因行人請求而暫停。
var stopTraffic bool
- 初始化
stopTraffic:在main函數的開始,將stopTraffic設定為false,表示系統啟動時交通燈正常運行。
func main() {
stopTraffic = false
// ... 其他初始化
}
outputConfig變數:宣告並初始化一個PinConfig變數outputConfig,設定為PinOutput模式。這個配置將被傳遞給所有LED引腳。
outputConfig := machine.PinConfig{Mode: machine.PinOutput}
接下來,我們將使用這個outputConfig來配置所有LED引腳。
主邏輯與交通燈邏輯
整個系統的邏輯將圍繞著stopTraffic變數進行。當stopTraffic為false時,主幹道交通燈按正常順序切換;當行人按鈕被按下,stopTraffic變為true時,系統將進入行人過街模式,主幹道紅燈亮起,行人綠燈亮起,等待一段時間後恢復正常。
玄貓將在後續的內容中詳細展開主邏輯循環和交通燈切換邏輯的具體實現,包括如何讀取按鈕狀態、如何協調多個LED的亮滅,以及如何利用Goroutine來實現更流暢的控制。
結論正文:
從效能評估視角審視,本次從單純點亮LED到建構完整交通控制電路的實踐,其核心價值已超越單純的技術演練。相較於純粹的軟體理論,這種從電路佈線、元件選擇到初始變數設定的完整流程,更能建立開發者對系統限制與實體互動的深刻體悟。許多學習者正是在這個從抽象概念轉向具體實作的階段遭遇瓶頸,而成功跨越此障礙,不僅是技術的驗證,更是將系統性思維落實為有形成果的關鍵一步,其價值在於將一個看似簡單的需求,拆解為硬體限制與軟體邏輯的協同運作。
展望未來,接下來的軟體邏輯,特別是Goroutine的應用,將是從靜態控制邁向動態並行處理的關鍵躍升。我們預見,這種軟硬體整合的並行處理能力,將成為未來高階物聯網(IoT)與嵌入式系統開發者的核心競爭力。
玄貓認為,紮實完成當前的硬體建構與基礎設定,是通往後續高階軟體應用的必要修養。對於追求卓越的開發者而言,唯有親手克服實體世界的挑戰,才能真正駕馭程式碼在其中所能發揮的無窮潛力。