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