毕业设计:单片机DIY-小型PM2.5系统,实际测试满足要求,赶快围观
大家好,因为最近忙着考试,最近比较忙,可能更新的文章比较少,疫情期间请大家多多注意身体,尽量减少外出,在家学习。 其实我发现在家学习只要静下心来,效率还是蛮快的,只要持之以恒,定会有所收获。 好了我们言归正传,前几天和几个小伙伴去市区公园玩,看着公园对面空气检测系统的大屏幕上各种数据不断变化,于是突发奇想,我能不能自己也用单片机做一个PM2.5测试系统呢,虽然不知道能不能成功,但想到就要做。 于是我利用好久以前的一个开发板当载体,开始自己DIY,成功了以后-我测试了一下基本能实时显示各种颗粒物的含量,又和真实数据对比了一下,准确度基板满足要求。 老规矩废话不多说,先上实物图: 原理:其实就是一块显示屏加上单片机实时控制,再加上采集和显示代码就差不多了 实物图1 数据采集和接收模块 实测测量精度和准确率还是可以的。 PM2.5检测系统参考代码如下: 主程序 include "delay.h" include "PM2_5.h" include "DHT11.h" 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); 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(pressure00); 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 define uint unsigned int 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(dat==0xAA) { i=0; cal[i]=dat; } else { i=i 1; cal[i]=dat; if(i==6) { 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.0*5; // SBUF=cal[1]; // while(!TI); // TI=0; // // SBUF=cal[2]; // while(!TI); // TI=0; } } } } 鉴于篇幅有限,只能写这么多了。 最后,如果有什么意见或者建议欢迎您留言给我,让我们共同学习一起进步, 文章不能上传附件,如果需要完整代码或设计文件,请私信我或者给我留言,看到后会第一时间回复。 谢谢! |