Arduino紅綠燈是一個有趣的小項目,你可以在一個小時內建成。下面介紹如何使用Arduino構建自己的電路,以及如何為高級變體更改電路。
如果您願意將本教程作為視頻觀看,我們將為您介紹:
除了基本的Arduino,您還需要:
只要有足夠的引腳,幾乎所有的Arduino都會為這個項目工作。如果您不確定您需要什麼型號,請務必閱讀我們的Arduino購買指南。您的Arduino入門套件中可能已經有這些部件。
讓我們從小事做起。一個基本的,單一的紅綠燈是一個很好的開始。電路如下:
將每個LED的陽極(長腿)連接到數字管腳8、9和10(通過220歐姆電阻器)。將陰極(短腿)連接到Arduino的接地上。
從定義變量開始,這樣您就可以通過名稱而不是數字來尋址燈光。開始一個新的Arduino項目,從以下幾行開始:
int red = 10;int yellow = 9;int green = 8;接下來,讓我們添加setup函數,您將在其中配置紅色、黃色和綠色LED作為輸出。由於您已經創建了表示管腳編號的變量,現在可以改為按名稱引用管腳:
void setup(){ pinMode(red, OUTPUT); pinMode(yellow, OUTPUT); pinMode(green, OUTPUT);}pinMode函數配置Arduino以使用給定的引腳作為輸出。你必須這樣做,你的發光二極管的工作。現在來看看紅綠燈的實際邏輯。這是你需要的密碼。在變量定義和設置函數下面添加以下內容:
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,然後運行(確保從Tools>;board and Tools>;port菜單中選擇正確的板和端口)。你應該有一個每15秒改變一次的工作紅綠燈,像這樣(加速):
我們來分解一下代碼。changeLights函數執行所有的艱苦工作。這將使紅綠燈旋轉通過黃色和紅色,然後返回綠色。在循環函數中調用時,Arduino將永遠運行此代碼,每次暫停15秒。
changeLights功能包括四個不同的步驟:
這四個步驟複製了在實際交通信號燈中使用的過程。對於每個步驟,代碼都非常相似。使用digitalWrite打開或關閉相應的LED。這是一個Arduino函數,用於將輸出引腳設置為高(on)或低(off)。
啟用或禁用所需的LED後,延遲會使Arduino等待給定的時間。在這種情況下是3秒鐘。
既然你知道了基礎知識,那就讓我們改進一下吧。增加一個按鈕,讓行人隨時可以改變燈光:
請注意紅綠燈與上一個示例完全相同。將按鈕連接到數字針腳12。你會注意到開關上有一個高阻抗的10k歐姆電阻器,你可能想知道為什麼。這是一個下拉電阻器。
開關可以讓電流流動,也可以不讓電流流動。這看起來很簡單,但在邏輯電路中,電流應該總是以高或低的狀態流動(記住,1或0,高或低)。你可以假設一個沒有被按下的按鈕開關會處於低電平狀態,但事實上,它被稱為“浮動”,因為根本沒有電流被吸引。
在這種浮動狀態下,可能會出現錯誤讀數,因為它會隨著電氣干擾而波動。換句話說,浮動開關既不能提供可靠的高讀數,也不能提供可靠的低讀數。下拉電阻器在開關閉合時保持少量電流流動,從而確保準確的低狀態讀數。
在其他邏輯電路中,你可能會發現一個上拉電阻代替,這工作原理相同,但反過來,確保特定的邏輯門默認為高。
現在,在代碼的循環部分,不是每15秒改變一次燈,而是讀取按鈕開關的狀態,只在激活時改變燈。
首先添加一個新變量來存儲按鈕pin:
int button = 12; // switch is on pin 12現在,在setup函數中,添加一個新行將開關聲明為輸入。添加一條線以將紅綠燈設置為綠色舞臺。如果沒有這個初始設置,它們將關閉,直到第一次運行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語句將永遠不會激活,指示燈也不會更改,程序將再次重新啟動。
下面是它的樣子(加速):
讓我們試試更高級的型號。將電路改為有兩個紅綠燈,而不是人行橫道:
將第二個紅綠燈連接到數字針腳11、12和13。
首先,將新的紅綠燈管腳分配給變量,並將其配置為輸出,如第一個示例中所示:
// light oneint red1 = 10;int yellow1 = 9;int green1 = 8;// light twoint 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 LED和按鈕的新理解適用於各種不同的項目。如果你想擴大這些交通燈,為什麼不建立一個四路(或更多)交叉口,完成許多人行橫道,行人交通燈?你可以編程許多不同的Arduino板容易!
或者為什麼不擴展一個更大的項目,如這個DIY MIDI控制器或與Xod的Arduino機器人你的新技能?您還可以使用VS代碼和PlatformIO查看Arduino編碼。
圖片來源:androsvector/Shutterstock
也許你最近收到了一個Arduino初學者工具包作為禮物,或者你一直聽說修補匠有一個很棒的愛好,你想嘗試一下,或者你是一個Arduino專業人士,只是需要一些有趣的想法來度過假期。如果是這樣,你來對地方了。 ...
... 在本文中,我們將介紹一些基於Arduino的星球大戰專案,你可以在預算。這些專案有的只花了幾美元,有的甚至高達40美元。我們還加入了一些更大專案的連結,雖然沒有一個專案可以說是預算意識強,但...
所以,你有一個Arduino。你已經學會了一些基礎知識,也許你已經按照初學者指南開始了。接下來呢? ...
...duino更適合你的風格,為什麼不看看如何用Arduino**一個MIDI控制器——它是這些Pi音樂專案的完美伴侶! ...
Arduino板和類似的微控制器使創造力比以往任何時候都更容易獲得。無論你是控制LED燈帶,自動化你的家,甚至保護你的財產,這些小奇蹟是大多數DIY電子產品的核心。 ...
Arduino是你能學到的最好的極客愛好之一,因為它涉及到一點點東西:電路、編碼、自己動手、解決問題、創造力等等。但即使你沒有任何這方面的經驗,你仍然應該學習Arduino——即使只是基礎知識。 ...
Arduino板,以及隨之而來的許多價格合理的微控制器,永遠改變了人們的電子愛好。曾經是超級極客的領域,擁有廣泛的電子和計算知識,現在所有人都可以使用。 ...
...奈米是一個多功能板適合幾乎所有DIY電子專案。這些微型控制器使緊湊的DIY硬體開發比以往任何時候都更適合更多的人。 ...
...何工作的基礎知識,並給出一些任何人都能做的簡單DIY Arduino專案的例子。 ...