我們先準備一些材料 , arduino nano , 紅綠藍LED各一, 一粒全彩LED, 3個按鈕,3粒10KΩ電阻(按鈕用) , 6粒150Ω(保護LED用) . 注意我的圖片是用了470Ω , 因為我找不到150Ω
先看看以下是我的材料圖片
我用了模擬器製作了一個接線圖給大家參考
首先我們先了解一下, 脈波寬度調變 (英語:Pulse-width modulation ,縮寫:PWM )參考網址 : https://zh.wikipedia.org/wiki/脈衝寬度調變 , https://a091234765.pixnet.net/blog/post/399625162-%5B筆記%5Darduino實驗五%3Apwm調控
我嚐試去表達一下自己的理解 , 如果不正確請不要駡我, 只是我個人的理解能力有限 !
首先我們假設10秒是一個周期 , 我們有個水桶 , 有一個水龍頭 . 例子1: 打開水龍頭, 水桶開始注水 , 10 秒周期水龍頭都是開著的,水桶就滿了 . 例子2 : 打開水龍頭, 10 秒周期裏水龍頭只開了9秒, 那水桶就只有90%滿 , 例子3 : 打開水龍頭, 10 秒周期裏水龍頭只開了8秒, 那水桶就只有80%滿 以此類推 .
PWM 用上述例子解釋 , 占空比= 水龍頭開 , 水龍頭開=5V , 水龍頭關=0V , 如果周期內占空比滿戴 , 結果就是 5V , 如果占空比只有75% , 那麼結果是3.75V , 如果占空比只20%, 那麼結果是1V 了 ! 說白了就是控制占空比 , 控制輸出的電壓來控制LED亮度 , 這就是我們今次的目的 , 得出三原色不同亮度的組合來合成各種顏色
講完構思, 現在實作吧 ! 開始 …… LED 燈加上限流電阻來保護
按鈕部分 , 一端接 GND , 一端接5V+10K電阻作為 Arduino 輸入訊號端. 平時不按下去 Arduino 輸入訊號端 會是高電壓 , 按下去的時候接地道通, Arduino 輸入訊號端 會是低壓 ! 高低電壓的輸入就會控制 Arduino 程序的流向
以下是 Arduino 的程序代碼 , 如有興趣的朋友可以下載來玩玩 下載
以下是本人寫的代碼 , 不是寫得好好 ! 請見諒 :
int redled = 15; // 紅色LED接腳 int greenled = 16; // 綠色LED接腳 int blueled = 17; // 藍色LED接腳 int rled = 3; // 全彩LED紅色接腳 PWM int gled = 5; // 全彩LED綠色接腳 PWM int bled = 6; // 全彩LED藍色接腳 PWM int ranum =0; // 全彩LED紅色亮度參數 0 – 255 int ganum =0; // 全彩LED綠色亮度參數 0 – 255 int banum=0; // 全彩LED藍色亮度參數 0 – 255 int rgbbutt=14; // 轉換”紅綠藍”燈按鈕接腳 int upbutt=7; // 增加亮度按鈕接腳 int downbutt=8; // 減少亮度按鈕接腳 int val=0; // 儲存紅綠藍按鈕狀態 int valup=0; // 儲存增加亮度按鈕狀態 int valdown=0; // 儲存減少亮度按鈕狀態 int ledstat=0; // 儲存 “紅綠藍” 當前參數,全滅=0, 紅色=1 , 綠色=2, 藍色=3
void setup() { // put your setup code here, to run once: Serial.begin(9600);
pinMode (redled, OUTPUT); // 設定為輸出狀態 pinMode (greenled, OUTPUT); // 設定為輸出狀態 pinMode (blueled, OUTPUT); // 設定為輸出狀態 pinMode (rled, OUTPUT); // 設定為輸出狀態 pinMode (gled, OUTPUT); // 設定為輸出狀態 pinMode (bled, OUTPUT); // 設定為輸出狀態 pinMode (rgbbutt, INPUT); // 設定為輸入狀態 pinMode (upbutt, INPUT); // 設定為輸入狀態 pinMode (downbutt, INPUT); // 設定為輸入狀態 }
void loop() { // put your main code here, to run repeatedly: val = digitalRead(rgbbutt); delay(50); // Serial.println (val);
if (val == LOW) { val = digitalRead(rgbbutt); if (val == HIGH){ ledstat=ledstat+1;
if (ledstat == 1) {
digitalWrite(redled,1);
digitalWrite(greenled,0);
digitalWrite(blueled,0);
}
else if (ledstat == 2) {
digitalWrite(redled,0);
digitalWrite(greenled,1);
digitalWrite(blueled,0);
}
else if (ledstat == 3) {
digitalWrite(redled,0);
digitalWrite(greenled,0);
digitalWrite(blueled,1);
}
else {
digitalWrite(redled,0);
digitalWrite(greenled,0);
digitalWrite(blueled,0);
ledstat=0;
}
}
}
Serial.println (ledstat); if (ledstat == 1 ) { valup = digitalRead(upbutt); valdown = digitalRead(downbutt); delay(20); if (valup == LOW) { if (ranum < 255 ){ ranum = ranum+1; Serial.println (“紅色”+String(ranum)); } } if (valdown == LOW) { if (ranum > 0 ){ ranum = ranum-1; } } analogWrite(rled,ranum); }
else if (ledstat == 2) { valup = digitalRead(upbutt); valdown = digitalRead(downbutt); delay(20); if (valup == LOW) { if (ganum < 255 ){ ganum = ganum+1; } } if (valdown == LOW) { if (ganum > 0 ){ ganum = ganum-1; } } analogWrite(gled,ganum); } else if (ledstat == 3) { valup = digitalRead(upbutt); valdown = digitalRead(downbutt); delay(20); if (valup == LOW) { if (banum < 255 ){ banum = banum+1; } } if (valdown == LOW) { if (banum > 0 ){ banum = banum-1; } } analogWrite(bled,banum); }
Serial.println (String(ranum)+”:”+String(ganum)+”:”+String(banum)); }
以下是我自己完成後做的 DEMO 視頻
理論上可以實現全彩 , 但因為 LED 各色的參數是不一樣 红2.1v,绿2.8v,蓝2.8v,白3.1v ! 我的 DEMO 不能完全的全彩