2020年5月23日 星期六

四.1 8顆LED跑馬燈與霹靂燈顯示實習


在這個實習中會使用同樣的8顆LED電路示範兩種LED的顯示動作一是單方向的跑馬燈顯示控制二是雙向的所謂霹靂燈顯示控制

四.1-1 8顆LED跑馬燈顯示實習

功能與動作說明

1使用ESP8266的8隻GPIO輸出腳控制8顆LED的亮滅亮滅的方式是每次只點亮一顆LED

2每隔0.5秒由左往右動一顆的位置當到達最右邊時回到最左邊重新開始

圖42 跑馬燈LED動作方式與過程


電路圖

圖43 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當到達最右邊時開始反方向由右往左移動在回到最左邊後重複前面的步驟重新開始由左往右移動

 

圖44 霹靂燈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

沒有留言:

張貼留言