前几天和几个小伙伴去市区公园玩 。看着公园对面空气检测系统的大屏幕上各种数据不断变化 。于是突发奇想 。我能不能自己也用单片机做一个PM2.5测试系统呢 。虽然不知道能不能成功 。但想到就要做 。
于是我利用好久以前的一个研究板当载体 。开始自己DIY 。成功了以后-我测试了一下基本能实时显示各种颗粒物的含量 。又和真实数据对比了一下 。准确度基板满足要求 。
老规矩废话就用不着去多说 。先上实物图:
原理:其实就是一块显示屏加上单片机实时控制 。再加上采集和显示代码就差一点了
实物图1
文章插图
数据采集和接收模块
文章插图
实测测量精度和准确率还是可以的 。
PM2.5检测系统参考代码如下:主程序
#include<reg52.h>
#include "delay.h"
#include "LCD12864.h"
#include "PM2_5.h"
#include "BMP180.h"
#include "DHT11.h"
#define uint unsigned int
#define uchar unsigned char
【单片机毕业设计论文 单片机DIY-小型PM2.5系统】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<reg52.h>
#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(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;
鉴于篇幅有限 。只能写这么多了 。
最后 。如果有什么意见或者建议欢迎您留言给我 。让咱们共同学习一起提升 。
文章不能上传附件,如果需要完整代码或设计文件 。请私信我或者给我留言 。看到后会第一期间回复 。
谢谢!
推荐阅读
- 43岁,高校正处,转任地方副县长,合适吗?
- 面对风和日丽的一轮春月,你记起那些描写月亮的古诗词名句?
- 我,36岁,之前在县政府办,刚上任副镇长。有机会去市里,去吗?
- 推荐绝对好看百看不厌的穿越文 百看不厌的穿越小说推荐
- 春天,哪句诗勾起了你的春思、春愁?
- 乡镇党委副书记和县科技局副局长,都是30岁,谁更有前途?
- 三个部位长白发最危险 40岁下身体毛发白什么原因
- 春天的杏花诗句有哪些?
- 县直单位副科和乡镇副科哪个好?