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; } }