陣列、副程式、LED流水燈

電路接線圖

LED流水燈接線圖

陣列:是一種用來儲存多個相同類型資料的資料結構。

資料類型 陣列名稱[內容數量];
int LED[8] = {15, 16, 17, 18, 19, 21, 22, 23};  // 宣告一個整數陣列,名稱為LED,內容物共8筆
// 陣列的索引值從0開始編號,透過索引值可找到相對應的內容
// LED[0] --> 15;
// LED[1] --> 16;
// LED[2] --> 17;
// LED[3] --> 18;
// LED[4] --> 19;
// LED[5] --> 21;
// LED[6] --> 22;
// LED[7] --> 23;
// 宣告輸出腳
for (int i = 0; i <= 7; i++)
{
  pinMode(LED[i], OUTPUT); // 宣告LED[0]~LED[7]其對應的接腳為輸出腳
}
// 全滅
for (int i = 0; i <= 7; i++)
{
  digitalWrite(LED[i], 1); // 設定LED[0]~LED[7]其對應的接腳為HIGH
}
// 全亮
for (int i = 0; i <= 7; i++)
{
  digitalWrite(LED[i], 0); // 設定LED[0]~LED[7]其對應的接腳為LOW
}
// 由右到左,流水燈
for (int i = 0; i <= 7; i++)
{
  digitalWrite(LED[i], 0);
  delay(500);
  digitalWrite(LED[i], 1);
  delay(20);
}
// 由左到右,流水燈
for (int i = 7; i >= 0; i--)
{
  digitalWrite(LED[i], 0);
  delay(500);
  digitalWrite(LED[i], 1);
  delay(20);
}

副程式:用來將代碼封裝成一個可重複使用的單位,有助於提高代碼的可讀性和維護性。

// 全滅
void all_off() // 不帶參數
{
  for (int i = 0; i <= 7; i++)
  {
    digitalWrite(LED[i], 1);
  }
}
// 全亮
void all_on() // 不帶參數
{
  for (int i = 0; i <= 7; i++)
  {
    digitalWrite(LED[i], 0);
  }
}
// 從 x 亮到 y
void led_on(int x, int y)         // 帶參數 x, y
{
  for (int i = x; i <= y; i++)
  {
    digitalWrite(LED[i], 0);
  }
}
// 由右到左,流水燈
void right_to_left(int t1, int t2)    // 帶參數 t1, t2
{
  for (int i = 0; i <= 7; i++)
  {
    digitalWrite(LED[i], 0);
    delay(t1);
    digitalWrite(LED[i], 1);
    delay(t2);
  }
}
// 由左到右,流水燈
void left_to_right(int t1, int t2)    // 帶參數 t1, t2
{
  for (int i = 7; i >= 0; i--)
  {
    digitalWrite(LED[i], 0);
    delay(t1);
    digitalWrite(LED[i], 1);
    delay(t2);
  }
}
// 全亮、全滅各一次
void all_blink(int t1, int t2)    // 帶參數 t1, t2
{
  all_on();
  delay(t1);
  all_off();
  delay(t2);
}
// 右慢去,左快回
void right_left_right(){
  right_to_left(800, 50);
  left_to_right(100, 50);
}
// 左快去,右慢回
void left_right_left(){
  left_to_right(100, 50);
  right_to_left(800, 50);
}

參考範例:

// 廣域變數(到處可用)
int LED[8] = {15, 16, 17, 18, 19, 21, 22, 23};  // 宣告一個整數陣列,名稱為LED,內容物共8筆

void setup() {
  // 宣告輸出腳
  for(int i=0; i<=7; i++)
  {
    pinMode(LED[i], OUTPUT);  // 宣告LED[0]~LED[7]其對應的接腳為輸出腳
  }

  all_off();  //全滅

  delay(1000);

  //all_on();   //全亮  
  led_on(2,6);  //LED[2]~LED[6] 亮

  delay(2000);

  all_off();  //全滅

  delay(1000);
}

void loop() {
  all_on();   //全亮
  all_off();  //全滅
  right_left_right();  // 右慢去,左快回
  left_right_left();   // 左快去,右慢回
}

// 全滅
void all_off()
{
  for(int i=0; i<=7; i++)
  {
    digitalWrite(LED[i], 1);  // 令LED[0]~LED[7]其對應的接腳為HIGH
  }
}

// 全亮
void all_on()
{
  for(int i=0; i<=7; i++)
  {
    digitalWrite(LED[i], 0);  // 令LED[0]~LED[7]其對應的接腳為LOW
  }
}

// 亮某幾個燈
void led_on(int x, int y)     // 帶參數
{
  for(int i=x; i<=y; i++)
  {
    digitalWrite(LED[i], 0);  // 令LED[0]~LED[7]其對應的接腳為LOW
    Serial.print(x);
    Serial.print(",");
    Serial.println(y);

  }  
}

// 由右到左,流水燈
void right_to_left(int t1, int t2)    // 帶參數 t1, t2
{
  for (int i = 0; i <= 7; i++)
  {
    digitalWrite(LED[i], 0);
    delay(t1);
    digitalWrite(LED[i], 1);
    delay(t2);
  }
}

// 由左到右,流水燈
void left_to_right(int t1, int t2)    // 帶參數 t1, t2
{
  for (int i = 7; i >= 0; i--)
  {
    digitalWrite(LED[i], 0);
    delay(t1);
    digitalWrite(LED[i], 1);
    delay(t2);
  }
}

// 右慢去,左快回
void right_left_right(){
  right_to_left(800, 50);
  left_to_right(100, 50);
}

// 左快去,右慢回
void left_right_left(){
  left_to_right(100, 50);
  right_to_left(800, 50);
}

作業練習:

  1. 開機後,全亮全滅快閃2次。
  2. 循環顯示下列狀態:
    • 單個LED,左去,右回。
    • 單個LED,右去,左回。
    • 全亮全滅快閃3次。
    • 2個LED連在一起,左去,右回。
    • 2個LED連在一起,右去,左回。
    • 全滅。
  3. 在Wokwi網站上進行模擬,並完成實體接線。