在這個實習中會使用同樣的8顆LED電路示範兩種LED的顯示動作,一是單方向的跑馬燈顯示控制,二是雙向的所謂霹靂燈顯示控制。
四.1-1 8顆LED跑馬燈顯示實習
◎ 功能與動作說明:
1、使用ESP8266的8隻GPIO輸出腳控制8顆LED的亮滅,亮滅的方式是每次只點亮一顆LED。
2、每隔0.5秒由左往右動一顆的位置,當到達最右邊時回到最左邊重新開始。
圖4、2 跑馬燈LED動作方式與過程
◎ 電路圖:
圖4、3 8顆LED跑馬燈/霹靂燈電路
◎程式說明與列表:
程式一開始先定義所使用的8隻ESP8266數位輸出腳位,這8隻接腳依序對應到WeMos板子上編號D2~D9的腳位。
1 const byte LED[]={16,5,4,14,12,13,0,2};
接著在初始化(setup())程式區(4~8行)中,將這8隻腳設定為輸出模式:
for(byte i=0;i<8;i++)
pinMode(LED[i],OUTPUT);
而主迴圈程式區(loop())是由兩層會執行8次的”for()”迴圈所組成,由於ESP8266不像早期的8051單晶片那樣有位元組(byte)的IO指令可用,必須1個位元(bit)或是單一輸出腳的方式處理,所以在點亮特定位置的LED之前,必須先將之前已經點亮的LED熄滅,否則到後來8顆會被全部點亮!在我們的電路中是以輸出’0’的方式點亮LED,而內層的”for()”迴圈會輸出8次’1’將8顆LED都熄滅:
14 for(byte j=0;j<8;j++) // 以for()迴圈的方式先將8個LED熄滅
15 digitalWrite(LED[j],1); // 從LED[]陣列中取出對應腳位輸出'1'熄滅LED
然後再由外層的”for()”迴圈點亮特定位置的LED,並顯示0.5秒的時間,這樣的動作會執行8次,然後再重新開始並不斷延續下去,這樣就可以完成跑馬燈的顯示動作。
以下是完整的程式列表:
// 設定8顆LED在ESP8266上所使用的接腳編號
const byte LED[]={16,5,4,14,12,13,0,2};
void setup() {
// 將8顆LED在ESP8266上所使用的接腳以for()迴圈的方式都設定為輸出:
for(byte i=0;i<8;i++)
pinMode(LED[i],OUTPUT);
}
void loop() {
// 以for()迴圈的方式分別將8個LED由左至右點亮:
for(byte i=0;i<8;i++)
{
for(byte j=0;j<8;j++) // 以for()迴圈的方式先將8個LED熄滅
digitalWrite(LED[j],1); // 從LED[]陣列中取出對應腳位輸出'1'熄滅LED
digitalWrite(LED[i],0); // 從LED[]陣列中取出對應腳位點亮選擇到的LED
delay(500); // 等待0.5秒
}
}
程式名稱:led8.ino
四.1-2 8顆LED霹靂燈顯示實習
所謂的霹靂燈,就是雙向的跑馬燈,也就是點亮的LED燈由左至右移動到最右邊之後,會回頭由右往左移動,直到最左邊為止,然後再重新由左往右移動,不斷的重複前面的動作。
◎功能與動作說明:
1、使用ESP8266的8隻GPIO輸出腳控制8顆LED的亮滅,亮滅的方式是每次只點亮一顆LED,每隔0.5秒由左至右移動一顆的位置。
2、當到達最右邊時,開始反方向由右往左移動,在回到最左邊後,重複前面的步驟重新開始由左往右移動。
圖4、4 霹靂燈LED動作方式與過程
◎程式說明與列表:
這個範例程式可以說是上一個跑馬燈程式的擴充版,1~18行的部分和前一個程式完全一樣,會讓LED由左往右移動到最右邊的位置;而新增的”for()”迴圈(20~26行)結構也和上一個相同,只是迴圈控制值是由大到小,這樣選到的LED輸出腳次序會和原來相反,也就是說點亮的LED位置次序會和原來的方向相反。
除此之外,這個迴圈動作只做6次,而且一開始就會移動到右邊的第二顆的位置,由於這個左移迴圈的次數為6,所以移動到左邊的第二顆LED時迴圈就結束,然後重新開始整個程式。之所以要這樣設計,是因為要讓LED跑的動作看起來比較順暢,如果這個LED反方向顯示的迴圈像前一個程式那樣跑8次的話,會發現LED跑到左右兩邊時會有些停頓的感覺,這是因為最左右邊的兩顆LED顯示了兩次,也就是停止的時間變成兩倍,這樣會讓使用者眼睛看起來感覺卡卡的,讀者們不妨自行修改程式試試看。
以下是完整的程式列表:
// 設定8顆LED在ESP8266上所使用的接腳編號
const byte LED[]={16,5,4,0,2,14,12,13};
void setup() {
// 將8顆LED在ESP8266上所使用的接腳以for()迴圈的方式都設定為輸出:
for(byte i=0;i<8;i++)
pinMode(LED[i],OUTPUT);
}
void loop() {
// 以for()迴圈的方式分別將8個LED由左至右點亮:
for(byte i=0;i<8;i++)
{
for(byte j=0;j<8;j++) // 以for()迴圈的方式先將8個LED熄滅
digitalWrite(LED[j],1); // 從LED[]陣列中取出對應腳位輸出'1'熄滅LED
digitalWrite(LED[i],0); //從LED[]陣列中取出對應腳位點亮選擇到的LED
delay(500); // 等待0.5秒
}
// 接著由右至左點亮LED燈,這個方向只做6次:
for(byte i=6;i>0;i--)
{
for(byte j=0;j<8;j++) // 以for()迴圈的方式先將8個LED熄滅
digitalWrite(LED[j],1);
digitalWrite(LED[i],0); //從LED[]陣列中取出對應腳位點亮選擇到的LED
delay(500);
}
}
程式名稱:led8_Pili.ino
沒有留言:
張貼留言