1. 程式人生 > >Arduino 點亮RGB彩色流水燈

Arduino 點亮RGB彩色流水燈

實驗的效果是 6個RGB彩色流水燈依次點亮,顏色變化依次為:紅色-綠色-藍色-白色-黃色-青色,如下圖。

有個實驗的小視訊,也可以看下效果:

一、準備材料

Arduino uno R3 開發板:1

杜邦線:10

RGB彩色流水燈模組:1

二、原理介紹

樹莓派GPIO控制RGB彩色LED燈 中,介紹了RGB彩色流水燈的原理以及點亮一個LED燈的方法。本篇文章,我們用程式碼實現依次點亮LED燈,在點亮的同時,改變RGB的輸出值,就可以改變RGB燈顯示的顏色,從而實現彩色的流水燈。

硬體使用了一個RGB彩色流水燈模組,模組上集成了8個共陽RGB彩色LED燈,使用時只需要將模組上的引腳接到Arduino uno R3開發板上即可,不用自己連線電阻,方便了使用。要注意的是,由於我杜邦線不夠,所以就只是用了模組上的6個RGB燈。如果你要控制8個RGB燈,你應該修改我使用的程式碼。

Arduino控制RGB彩色燈就需要使用PWM輸出,本文使用analogWrite函式來產生PWM。脈寬調製(PWM)是一種用數字手段獲得模擬結果的技術。數字控制用於產生方波,訊號在只能在開與關之間切換。這種開關模式通過改變高電平持續時間與低電平持續時間比值,可以模擬在開(5伏)和關閉(0伏)之間的任一模擬電壓。高電平持續時間稱為為脈衝寬度。為了獲得不同的模擬值,可以改變或調整脈衝寬度。

analogWrite(pin, val)命令 :其中pin是引腳的編號,在uno R3上只能使用3,5,6,9,10,11這幾個引腳;val是0~255的整數值,對應電壓從0到+5V,不同的值對應不同的佔空比,通過控制佔空比從而模擬出不同的模擬電壓值,實現PWM控制。不同的值對應的佔空比如下:

產生PWM的示例程式碼:

int pin = 11; //可以選擇3,5,6,9,10,11

void setup()
{
    pinMode(pin, OUTPUT);
}   

void loop()
{
    analogWrite(pin, 127);
    delay(500);
}

這種方式產生的方波週期大概是2ms左右(490Hz),佔空比位50%,產生方波不需要佔用額外的cpu命令時間。

三、硬體連線

RGB彩色流水燈模組的引腳與UNO的連線對應關係如下:

RGB LED ———— Arduino UNO R3

R ————9

G ———— 11

B ————10

VCC —— 5V

D0————2

D1————3

D2 ———— 4

D3 ———— 5

D4 ———— 6

D5 ———— 7

四、流水燈程式碼

點亮6個RGB彩色流水燈的程式碼如下,顏色變化順序為:紅色-綠色-藍色-白色-黃色-青色

/*
 * 作者:科技愛好者部落格
 * 時間:2017年6月11日12:46:41
 * IDE版本號:1.8.2
 * 釋出地址:http://blog.lxx1.com
 * 作用:共陽RGB流水燈迴圈點亮
*/

//定義RGB燈顏色控制引腳
int R=9;
int G=11;
int B=10;

int t=1000; //延時時間控制

void setup() {
  // put your setup code here, to run once:
  
for(int i=2;i<8;i++){
  pinMode(i,OUTPUT);
  }
pinMode(R,OUTPUT);
pinMode(G,OUTPUT);
pinMode(B,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:

//從左到右點亮RGB流水燈  
for(int i=2;i<7;i++){ digitalWrite(i,0); color(i); digitalWrite(1,1); } //從右到左熄滅RGB流水燈 for(int i=7;i>2;i--){
  digitalWrite(i,0);
  color(i);
  digitalWrite(i,1);
  }
  
}

//顏色控制函式
void setColor(int r,int g,int b){
  analogWrite(R,255-r);
  analogWrite(G,255-g);
  analogWrite(B,255-b);
  }

//選擇要顯示的顏色
void color(int c){
  switch(c){
    case 2:
      setColor(255, 0, 0);  // 紅色燈全亮,藍燈,綠燈全暗(紅色)
      delay(t);
      break;
      
      case 3:
      setColor(0, 255, 0);  // 綠色燈全亮,紅燈,藍燈全暗(綠色)
      delay(t);
      break;

      case 4:
      setColor(0, 0, 255);  // 藍色燈全亮,紅燈,綠燈全暗(藍色)
      delay(t);
      break;

      case 5:
      setColor(255, 255, 255);  // 紅燈,綠燈,藍燈全亮(白色)
      delay(t);
      break;

      case 6:
      setColor(255, 255, 0);  // 紅燈,綠燈全亮,藍燈全暗(黃色)
      delay(t);
      break;

      case 7:
      setColor(0, 255, 255);  // 綠燈,藍燈全亮,紅燈全暗(青色)
      delay(t);
      break;  
    }
  }