首页 » 互联网 » 单片机很好玩8温度太高就报警制作一个智能室内温度湿度计_年夜众_措辞

单片机很好玩8温度太高就报警制作一个智能室内温度湿度计_年夜众_措辞

雨夜梧桐 2025-01-16 03:08:06 0

扫一扫用手机浏览

文章目录 [+]

温湿度报警器

温湿度传感器的很多实际运用的场景都是检测一个“阈值”——例如,如果环境温度在 40 摄氏度以下则统统正常,一旦环境温度超过 40 摄氏度,就会有报警信息,常日以“声光”的形式(铃声、警报灯等)给出。

参照实际运用,我们可以利用C措辞编程单片机,用缓和的 LED “呼吸灯”表示正常温湿度情形。
而一旦涌现温度超过阈值的情形,则可以用急匆匆的 LED 闪烁小灯表示。

单片机很好玩8温度太高就报警制作一个智能室内温度湿度计_年夜众_措辞 互联网

先来看看上一节获取室内温湿度的单片机 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); }}

乍一看,要实现上面的设计彷佛很大略,只须要判断一下温度值,再决定利用哪一套 LED 小灯的掌握程序(“呼吸灯”程序,或者“闪烁”程序)就可以了。

但是 DHT11 传感器须要的 delay_10us(50000); 语句会毁坏 LED 小灯的掌握程序,由于在这 500ms 期间,单片机处于等待状态,无法掌握 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);}

仔细思考一下,该当能明白无论是 LED “闪烁”程序,还是“呼吸”程序,实在都依赖“延时”。
那思路就有了,直策应用 LED 小灯的掌握程序代替 delay_10us(50000); 不就可以了吗?的确如此,请连续往下看。

编写C措辞程序,制作自己的警报器

先在上一节 C措辞代码的根本上,实现更大尺度的 5ms 延时函数:

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

利用 delay_5m() 函数更换之前定义的“禁绝确”延时函数 delay() 函数,这样我们就能知道较为精确的 LED 小灯的掌握程序实行韶光,也就能更加方便的更换 delay_10us(50000); 语句。

现在写出“呼吸”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() 实行一次须要 5ms 的韶光,cnt 计数到 200 次就恰好是 1 秒,其余,if( 0==((cnt++)%4) ) 语句仍旧能够掌握 LED 小灯的“呼吸”频率。
其他部分的代码与之前先容的就没什么不同了。

类似的,闪烁 1 秒的 LED “闪烁”C措辞程序可以如下实现:

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

闪烁一次须要 200 ms 的韶光,那么闪烁 5 次便是 1秒了。
现在利用 led_breath_1s() 和 led_twinkle_1s() 函数更换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 的“呼吸灯”程序代替。

现在编译C措辞程序,烧写到单片机,可以得到如下结果:

一开始,DHT11 探测到的温度较低,以是LED指示灯是“呼吸”状态的,然后利用手捏住 DHT11,温度升高超过“阈值”后,LED 小灯就变成“闪烁”状态了。

还有问题吗?

上面的掌握程序还不是很完美,相信细心的朋友该当看出来了,LED小灯处于“呼吸”状态时,总是会有一次闪烁。
这是由于我们采集 DHT11 传回来的温湿度信息时,也有几十毫秒的延时,在这段韶光内,单片机是无法掌握 LED 小灯的,以是小灯会一贯处于最近一次的亮暗状态,查看 led_twinkle_1s() 函数的C措辞代码就知道,LED 小灯末了的状态是亮的状态,这就阐明了我们碰着的问题。

这实在也是单片机编程的一个特点,若单片机内部没有运行操作系统,则编写并行的程序险些是不可能的,以是串行的壅塞延时该当只管即便避免,否则就会涌现类似上面的问题。
那么,上面这种问题不借助于操作系统也能办理吗?当然可以,借助于单片机的中断系统就很好办理,限于篇幅,往后再说了。

欢迎在评论区一起谈论,质疑。
文章都是手打原创,每天最浅近的先容C措辞、linux等嵌入式开拓,喜好我的文章就关注一波吧,可以看到最新更新和之前的文章哦。

标签:

相关文章

部分芯片设计行业汇总_芯片_股份

1、IP设计:芯原股份、国芯科技2、CPU/GPU:北京君正、景嘉微3、FP­GA:复旦微电4、存储芯片:兆易创新、紫光国微、东芯...

互联网 2025-01-16 阅读0 评论0