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