|
LED跑馬燈設(shè)計
1 系統(tǒng)設(shè)計
1.1 設(shè)計要求
1.1.1 設(shè)計任務(wù)
以Arduino為主控制器,一個滑動變阻器對10只LED流水燈效果進(jìn)行快慢控制,實現(xiàn)LED跑馬燈設(shè)計效果。
1.1.2 性能指標(biāo)要求
(1)按照要求獨立完成Arduino程序設(shè)計。
(2)滑動變阻器作為分壓器,用8*8點陣顯示分壓點取整后的電壓值,比如:0V,1V,2V,3V,4V,5V。
(3)通過滑動變阻器調(diào)整10只LED流水的速度,分壓點電壓越高,流水速度越快。
(4)通過按鍵可暫停也可啟動跑馬燈效果。
1.2 設(shè)計思路及設(shè)計框圖
1.2.1設(shè)計思路
主控單元通過C程序編程,實現(xiàn)一個LED跑馬燈設(shè)計。滑動變阻器三個腳,固定的兩個腳一個接5V,一個接GND,滑動端接Arduino其中一個模擬端口,用于采集分壓點的電壓;滑動變阻器對10只LED流水燈效果進(jìn)行快慢控制,實現(xiàn)LED跑馬燈設(shè)計效果,8*8點陣顯示分壓點的電壓值。
1.2.2總體設(shè)計框圖
2 各個模塊程序的設(shè)計
① 點陣圖案(不同情況對應(yīng)不同的圖案):通過開發(fā)板控制顯示不同情況下需要顯示的圖案,如:電壓是5V時候顯示“5”數(shù)字圖案。
②用for函數(shù)來實現(xiàn)流水:依次輸出燈的引腳,讓LED反復(fù)循環(huán)。
③用switch函數(shù)來實現(xiàn)不同電壓的顯示:用模擬引腳的讀書除以200得到變量0~5,再用switch函數(shù)來實現(xiàn)0~5電壓的顯示。
④設(shè)置一個按鈕的子函數(shù):用一個變量來接收燈的位置,當(dāng)按鈕按下時候跑馬燈就會被暫停在此刻。
⑤模擬針腳取滑動變阻:通過程序代碼編寫,analogRead函數(shù)通過讀取滑動變阻器變化,讀模擬引腳, 返回[0-1023]之間的值。得到的值用來當(dāng)做兩個燈之間的delay延遲。
3 調(diào)試過程
①編寫程序,檢查編譯是否出現(xiàn)問題,檢查編譯沒有物體后繼續(xù)下一步。
②在面包板上搭載好LED跑馬燈電路,接入電源,看是否存在短路情況。
③打開Arduino軟件將編寫好的程序燒錄進(jìn)開發(fā)板。
④不觸碰開關(guān),看LED是否按程序的順序進(jìn)行閃爍。
⑤按下開關(guān),看跑馬燈是否受開關(guān)的控制。
⑥觀察點陣圖案和LED燈是否按程序執(zhí)。
⑦扭動滑動變阻器,看是否能控制LED流水的快慢,點陣上面的數(shù)字是否發(fā)生變化。
4 功能測試
4.1 測試儀器與設(shè)備
Arduino開發(fā)板一塊、滑動變阻器一個、面包板一個、數(shù)據(jù)傳輸線一條、8*8點陣一塊、杜邦線若干、發(fā)光二級管(紅燈10個)、開關(guān)(1個)、電阻(220歐10個)、電腦及Arduino軟件;
4.2 性能指標(biāo)測試
LED燈進(jìn)行正常的流水閃爍,安裝在面包板上的按鍵觸發(fā)有效,三腳滑動變阻器可以對10只LED燈效果進(jìn)行快慢控制,點陣屏上可以顯示電壓數(shù)字圖案。
4.3誤差分析
無
代碼:
#include<LedControl.h>
LedControl lc=LedControl(12,11,13,1);
byte d={
{B00000000,B00111100,B00100100,B00100100,B00100100,B00100100,B00100100,B00111100},
{B00000000,B00000100,B00000100,B00000100,B00000100,B00000100,B00000100,B00000100},
{B00000000,B00111100,B00000100,B00000100,B00111100,B00100000,B00100000,B00111100},
{B00000000,B00111100,B00000100,B00000100,B00111100,B00000100,B00000100,B00111100},
{B00000000,B00100100,B00100100,B00100100,B00111100,B00000100,B00000100,B00000100},
{B00000000,B00111100,B00100000,B00100000,B00111100,B00000100,B00000100,B00111100},
};
int dzp=0,a=0,b=1;
void anjian();
void dianzhenping();
void setup() {
lc.shutdown(0,false);
lc.setIntensity(0,3);
lc.clearDisplay(0);
pinMode(10,INPUT_PULLUP);
for(int k=0;k<10;k++)
pinMode(k,OUTPUT);
}
void loop() {
for(int l=0;l<10;l++)
{digitalWrite(l,HIGH);dianzhenping();delay(dzp*2);anjian();
digitalWrite(l,LOW);dianzhenping();}
}
void anjian()
{b=digitalRead(10);
while(b==LOW){b=digitalRead(10);dianzhenping();}}
void dianzhenping()
{dzp=analogRead(1);a=dzp*5/1023;
for(int f=0;f<8;f++)
{lc.setRow(0,f,d[a][f]);}
}
|
|