2019/11/29 星期五作者:Astilbe 問題:如何利用Stduino制作一個(gè)呼吸燈。
我們之前已經(jīng)學(xué)習(xí)過如何制作閃爍燈了,原理就是讓LED燈電平時(shí)高時(shí)低,就能形成閃爍的效果。 那么什么是呼吸燈呢?它與閃爍燈的實(shí)現(xiàn)方法有何區(qū)別?
呼吸燈大家其實(shí)都見過,看看大家的手機(jī),上面是不是有一顆燈由亮到暗的逐漸變化,又由亮到暗,好像人在呼吸一樣,因而被稱為呼吸燈。 呼吸燈的原理我們可以從閃爍燈的原理類比推理一下:如果給燈加上一個(gè)隨時(shí)間先增后減的電平,不就實(shí)現(xiàn)由亮到暗了么?反之亦然。 我們之前學(xué)習(xí)的時(shí)候,先用pinMode()初始化13號接口,再在loop()中寫入高電平與低電平的切換,如下:
void setup() { // put your setup code here, to run once: pinMode(13,OUTPUT); }
void loop() { // put your main code here, to run repeatedly: digitalWrite(13,LOW); delay(1000); digitalWrite(13,HIGH); delay(1000);
}
但是13引腳輸出的電壓只有高低兩種(即1與0,因此被稱為數(shù)字信號),不能實(shí)現(xiàn)燈的明暗過渡。這該怎么辦?
 我們先看一看Stduino這塊板上有沒有其他引腳。 大家仔細(xì)觀察,可以發(fā)現(xiàn)其中有的孔邊上的編號后面有波浪線,有的沒有。這其實(shí)是劃分了兩種引腳:一類就是我們已經(jīng)用過的數(shù)字引腳,可以輸出數(shù)字信號,而另一類被稱作模擬引腳,可以輸出pwm模擬信號。模擬引腳正是我們需要的,因?yàn)槟M信號它隨時(shí)間的變化規(guī)律就是正弦函數(shù)。
(數(shù)字信號,隨時(shí)間只能輸出有與沒有兩個(gè)信號)(圖片來自網(wǎng)絡(luò))
(模擬信號,隨時(shí)間呈正弦函數(shù)關(guān)系,先增加后降低,周期性變化)(圖片來自網(wǎng)絡(luò)) 模擬引腳的初始化,首先我們要選擇一個(gè)模擬引腳,其次信號參數(shù)也變了。 void setup() { // put your setup code here, to run once: pinMode(2,OUTPUT_PMW);//13號引腳只能輸出數(shù)字信號,我們需要選擇一個(gè)帶波浪線的,即2號引腳
}
有同學(xué)發(fā)現(xiàn)OUTPUT參數(shù)后面跟了PWM,這是什么呢? PMW是一種脈沖寬度調(diào)制的技術(shù)類型。單片機(jī)不能輸出連續(xù)的正弦變化的信號,只能模擬,那么是如何做到的呢? 簡單的說,比如你要控制手電筒的亮度,簡單的辦法就是串聯(lián)一個(gè)電阻,改變電阻,燈的亮度就會(huì)改變。 還有沒其他辦法呢? 這種辦法就是PWM調(diào)節(jié)。有一個(gè)非常流行的比喻。 假設(shè)在1秒內(nèi),有0.5秒的時(shí)間開關(guān)是打開的,0.5秒關(guān)閉,那么燈就亮0.5秒,滅0.5秒?,F(xiàn)在實(shí)現(xiàn)了燈的閃爍。如果把頻率調(diào)高一點(diǎn),比如是0.010秒,0.005秒開,0.005秒滅,那么燈的閃爍頻率就很高,而人眼是感覺不到的。這時(shí)你發(fā)現(xiàn)不了燈在閃爍,當(dāng)時(shí)你會(huì)發(fā)現(xiàn)手電筒的燈光亮度一直保持在原來的一半亮度。你會(huì)覺得通電時(shí)間沒有變化,手電筒的電壓減到了原來的一半。同理,如果1毫秒內(nèi),0.1毫秒開,0.9毫秒滅,那么,燈的亮度就只有原來的10分之一,電壓也會(huì)被認(rèn)為減到了十分之一。 這就是PWM的基本原理。即通過改變開關(guān)接通時(shí)間等效改變用電器的電壓。 而二極管的反應(yīng)速度讓它,能夠讓電壓模擬出正弦變化。
那么我們可以怎么控制模擬引腳輸出信號的大小呢? 通過analogWrite()。 其中,即0到255代表占空比。 那么呼吸燈也就很容易實(shí)現(xiàn)了。代碼如下:
void setup() { // put your setup code here, to run once: pinMode(2,OUTPUT_PWM); }
void loop() { // put your main code here, to run repeatedly: for(int i=0; i<256; i++) {//for循環(huán)語句,讓亮度從0到255 analogWrite(2,i); delay(15);//變化太快可能看不清 } for(int i=255;i>-1;i--) {//for循環(huán)語句,讓亮度從255到0 analogWrite(2,i); delay(15); }
} 代碼部分結(jié)束了,接下來是動(dòng)手搭接線路。 首先,我們這里使用的是發(fā)光二極管,因?yàn)榘l(fā)光二極管能夠?qū)焖僮兓碾娏鞣磻?yīng)。發(fā)光二極管的引線長邊為正,短邊為負(fù)。 接下來,將發(fā)光二極管長邊與D2~相接,短邊與3.3V孔相接(Stduino提供3.3V與5V兩種電壓,紅色發(fā)光二極管工作電壓為1.8~2.4V。) 編譯下載即可~~~
本文轉(zhuǎn)載自Stduino網(wǎng)http:///forum.php?mod=viewthread&tid=10&extra=
|