日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

和12岁小同志搞创客开发:手撕代码,做一款亮度可调节灯

發(fā)布時(shí)間:2023/11/27 生活经验 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 和12岁小同志搞创客开发:手撕代码,做一款亮度可调节灯 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。