历史上的今天
今天是:2024年12月16日(星期一)
2021年12月16日 | 自制小型PM2.5环境检测系,实测效果还可以
2021-12-16 来源:elecfans
这段时间由于疫情影响不能出去,看着家对面空气检测系统的大屏幕上各种数据不断变化,于是突发奇想,能不能自己也做一个PM2.5测试系统呢,想到就要做。
老规矩废话不多说,先上实物图:
实物图1

实物图2


实测测量精度和准确率还是可以的。
PM2.5检测系统参考代码如下:
主
#include #include “delay.h” #include “LCD12864.h” #include “PM2_5.h” #include “BMP180.h” #include “DHT11.h” #define uint unsigned int #define uchar unsigned char sbit waring=P1^3; void main() { lcd_init(); Init_BMP085(); Init_PM2_5(); while(1) { bmp085Convert(); RH(); lcd_pos(0,0); display_string("pm2.5:"); if(read_pm()>5) display_num(read_pm()); else display_num(5); display_string("ug/m3"); display_string(" "); lcd_pos(1,0); display_string("T:"); display_num(temperature/10); display_string("."); display_num(temperature%10); display_string("'C"); display_string(" "); display_string("H:"); display_num(RHdataH); display_string("%"); lcd_pos(2,0); display_string("pre:"); display_num(pressure/1000); display_string("."); display_num(pressure%1000); display_string("kpa"); lcd_pos(3,0); display_string("smo:"); if(read_pm()>200) { display_string("High"); waring=0; } else { display_string("low"); display_string(" "); waring=1; } display_string("Al:"); display_num(Altitude); display_string("m"); display_string(" "); delay_ms(200); } } PM2.5 #include #define uint unsigned int #define uchar unsigned char #define K_PM 820 void senddata(uchar dat); uint read_pm(); uchar cal[7]={0}; // cal[0]:起始位 0xAA // cal[1]:Vout(H) // cal[2]:Vout(L) // cal[3]:Vref(H) // cal[4]:Vref(L) // cal[5]:校验位 // cal[6]:结束位0xFF uchar buf; uchar sum; int i=0; float Vo; void Init_PM2_5() { SCON=0x50; PCON=0x00; TMOD=0x20; EA=1; ES=1; TL1=0xF4; TH1=0xF4; TR1=1; } uint read_pm() { return (uint)(K_PM*Vo); } void serial() interrupt 4 { ES=0; RI=0; buf=SBUF; senddata(buf); ES=1; } void senddata(uchar dat) { if(dat0xAA) { i=0; cal[i]=dat; } else { i=i+1; cal[i]=dat; if(i6) { sum=cal[1]+cal[2]+cal[3]+cal[4]; if(sum==cal[5]&&cal[6]==0xFF) { // for(i=0;i<=6;i++) // { // SBUF=cal[i]; // while(!TI); // TI=0; // } Vo=(cal[1]256+cal[2])/1024.05; // SBUF=cal[1]; // while(!TI); // TI=0; // // // SBUF=cal[2]; // while(!TI); // TI=0; } } } } 鉴于篇幅有限,只能写这么多了。
上一篇:单片机做的半导体制冷小冰箱
史海拾趣
|
AVR学习笔记已经更新到第二十四篇了,论坛首页也改一下,呵呵 AVR学习笔记已经更新到第二十四篇了,论坛首页也改一下,呵呵 论坛首页还是写的共21篇,是不是该改一下了, 嘿嘿,要求如果过分,请不要介意… 查看全部问答> |
|
很久以前就开始对SD卡钟情了,原因不用多少说,控制方便,容量大,速度快,价格便宜等等。但是不能总把它当Flash用吧,就一个扇区的读,一个扇区的写,多没劲啊(不过刚开始读写成功后也挺兴奋的,哈哈)。那 ...… 查看全部问答> |
|
在wince 5.0环境下,用EVC写的应用程序,连接SQL CE2.0数据库,当打开2个程序同时去连接数据库时就会出错,请问如何解决?急着等。。。。。… 查看全部问答> |
|
关于MAX7219控制数码管显示问题(MCU:C8051F340) ?? 我的程序不知道哪里有错误,请大侠帮忙看一下,意见多多益善。 这个程序是用来显示123456 六位数。 #include #define Decoding 0x09 #define ...… 查看全部问答> |
|
各位老大 这个问题很菜,在控件上用了Gruopbox以后,Gruopbox里包含的控件都不能显示了,比如按钮之类的,这是啥原因啊?去掉Gruopbox就可以了,请各位指教!… 查看全部问答> |
|
LPC1113的IO口默认状态下的悬空输入是高电平还是低电平??? 我想知道,IO口先设置为输出高电平,然后设置为输入管脚,那么管脚上的电平状态是不是还是高电平呢,请大侠指教,谢谢。… 查看全部问答> |




