亚洲av无码精品色午夜果冻不卡-亚洲av无码专区在线观看成人-国产在线观看香蕉视频-国产乱对白刺激视频-亚洲国产精品久久艾草

您好,歡迎訪問深圳市深恒安科技有限公司官網(wǎng)!
VOC檢測儀-甲醛檢測儀-氣體報警器-氣體檢測儀廠家-深恒安科技有限公司
溫濕度探測 單片機很好玩8,溫度太高就報警,制作一個智能室內(nèi)溫度濕度計
發(fā)布時間:2021-04-09 01:04瀏覽次數(shù):

第二節(jié)和第三節(jié)介紹了如何使用C語言編程單片機,制作 LED 閃爍小燈,以及 LED “呼吸燈”。上一節(jié)介紹了利用 DHT11 溫濕度傳感器測量室內(nèi)溫度和濕度的方法,本節(jié)將把它們結(jié)合,制作一些更加“有意思”的小玩意兒。

溫濕度報警器

溫濕度傳感器的很多實際應(yīng)用的場景都是檢測一個“閾值”——例如,如果環(huán)境溫度在 40 攝氏度以下則一切正常,一旦環(huán)境溫度超過 40 攝氏度,就會有報警信息,通常以“聲光”的形式(鈴聲、警報燈等)給出。

參照實際應(yīng)用,我們可以使用C語言編程單片機,用緩和的 LED “呼吸燈”表示正常溫濕度情況。而一旦出現(xiàn)溫度超過閾值的情況,則可以用急促的 LED 閃爍小燈表示。

先來看看上一節(jié)獲取室內(nèi)溫濕度的單片機 C語言程序代碼:

void main()
{
 char dat[5] = {0};
 int cks;
 init_uart(9600);
 set_timer0(10); // 10us
 prints("init...\r\n");
 delay_10us(50000);delay_10us(50000);
 delay_10us(50000);delay_10us(50000);
 prints("program start...\r\n");
 while(1){
 dht11_start();
 dht11_read_once(dat);
 cks = 0;
 cks += dat[0]; cks += dat[1];
 cks += dat[2]; cks += dat[3];
 if((char)cks == dat[4]){
 prints("RH: ");printn(dat[0]);prints(".");printn(dat[1]);prints(" ");
 prints("TM: ");printn(dat[2]);prints(".");printn(dat[3]);prints("\r\n");
 }else{
 prints("capture failed\r\n");
 }
 delay_10us(50000);delay_10us(50000);
 }
}

乍一看,要實現(xiàn)上面的設(shè)計好像很簡單,只需要判斷一下溫度值,再決定使用哪一套 LED 小燈的控制程序(“呼吸燈”程序,或者“閃爍”程序)就可以了。

但是 DHT11 傳感器需要的 delay_10us(50000); 語句會破壞 LED 小燈的控制程序,因為在這 500ms 期間,單片機處于等待狀態(tài),無法控制 LED 小燈閃爍或者“呼吸”。那么,沒有辦法解決這個問題嗎?也不是,請看 LED 小燈“閃爍”的核心C語言程序:

while(1){
 P20 = 0;
 delay(10);
 P20 = 1;
 delay(10);
 }

以及 LED 的“呼吸燈”的核心C語言程序:

void twinkle_once(unsigned char darkTime)
{
 P20 = 0;
 delay(100-darkTime);
 P20 = 1;
 delay(darkTime);
}

仔細(xì)思考一下,應(yīng)該能明白無論是 LED “閃爍”程序,還是“呼吸”程序,其實都依賴“延時”。那思路就有了,直接使用 LED 小燈的控制程序代替 delay_10us(50000); 不就可以了嗎?的確如此,請繼續(xù)往下看。

編寫C語言程序,制作自己的警報器

先在上一節(jié) C語言代碼的基礎(chǔ)上氨氣報警器,實現(xiàn)更大尺度的 5ms 延時函數(shù):

void delay_5ms(unsigned int n)
{
 while(n--)
 delay_10us(5);
}

耳溫計和額溫計_額溫計和耳溫計_溫濕度探測

使用 delay_5m() 函數(shù)替換之前定義的“不精確”延時函數(shù) delay() 函數(shù)甲烷報警器,這樣我們就能知道較為精確的 LED 小燈的控制程序執(zhí)行時間,也就能更加方便的替換 delay_10us(50000); 語句。

現(xiàn)在寫出“呼吸”1 秒的 LED “呼吸燈”C語言程序就不難了,請看:

void led_breath_1s()
{
 static int cnt = 0;
 static char dark_time = 0, dir = 1 ;
 while(1){
 twinkle_once(dark_time);
 if( 0==((cnt++)%4) ){
 if(dir)
 dark_time += 1;
 else
 dark_time -= 1;
 if(dark_time >= 100)
 dir = 0;
 if(dark_time <= 60)
 dir = 1;
 }
 if(cnt > 200){
 cnt = 0;
 break;
 }
 }
}

twinkle_once() 執(zhí)行一次需要 5ms 的時間,cnt 計數(shù)到 200 次就恰好是 1 秒,另外,if( 0==((cnt++)%4) ) 語句仍然能夠控制 LED 小燈的“呼吸”頻率。其他部分的代碼與之前介紹的就沒什么不同了。

類似的,閃爍 1 秒的 LED “閃爍”C語言程序可以如下實現(xiàn):

