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