和12岁小同志搞创客开发:手撕代码,做一款火焰报警器
機(jī)緣巧合在網(wǎng)上認(rèn)識一位12歲小同志,從零開始系統(tǒng)輔導(dǎo)其創(chuàng)客開發(fā)思維和技巧。
項(xiàng)目專欄:https://blog.csdn.net/m0_38106923/category_11097422.html?
在廚房安裝一個火焰報(bào)警器應(yīng)該是非常管用的,如果不小心忘關(guān)煤氣的話,只要有一點(diǎn)點(diǎn)的火苗,就能觸發(fā)火焰報(bào)警器,探測距離可達(dá)20cm。一個小小的報(bào)警器,講不定就能避免一場不必要的意外發(fā)生!
?項(xiàng)目連線如下所示:
實(shí)現(xiàn)代碼如下所示:
float sinVal;
int toneVal; void setup(){ pinMode(8, OUTPUT); // 蜂鳴器引腳設(shè)置Serial.begin(9600); //設(shè)置波特率為9600 bps
}void loop(){ int sensorValue = analogRead(0); //火焰?zhèn)鞲衅鬟B到模擬口,并從模擬口讀值Serial.println(sensorValue); delay(1);if(sensorValue < 1023){ // 如果數(shù)據(jù)小于1023,說明有火源,蜂鳴器響 for(int x=0; x<180; x++){//將sin函數(shù)角度轉(zhuǎn)化為弧度sinVal = (sin(x*(3.1412/180)));//用sin函數(shù)值產(chǎn)生聲音的頻率toneVal = 2000+(int(sinVal*1000));//給引腳8一個tone(8, toneVal);delay(2); } } else { // 如果數(shù)據(jù)大于等于1023,沒有火源,關(guān)閉蜂鳴器noTone(8); //關(guān)閉蜂鳴器 }
}
程序中,首先,定義兩個變量:
float sinVal;
int toneVal;
浮點(diǎn)型變量sinVal用來存儲正弦值,正弦波呈現(xiàn)一個波浪形的變化,變化比較均勻,所以我們選用正弦波的變化來作為我們聲音頻率的變換,toneVal從sinVal變量中獲得數(shù)值,并把它轉(zhuǎn)換為所需要的頻率。
這里用的是sin()函數(shù),一個數(shù)學(xué)函數(shù),可以算出一個角度的正弦值,這個函數(shù)采用弧度單位。因?yàn)槲覀儾幌胱尯瘮?shù)值出現(xiàn)負(fù)數(shù),所以設(shè)置for循環(huán)在0~179之間,也就是0~180度之間。?
for(int x=0; x<180; x++){
}
函數(shù)sin()用的弧度單位,不是角度單位。要通過公式:3.1412/180將角度轉(zhuǎn)為弧度:
sinVal = (sin(x*(3.1412/180)));
之后,將這個值轉(zhuǎn)變成相應(yīng)的報(bào)警聲音的頻率:
toneVal = 2000+(int(sinVal*1000));
這里有個知識點(diǎn):浮點(diǎn)型值轉(zhuǎn)換為整型。
sinVal是個浮點(diǎn)型變量,也就是含小數(shù)點(diǎn)的值,而我們不希望頻率出現(xiàn)小數(shù)點(diǎn)的,所以需要有一個浮點(diǎn)值轉(zhuǎn)換為整型值得過程,也就是下面這句語句就完成了這件事:
int(sinVal*1000)
把sinVal乘以1000,轉(zhuǎn)換為整型后再加上2000賦值給變量toneVal,現(xiàn)在toneVal就是一個適合聲音頻率了。
之后,我們用tone()函數(shù)把生成的這個頻率給我們的蜂鳴器。
tone(8, toneVal);
下面我們來介紹一下tone相關(guān)的三個函數(shù):
1、tone(pin,frequency):pin是指連接到蜂鳴器的數(shù)字引腳,frequency是以Hz為單位的頻率值。
2、tone(pin,frequency,duration):第二個函數(shù),有個duration參數(shù),它是以毫秒為單位,表示聲音長度的參數(shù)。像第一個函數(shù),如果沒有指定duration,聲音將一直持續(xù)直到輸出一個不同頻率的聲音產(chǎn)生。
3、noTone(pin):noTone(pin)函數(shù),結(jié)束該指定引腳上產(chǎn)生的聲音。
運(yùn)行程序,將打火機(jī)慢慢靠近火焰?zhèn)鞲衅?#xff0c;看看蜂鳴器會不會報(bào)警。
總結(jié)
以上是生活随笔為你收集整理的和12岁小同志搞创客开发:手撕代码,做一款火焰报警器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 和12岁小同志搞创客开发:手撕代码,做一
- 下一篇: Python Qt GUI设计:窗口之间