void led_twinkle_1s()
{
 char cnt = 5;
 while(cnt--){
 P21 = 1;
 delay_10us(10000);
 P21 = 0;
 delay_10us(10000);
 }
}

閃爍一次需要 200 ms 的時間,那么閃爍 5 次就是 1秒了。現(xiàn)在使用 led_breath_1s() 和 led_twinkle_1s() 函數(shù)替換delay_10us(50000); 語句就可以了。請看:

void main()
{
 char dat[5] = {0};
 int cks;
 init_uart(9600);
 set_timer0(10); // 10us
 prints("init...\r\n");
// delay_10us(50000);delay_10us(50000);
// delay_10us(50000);delay_10us(50000);
 led_breath_1s();
 led_breath_1s(); 
 prints("program start...\r\n");
 while(1){
 dht11_start();
 dht11_read_once(dat);
 cks = 0;
 cks += dat[0]; cks += dat[1];
 cks += dat[2]; cks += dat[3];
 if((char)cks == dat[4]){
 prints("RH: ");printn(dat[0]);prints(".");printn(dat[1]);prints(" ");
 prints("TM: ");printn(dat[2]);prints(".");printn(dat[3]);prints("\r\n");
 }else{
 prints("capture failed\r\n");
 }
 if(dat[2] > 15)
 led_twinkle_1s();
 else
 led_breath_1s();
 //delay_10us(50000);delay_10us(50000);
 }
}

初始化時,使用了 led_breath_1s(); 代替了 DHT11 傳感器需要的延時,每次獲取溫濕度值的時候,則判斷了溫度值,如果溫度大于 15 攝氏度,使用LED的“閃爍”程序代替延時 1秒,否則使用 LED 的“呼吸燈”程序代替。

現(xiàn)在編譯C語言程序,燒寫到單片機,可以得到如下結(jié)果:

一開始,DHT11 探測到的溫度較低,所以LED指示燈是“呼吸”狀態(tài)的溫濕度探測,然后使用手捏住 DHT11,溫度升高超過“閾值”后,LED 小燈就變成“閃爍”狀態(tài)了。

還有問題嗎?

上面的控制程序還不是很完美,相信細(xì)心的朋友應(yīng)該看出來了,LED小燈處于“呼吸”狀態(tài)時,總是會有一次閃爍。這是因為我們采集 DHT11 傳回來的溫濕度信息時,也有幾十毫秒的延時,在這段時間內(nèi),單片機是無法控制 LED 小燈的溫濕度探測,所以小燈會一直處于最近一次的亮暗狀態(tài),查看 led_twinkle_1s() 函數(shù)的C語言代碼就知道,LED 小燈最后的狀態(tài)是亮的狀態(tài),這就解釋了我們遇到的問題。

這其實也是單片機編程的一個特點溫濕度探測,若單片機內(nèi)部沒有運行操作系統(tǒng),則編寫并行的程序幾乎是不可能的,所以串行的阻塞延時應(yīng)該盡量避免,否則就會出現(xiàn)類似上面的問題。那么,上面這種問題不借助于操作系統(tǒng)也能解決嗎?當(dāng)然可以,借助于單片機的中斷系統(tǒng)就很好解決,限于篇幅,以后再說了。

歡迎在評論區(qū)一起討論,質(zhì)疑。文章都是手打原創(chuàng),每天最淺顯的介紹C語言、linux等嵌入式開發(fā),喜歡我的文章就關(guān)注一波吧,可以看到最新更新和之前的文章哦。

騰元達編輯,轉(zhuǎn)載請注明出處

標(biāo)簽: 溫濕度探測
請往下拉!
  • VOC檢測儀-甲醛檢測儀-氣體報警器-氣體檢測儀廠家-深恒安科技有限公司

    微信號:18028784534微信二維碼

主站蜘蛛池模板: 久久综合av免费观看| 狠狠色噜噜狠狠狠狠97| 亚洲精品456在线播放| 蜜桃av噜噜一区二区三区| 亚洲av无码国产剧情| 国产乱了真实在线观看| 伊人色综合一区二区三区| 亚洲中文字幕久久精品无码a| 国产精品videossex久久发布| 欧美激情内射喷水高潮| 人妻精油按摩bd高清中文字幕| 欧美老妇大p毛茸茸| 99久久er热在这里只有精品99| 无码人妻精品一区二区三区夜夜嗨| 无码专区人妻系列日韩精品| 又黄又无遮挡aaaaa毛片| 伴郎粗大的内捧猛烈进出第一章| 人妻少妇精品久久久久久| 精品丝袜国产自在线拍高清| 色综合久久一区二区三区| 成年无码av片在线| 欧美大屁股xxxxhd黑色| 国产超碰人人模人人爽人人添 | 在线观看成人无码中文av天堂 | 国产96av在线播放视频| 日韩一区国产二区欧美三区| 日本mv高清在线成人高清| 三年片高清在线观看大全| 中文在线资源天堂www| 97久久久久人妻精品区一| av人摸人人人澡人人超碰小说| 99视频精品全部免费 在线| 给我免费的视频在线观看| 久久www免费人成_看片中文| 国产网红主播无码精品| 蜜桃视频在线观看免费视频网站www| 日本一区二区在线播放| 色欲色欲天天天www亚洲伊| 大地资源网高清在线观看动漫| 国产精品白浆一区二小说| 亚洲一区二区三区在线观看网站|