和12岁小同志搞创客开发:手撕代码,做一款亮度可调节灯
目錄
1、PWM呼吸燈
2、亮度可調(diào)節(jié)燈
機(jī)緣巧合在網(wǎng)上認(rèn)識一位12歲小同志,從零開始系統(tǒng)輔導(dǎo)其創(chuàng)客開發(fā)思維和技巧。
項(xiàng)目專欄:https://blog.csdn.net/m0_38106923/category_11097422.html?
本篇博文中的項(xiàng)目之前使用Mind+編程軟件已經(jīng)實(shí)現(xiàn)過,但是亮度可調(diào)節(jié)燈確實(shí)是非常有意思的項(xiàng)目,這次讓我們手寫代碼實(shí)現(xiàn)這個功能吧。
亮度可調(diào)節(jié)燈項(xiàng)目實(shí)現(xiàn)原理之前已經(jīng)講解過,不再贅述了,可參見:
和12歲小同志搞創(chuàng)客開發(fā):設(shè)計(jì)一款亮度可調(diào)節(jié)燈
1、PWM呼吸燈
在實(shí)現(xiàn)亮度可調(diào)節(jié)燈之前,讓我們先實(shí)現(xiàn)呼吸燈功能。所謂呼吸燈,就是讓燈有一個由亮到暗,再到亮的逐漸變化的過程,感覺像是在均勻的呼吸。
設(shè)備連線如下所示:
?實(shí)現(xiàn)代碼如下所示:
int ledPin = 10;void setup() {pinMode(ledPin,OUTPUT);
}void loop(){for (int value = 0 ; value < 255; value=value+1){ analogWrite(ledPin, value);delay(5);}for (int value = 255; value >0; value=value-1){ analogWrite(ledPin, value); delay(5); }
}
代碼下載完成后,我們可以看到LED會有個逐漸由亮到滅的一個緩慢過程,而不是直接的亮滅,如同呼吸一般,均勻變化。
程序中用到一個新的語句結(jié)構(gòu),for語句,當(dāng)我們需要重復(fù)執(zhí)行某句話時,我們可以使用for語句。
for語句格式如下:
for循環(huán)順序如下:
第一輪:1 2 3 4第二輪:2 3 4
......直到循環(huán)條件不成立,for循環(huán)結(jié)束。
回到代碼中,這兩個for語句實(shí)現(xiàn)了變量value的值不斷由0增加到255,隨之在從255減到0,在增加到255……,無限循環(huán)下去。?
for (int value = 0 ; value < 255; value=value+1){ }for (int value = 255; value >0; value=value-1){ }
使用analogWrite()函數(shù)用于給PWM口寫入一個0~255的模擬值,函數(shù)說明如下所示:
analogWrite(pin,value)pin:IO引腳
value:0~255之間的值
特別注意的是,analogWrite()函數(shù)只能寫入具有PWM功能的數(shù)字引腳,也就是我們使用這款A(yù)rduino中3,5,6,9,10,11引腳。
PWM呼吸燈呼吸燈這個小案例,通過控制開與關(guān)所持續(xù)時間的比值就能模擬到一個0到5V之間變化的電壓。
通過下圖五個方波來更形象的了解一下PWM,下圖橘色豎線代表方波的一個周期。
每個analogWrite(value)中寫入的value都能對應(yīng)一個百分比,這個百分比也稱為占空比(Duty Cycle),指的是一個周期內(nèi)高電平持續(xù)時間比上低電平持續(xù)時間得到的百分比。圖中,從上往下,第一個方波,占空比為0%,對應(yīng)的value為0,LED亮度最低,也就是滅的狀態(tài)。最后一個占空比為100%的對應(yīng)value是255,高電平持續(xù)時間越長,LED最亮。50%就是最亮的一半了,25%則相對更暗。
2、亮度可調(diào)節(jié)燈
亮度可調(diào)節(jié)燈之前已經(jīng)做過,就是通過模擬角度傳感器可以自由控制燈的亮度,隨著旋轉(zhuǎn)角度的變化,LED亮度也發(fā)生相應(yīng)改變。角度越大,LED燈也就越亮,相反,角度越小,LED燈也就越暗。
設(shè)備連線如下所示:
實(shí)現(xiàn)代碼如下所示:
int potPin = 0; //電位器連接到模擬0
int ledPin = 10; //LED連接到數(shù)字10void setup() {pinMode(ledPin, OUTPUT);
}void loop() {int sensorValue = analogRead(potPin); //讀取模擬口0的值 //通過map()把0~1023的值轉(zhuǎn)換為0~255int outputValue = map(sensorValue, 0, 1023, 0, 255); analogWrite(ledPin, outputValue); //給LED寫入對應(yīng)值 delay(2);
}
下載程序后,緩慢旋轉(zhuǎn)電位器,仔細(xì)觀察LED的亮度的變化。
這里需要主要講一下:map()函數(shù),它的作用是將一個數(shù)從一個范圍映射到另外一個范圍。函數(shù)說明如下所示:
map(value, fromLow, fromHigh, toLow, toHigh)value:需要映射的值
fromLow:當(dāng)前范圍值的下限
fromHigh:當(dāng)前范圍值的上限
tolLow:目標(biāo)范圍值的下限
toHigh:目標(biāo)范圍值的上限
也就是說,會將fromLow到fromHigh之間的值映射到 toLow在 toHigh 之間的值。
map的神奇之處還在于,兩個范圍中的"下限"可以比"上限"更大或者更小,因此map()函數(shù)可以用來翻轉(zhuǎn)數(shù)值的范圍,可以這么寫:
y = map(x,1,50,50,1);
這個函數(shù)同樣可以處理負(fù)數(shù),請看下面這個例子:
y =map(x,1,50,50,-100);
代碼中:int outputValue = map(sensorValue, 0, 1023, 0, 255); 就是將模擬口讀到的0~1023的值,轉(zhuǎn)換為PWM口的0~255。
總結(jié)
以上是生活随笔為你收集整理的和12岁小同志搞创客开发:手撕代码,做一款亮度可调节灯的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python Qt GUI设计:QScr
- 下一篇: 和12岁小同志搞创客开发:手撕代码,做一