從此圖就可以看出當開啟100%的亮度會有多亮,我整個都被照到反光了呢!
計畫所準備硬體部份的東西主要有以下:
1.
100W聚光燈(LED矩陣)模組 * 1
2.
20W-100W LED專用升壓定電流模組
* 1
3.
3S鋰電池
* 1
4. 麵包板
* 1
5.
Arduino nano * 1
6. mini USB * 1
7. 電腦一台 * 1
(如右圖所示)
首先要先將電池供電給升壓定電流模組,將升壓定電流模組上的IN+接線到電池的正極,IN-接到負極,再將OUT+接給聚光燈的正極,OUT-接給負級,另外還要從IN-再接一條線給Arduino nano的GND,讓兩邊共地,不然到時聚光燈會收不到nano的訊號,再來就把聚光燈的訊號線接到PWM的輸出腳位(筆者設定D3為PWM輸出腳位)。我們在聚光燈上加了一顆BJT作為開關,此外我們還在聚光燈背面安裝的風扇散熱,因為聚光燈的功率很高,當亮度調到最大時,可以發現聚光燈漸漸發熱,開太久旁邊鐵片會燙。
PS.請確保各條連接線要確保接對、接好,不然一短路不只會看到電、聽到電的聲音,各元件都可能燒壞。
硬體接完後,再來是軟體的部分,以下是程式碼:
int outputPin = 3;
int LEDpwm;
int count = 0;
char input[4];
boolean flag = false;
String inputString = "";
void setup(){
Serial.begin(9600); //初始化序列埠,以9600bps速率連線
pinMode(outputPin,OUTPUT); //設定輸出腳位
}
void loop(){
if(flag == true){
inputString.toCharArray(input,4); //將輸入字串放進字元陣列中
str2DEC(); //將讀進來的數字字串轉換為十進位數值
Serial.println(LEDpwm); //列印出輸入的值
for(int i = 0; i < 3 ;i++){ //讓聚光燈閃三下
analogWrite(outputPin,LEDpwm);
delay(1000);
analogWrite(outputPin,0);
delay(1000);
}
inputString = "";
flag = false;
count = 0;
}
}
void serialEvent(){
char inputChar = (char)Serial.read(); //當buffer裡有資料時讀取第一個byte並轉為字元
inputString += inputChar; //將輸入字元加入字串當中
count++; //計數有幾個字元
if(inputChar == '\n'){
flag = true;
}
}
void str2DEC(){
switch(count){ //透過計數的字元了解使用者輸入的值為幾位數
case 4:
LEDpwm = (input[0] - 48) * 100 +
(input[1] - 48) * 10 + (input[2] - 48);
break;
case 3:
LEDpwm = (input[0]-48) * 10 + (input[1]
-48);
break;
case 2:
LEDpwm = (input[0]-48);
break;
}
}
原本程式只要輸入0~255範圍的值analogWrite就會一直保持此值,而我後來加了for迴圈,讓每次輸入值後閃三下,如果想長亮LED直接打 analogWrite(outputPin,LEDpwm )即可。