曾經(jīng)希望您擁有自己的Knight Industries 2000(KITT)汽車-您知道嗎,來自Knight Rider?通過構(gòu)建LED掃描儀,使您的夢想更接近現(xiàn)實!這是最終結(jié)果:
您需要什么
該項目不需要很多零件,您可能已經(jīng)有很多零件了:
1 x Arduino UNO或類似的
1 x面包板
8 x紅色LEDs
8 x 220歐姆電阻
1 x 10k歐姆電位器
公對公連接線
如果您有Arduino入門套件,則很可能所有這些部件都可以(用入門工具可以做什么)套件。)
只要有八個可用的引腳(幾乎從未使用過Arduino?請從這里開始),幾乎任何Arduino都可以使用。您可以使用移位寄存器來控制LED,盡管該項目不需要此操作,因為Arduino具有足夠的引腳。
構(gòu)建計劃
這是一個非常簡單的項目。盡管從大量的電線來看可能看起來很復雜,但是每個單獨的部分都非常簡單。每個發(fā)光二極管(LED)連接到其自己的Arduino引腳。這意味著每個LED均可單獨打開和關閉。電位計連接到Arduino模擬輸入引腳,用于調(diào)整掃描儀的速度。
電路
電位器的外部左引腳(從正面看,引腳在底部)接地。將相反的外部引腳連接到+ 5v。如果不能正常工作,則將這些引腳接反。在2中將中間引腳連接到Arduino模擬量。
將每個LED的陽極(長腳)連接到數(shù)字引腳1至8。將陰極(短腳)連接到Arduino地面。
代碼
創(chuàng)建一個新草圖并將其另存為“ knightRider”。代碼如下:
const int leds[] = {1,2,3,4,5,6,7,8}; // Led pins
const int totalLeds = 8;
int time = 50; // Default speed
void setup() {
// Initialize all outputs
for(int i = 0; i 《= totalLeds; ++i) {
pinMode(leds[i], OUTPUT);
}
}
void loop() {
for(int i = 0; i 《 totalLeds - 1; ++i) {
// Scan left to right
digitalWrite(leds[i], HIGH);
delay(time);
digitalWrite(leds[i + 1], HIGH);
delay(time);
digitalWrite(leds[i], LOW);
}
for(int i = totalLeds; i 》 0; --i) {
// Scan right to left
time = analogRead(2);
digitalWrite(leds[i], HIGH);
delay(time);
digitalWrite(leds[i - 1], HIGH);
delay(time);
digitalWrite(leds[i], LOW);
}
}
讓我們對其進行分解。每個LED引腳都存儲在一個數(shù)組中:
const int leds[] = {1,2,3,4,5,6,7,8};
數(shù)組本質(zhì)上是相關項目的集合。這些元素被定義為常量(“ const”),這意味著它們以后無法更改。盡管建議使用常量,但不必使用常量(如果刪除“ const”,代碼將正常工作)。
使用方括號(“ []”)訪問數(shù)組的元素和一個稱為索引的整數(shù)。索引從零開始,因此“ leds [2]”將返回數(shù)組中的第三個元素—針腳3。數(shù)組使代碼更快地編寫且更易于閱讀,它們使計算機難以完成工作!
一個for循環(huán)用于將每個引腳設置為輸出:
for(int i = 0; i 《= totalLeds; ++i) {
pinMode(leds[i], OUTPUT);
}
此代碼位于“ setup()”函數(shù)內(nèi)部,因為它僅需要在以下位置運行一次程序的開始。 For循環(huán)非常有用。它們允許您一次又一次地運行相同的代碼,每次都使用不同的值。它們非常適合使用數(shù)組。聲明了整數(shù)“ i”,并且只有循環(huán)內(nèi)部的代碼才能訪問此變量(稱為“作用域”)。 i的值從零開始,對于循環(huán)的每次迭代,i都增加1。一旦i的值小于或等于“ totalLeds”變量,則循環(huán)“中斷”(停止)。
i的值用于訪問“ leds”數(shù)組。該循環(huán)訪問數(shù)組中的每個元素,并將其配置為輸出。您可以手動鍵入“ pinMode(pin,OUTPUT)”八次,但是為什么您可以寫八行卻可以寫三行呢?
盡管有些編程語言可以告訴您數(shù)組中有多少個元素(通常使用像array.length這樣的語法),Arduino并沒有使其變得如此簡單(它涉及到更多的數(shù)學運算)。由于數(shù)組中元素的數(shù)目是已知的,所以這不是問題。
在主循環(huán)內(nèi)部( void loop())是另外兩個for循環(huán)。第一個循環(huán)將LED從1 – 8設置為ON,然后關閉。第二個循環(huán)將LED從8 – 1設置為ON,然后關閉。請注意,如何將電流引腳設置為ON,同時將電流引腳加一個也設置為ON。這樣可以確保始終同時有兩個LED,從而使掃描儀看起來更逼真。
在每個循環(huán)開始時,電位計的值都將被讀取到“時間”變量中:/p》 time = analogRead(2);
此操作執(zhí)行兩次,每個循環(huán)一次。這需要不斷檢查和更新。如果此操作不在循環(huán)中,它仍然可以工作,但是會有一個小的延遲-它僅在循環(huán)完成執(zhí)行后才運行。電位計是模擬的,因此為什么要使用“ analogRead(pin)”。這將返回零(最小值)到1023(最大值)之間的值。 Arduino能夠?qū)⑦@些值轉(zhuǎn)換為更有用的值,但是對于這種使用情況,它們是完美的選擇。
更改LED的間隔(或掃描儀的速度)之間的延遲以毫秒為單位(1/1000秒) ),因此最長時間僅為1秒。
高級掃描器
現(xiàn)在,您已經(jīng)了解了基本知識,讓我們來看一下在更復雜的地方。該掃描儀將從外部開始并在工作中成對點亮LED。然后將其反轉(zhuǎn),從內(nèi)部到外部成對發(fā)光。以下是代碼:
const int leds[] = {1,2,3,4,5,6,7,8}; // Led pins
const int totalLeds = 8;
const int halfLeds = 4;
int time = 50; // Default speed
void setup() {
// Initialize all outputs
for(int i = 0; i 《= totalLeds; ++i) {
pinMode(leds[i], OUTPUT);
}
}
void loop() {
for(int i = 0; i 《 (halfLeds - 1); ++i) {
// Scan outside pairs in
time = analogRead(2);
digitalWrite(leds[i], HIGH);
digitalWrite(leds[(totalLeds - i) - 1], HIGH);
delay(time);
digitalWrite(leds[i], LOW);
digitalWrite(leds[(totalLeds - i) - 1], LOW);
delay(time);
}
for(int i = (halfLeds - 1); i 》 0; --i) {
// Scan inside pairs out
time = analogRead(2);
digitalWrite(leds[i], HIGH);
digitalWrite(leds[(totalLeds - i) - 1], HIGH);
delay(time);
digitalWrite(leds[i], LOW);
digitalWrite(leds[(totalLeds - i) - 1], LOW);
delay(time);
}
}
此代碼稍微復雜一些。請注意,兩個循環(huán)如何從零變?yōu)椤?halfLeds – 1”(3)。這使掃描儀更好。如果兩個循環(huán)都從4 – 0和0 – 4變?yōu)檠h(huán),則相同的LED將以相同的順序閃爍兩次-看起來效果不佳。
您現(xiàn)在應該擁有一臺工作正常的Knight Rider LED掃描儀!修改它以使用更多或更大的LED或?qū)崿F(xiàn)您自己的圖案將很容易。該電路很容易移植到Raspberry Pi(是Pi的新功能?從此處開始)或ESP8266。
責任編輯:wv
-
掃描儀
+關注
關注
2文章
417瀏覽量
67823 -
Arduino
+關注
關注
187文章
6464瀏覽量
186681
發(fā)布評論請先 登錄
相關推薦
評論