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