Arduino紅綠燈是一個有趣的小項目,您可以在一個小時內完成構建。這是使用Arduino構建自己的方法,以及如何更改電路以實現高級變體。
如果您希望將其作為視頻教程觀看,我們將向您介紹:
構建Arduino交通燈控制器所需的條件
除了基本的Arduino,還需要:
1個10k歐姆電阻器
1個按鈕開關
6個220歐姆電阻器
一塊面包板
連接導線
紅色,黃色和綠色LEDs
只要有足夠的引腳,幾乎任何Arduino都可以用于該項目。如果不確定所需的型號,請確保閱讀我們的Arduino購買指南。您可能已經在Arduino入門套件中包含了這些零件。
Arduino交通燈:基礎知識
讓我們從小處入手。一個基本的單一交通信號燈是一個不錯的起點。這是電路:
將每個LED的陽極(長腳)連接到數字引腳8、9和10(通過220歐姆電阻器) )。將陰極(短腿)連接到Arduino的地面。
Arduino交通燈的代碼
首先定義變量,以便您可以通過名稱而不是數字來尋址燈。開始一個新的Arduino項目,并從以下幾行開始:
int red = 10;
int yellow = 9;
int green = 8;
接下來,讓我們添加設置功能,在其中將紅色,黃色和綠色LED配置為輸出。由于您已經創建了表示引腳號的變量,因此現在可以按名稱引用引腳了:
void setup(){
pinMode(red, OUTPUT);
pinMode(yellow, OUTPUT);
pinMode(green, OUTPUT);
}
pinMode 函數可配置Arduino使用給定的引腳作為輸出。您必須這樣做才能使LED完全正常工作。現在了解交通信號燈的實際邏輯。這是您需要的代碼。在您的變量定義和設置函數下面添加此代碼:
void loop(){
changeLights();
delay(15000);
}
void changeLights(){
// green off, yellow on for 3 seconds
digitalWrite(green, LOW);
digitalWrite(yellow, HIGH);
delay(3000);
// turn off yellow, then turn red on for 5 seconds
digitalWrite(yellow, LOW);
digitalWrite(red, HIGH);
delay(5000);
// red and yellow on for 2 seconds (red is already on though)
digitalWrite(yellow, HIGH);
delay(2000);
// turn off red and yellow, then turn on green
digitalWrite(yellow, LOW);
digitalWrite(red, LOW);
digitalWrite(green, HIGH);
delay(3000);
}
將此代碼上傳到Arduino,然后運行(確保從選擇正確的板卡和端口工具》 面板和工具》 端口菜單)。您應該有一個每15秒更改一次的工作紅綠燈,如下所示(加快):
讓我們分解一下此代碼。 changeLights 功能執行所有艱苦的工作。這樣會將交通信號燈旋轉通過黃色和紅色,然后又變回綠色。當在 loop 函數內部調用該代碼時,Arduino將永久運行該代碼,每次暫停15秒。
changeLights 函數由四個不同的步驟組成:
綠色點亮,黃色熄滅
黃色熄滅,紅色點亮
黃色點亮,紅色點亮
綠色點亮,紅色熄滅,黃色熄滅
這四個步驟復制了實際交通信號燈中使用的過程。對于每個步驟,代碼都非常相似。使用 digitalWrite 可以打開或關閉相應的LED。這是一個Arduino函數,用于將輸出引腳設置為HIGH(高)(打開)或LOW(低)(關閉)。
啟用或禁用所需的LED后,延遲使Arduino等待給定的時間。在這種情況下,需要三秒鐘。
更深入:Arduino人行橫道
現在您已經了解了基礎知識,請對其進行改進。添加一個按鈕,方便行人在需要時改變燈光:
注意交通信號燈與上一個示例完全相同。將按鈕連接到數字引腳12。您會注意到該開關上連接了一個高阻10k歐姆電阻,您可能想知道為什么。這是一個下拉電阻。
一個開關允許電流流過或不讓電流流過。這似乎很簡單,但是在邏輯電路中,電流應始終以高或低狀態(請記住,1或0,HIGH或LOW)流動。您可能會假設沒有被真正按下的按鈕開關處于LOW狀態,但實際上,它被稱為“浮動”狀態,因為根本沒有消耗電流。
在這種浮動狀態狀態下,由于電干擾而波動時,可能會出現錯誤的讀數。換句話說,浮動開關既不能提供可靠的HIGH讀數,也不能提供LOW讀數。下拉電阻器在開關閉合時保持少量電流流動,從而確保了準確的低態讀數。
在其他邏輯電路中,您可能會找到一個上拉電阻器,而這
現在,在代碼的循環部分中,而不是每隔15秒更改一次燈,您將按照相同的原理工作,但要相反,請確保特定的邏輯門默認為高。而是改為讀取按鈕開關的狀態,并且僅在激活時更改燈光。
Arduino人行橫道代碼
首先添加一個新變量來存儲按鈕銷:
int button = 12; // switch is on pin 12
現在,在設置功能中,添加新行以將開關聲明為輸入。添加一行以將交通燈設置為綠色舞臺。如果沒有此初始設置,它們將關閉,直到第一次 changeLights 運行。
pinMode(button, INPUT);
digitalWrite(green, HIGH);
將整個循環功能改為以下內容:
void loop() {
if (digitalRead(button) == HIGH){
delay(15); // software debounce
if (digitalRead(button) == HIGH) {
// if the switch is HIGH, ie. pushed down - change the lights!
changeLights();
delay(15000); // wait for 15 seconds
}
}
}
應該這樣做。您可能想知道為什么按鈕檢查會發生兩次( digitalRead(button)),并間隔一小段時間。這在反跳。就像按鈕的下拉電阻一樣,這種簡單的檢查可以停止代碼以檢測按下按鈕時是否受到干擾。
在 if 語句中等待15秒鐘,紅綠燈至少在這段時間內不能改變。 15秒后,循環將重新啟動。每次循環重新啟動時,它都會再次讀取按鈕的狀態,但是如果不按下按鈕, if 語句將永遠不會激活,指示燈也不會改變,并且程序會再次重新啟動。
這是它的外觀(加速):
帶結的Arduino交通燈
讓我們嘗試更高級的模型。代替人行橫道,將電路更改為具有兩個交通信號燈:
將第二個交通信號燈連接到數字引腳11、12和13。
帶有連接點的Arduino交通燈的代碼
首先,將新的交通燈引腳分配給變量,并將其配置為輸出,如第一個示例所示:
// light one
int red1 = 10;
int yellow1 = 9;
int green1 = 8;
// light two
int red2 = 13;
int yellow2 = 12;
int green2 = 11;
void setup(){
// light one
pinMode(red1, OUTPUT);
pinMode(yellow1, OUTPUT);
pinMode(green1, OUTPUT);
// light two
pinMode(red2, OUTPUT);
pinMode(yellow2, OUTPUT);
pinMode(green2, OUTPUT);
}
現在,更新循環以使用第一個示例中的代碼(而不是人行橫道):
void loop(){
changeLights();
delay(15000);
}
再次,所有工作都在 changeLights 功能中進行。該代碼不會代替紅色》 紅色和黃色》 綠色,而是替換交通信號燈。當一個為綠色時,另一個為紅色。這是代碼:
void changeLights(){
// turn both yellows on
digitalWrite(green1, LOW);
digitalWrite(yellow1, HIGH);
digitalWrite(yellow2, HIGH);
delay(5000);
// turn both yellows off, and opposite green and red
digitalWrite(yellow1, LOW);
digitalWrite(red1, HIGH);
digitalWrite(yellow2, LOW);
digitalWrite(red2, LOW);
digitalWrite(green2, HIGH);
delay(5000);
// both yellows on again
digitalWrite(yellow1, HIGH);
digitalWrite(yellow2, HIGH);
digitalWrite(green2, LOW);
delay(3000);
// turn both yellows off, and opposite green and red
digitalWrite(green1, HIGH);
digitalWrite(yellow1, LOW);
digitalWrite(red1, LOW);
digitalWrite(yellow2, LOW);
digitalWrite(red2, HIGH);
delay(5000);
}
這是(加速)外觀:
Arduino紅綠燈的后續步驟
今天就這些。您對Arduino LED和按鈕的新了解適用于各種不同的項目。如果您想擴展這些交通信號燈,為什么不建一個四通(或更多)路口,并配備許多行人過路處和行人交通信號燈呢?
還是為什么不通過更大的擴展您的新技能DIY MIDI控制器或帶有Xod的Arduino機器人之類的項目?您也可以看看使用VS Code和PlatformIO的Arduino編碼。
責任編輯:wv
-
交通燈
+關注
關注
13文章
323瀏覽量
39729 -
Arduino
+關注
關注
187文章
6464瀏覽量
186665
發布評論請先 登錄
相關推薦
評論