RGB LED進階控制、二維陣列、switch case條件判斷

電路接線圖

定義R,G,B接腳位置:

int rgbPin[3] = {21,22,23}; // R,G,B接腳
// R: rgbPin[0] --> 21
// G: rgbPin[1] --> 22
// B: rgbPin[2] --> 23

宣告一個2維陣列,名稱為color,用來定義R,G,B的顏色(有5個元素,每個元素有3筆資料)

int color[5][3] = {{0,0,0},{255,255,255},{255,0,0},{0,255,0},{0,0,255}};  // {Black, White, Red, Green, Blue}

為了閱讀方便,可將陣列內的元素內容分開列出:

int color[5][3] =
{
{0,0,0},            // 0.Black
{255,255,255},      // 1.White
{255,0,0},          // 2.Red
{0,255,0},          // 3.Green
{0,0,255}           // 4.Blue
};
// 0.Black: color[0][] --> {0,0,0}
  // color[0][0] --> 0
  // color[0][1] --> 0
  // color[0][2] --> 0
// 1.White: color[1][] --> {255,255,255}
  // color[1][0] --> 255
  // color[1][1] --> 255
  // color[1][2] --> 255
// 2.Red: color[2][] --> {255,0,0}
  // color[2][0] --> 255
  // color[2][1] --> 0
  // color[2][2] --> 0
// 3.Green: color[3][] --> {0,255,0}
  // color[3][0] --> 0
  // color[3][1] --> 255
  // color[3][2] --> 0
// 4.Blue: color[4][] --> {0,0,255} Blue
  // color[4][0] --> 0
  // color[4][1] --> 0
  // color[4][2] --> 255

若原RGB LED燈的顏色改成2維陣列輸出,可參考下列程式碼:

// 0.Black
analogWrite(rgbPin[0],color[0][0]);  // analogWrite(R, 0);
analogWrite(rgbPin[1],color[0][1]);  // analogWrite(G, 0);
analogWrite(rgbPin[2],color[0][2]);  // analogWrite(B, 0);
// 1.White
analogWrite(rgbPin[0],color[1][0]);  // analogWrite(R, 255);
analogWrite(rgbPin[1],color[1][1]);  // analogWrite(G, 255);
analogWrite(rgbPin[2],color[1][2]);  // analogWrite(B, 255);
// 2.Red
analogWrite(rgbPin[0],color[2][0]);  // analogWrite(R, 255);
analogWrite(rgbPin[1],color[2][1]);  // analogWrite(G, 0);
analogWrite(rgbPin[2],color[2][2]);  // analogWrite(B, 0);
// 3.Green
analogWrite(rgbPin[0],color[3][0]);  // analogWrite(R, 0);
analogWrite(rgbPin[1],color[3][1]);  // analogWrite(G, 255);
analogWrite(rgbPin[2],color[3][2]);  // analogWrite(B, 0);
// 4.Blue
analogWrite(rgbPin[0],color[4][0]);  // analogWrite(R, 0);
analogWrite(rgbPin[1],color[4][1]);  // analogWrite(G, 0);
analogWrite(rgbPin[2],color[4][2]);  // analogWrite(B, 255);

若要顯示陣列中某個顏色,可寫成副程式,將陣列的索引值代入即可:

void show_color(int x)
{
  for(int i=0; i<=2; i++)
  {
    analogWrite(rgbPin[i],color[x][i]);
  }  
}

例如:

// 0.Black
show_color(0);
// 1.White
show_color(1);
// 2.Red
show_color(2);
// 3.Green
show_color(3);
// 4.Blue
show_color(4);

若要隨機產生一個顏色,亦可寫成副程式如下:

/*
  隨機產生任意顏色(由 r, g, b 這3個參數自由組合)
  r = random(256);    // 隨機產生0~255的整數,儲存到 r
  g = random(256);    // 隨機產生0~255的整數,儲存到 g
  b = random(256);    // 隨機產生0~255的整數,儲存到 b
  analogWrite(R, r);  // r: 0 ~ 255
  analogWrite(G, g);  // g: 0 ~ 255
  analogWrite(B, b);  // b: 0 ~ 255
*/

void random_color()
{
  for(int i=0; i<=2; i++)
  {
    analogWrite(rgbPin[i],random(256));
  }
}

switch … case 條件判斷 參考說明

switch(count)
{
  case(1):
    Serial.println("case 1.");
    break;
  case(2):
    Serial.println("case 2.");
    break;              
  case(3):
    Serial.println("case 3.");
    break;
  case(4):
    Serial.println("case 4.");
    break;
  default:        // 以上皆非
    Serial.println("case else.");
    break; 
}

作業練習:

  • 開機後,每間隔0.5秒依序隨機顯示5種不同顏色一次。
  • 每按一下按鈕開關,依序循環顯示下列狀態:
    • 0.Black  {0, 0, 0}
    • 1.White  {255, 255, 255}
    • 2.Red  {255, 0, 0}
    • 3.Green  {0, 255, 0}
    • 4.Blue {0, 0, 255}
    • 5.Yellow  {255, 255, 0}
    • 6.Orange  {255, 127, 0}
    • 7.Purple  {160, 32, 240}
    • 8.Brown  {128, 42, 42}
    • 9.Pink  {255, 0, 255}
  • 各顏色的狀態必須顯示在監看視窗上。
  • 在Wokwi網站上進行模擬,並完成實體接線。