Qt实现天气预报与PM2.5监测系统(3)PM2.5模块程序
PM2.5模块(SHARP 灰尘传感器GP2Y1051AU0F)
灰尘传感器的主要参数
- 光学原理,能够探测1微米以上的粉尘粒子;
- 5VDC供电;
- 串口通信(5V);
原理:微粒和分子在光的照射下会产生光的散射现象,和此同时,还吸收部分照射光的能量。当一束平行单色光入射到被测颗粒场时,会受到颗粒周围散射和吸收的影响,光强将被衰减。如此一来便可求得入射光通过待测浓度场的相对衰减率。而相对衰减率的大小基本上能线性反应待测场灰尘的相对浓度。光强的大小和经光电转换的电信号强弱成正比,通过测得电信号就可以求得相对衰减率。
连接示意图
串口数据格式
计算公式
串口操作
Nanopi 串口
/dev/ttyAMA0 /dev/ttyAMA1 /dev/ttyAMA2 /dev/ttyAMA3
#include<unistd.h>
#include<string.h>
#include<stdio.h>
#include<fcntl.h>
#include<termios.h>
#define COM0 "/dev/ttyAMA2"
//串口初始化
void SysDialog::init_com(int fd)
{
struct termios newtio;
struct termios oldtio;
bzero(&newtio,sizeof(struct termios));
tcgetattr(fd,&oldtio);
newtio.c_cflag |= CLOCAL | CREAD;
cfsetispeed(&newtio,B2400);
cfsetospeed(&newtio,B2400);
printf("c_cflag=%x\n",newtio.c_cflag);
newtio.c_cflag &= ~CSIZE;
printf("c_cflag=%x\n",newtio.c_cflag);
newtio.c_cflag |= CS8;
printf("c_cflag=%x\n",newtio.c_cflag);
newtio.c_cflag &= ~PARENB;
newtio.c_iflag &= ~INPCK;
newtio.c_cflag &= ~CSTOPB;
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 0;
//设置原始模式
newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);/*Input*/
newtio.c_oflag &= ~OPOST; /*Output*/
tcflush(fd,TCIOFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
}
//打开串口设备
int SysDialog::PM25Init(void){
fd_pm25 = ::open(COM0,O_RDONLY);
if(fd_pm25 < 0){
info = "Can't Open Serial Port!";
info += COM0;
return -1;
}
init_com(fd_pm25);
info = "PM2.5 modules init OK.";
// linePM25->setText(info);
return 0;
}
串口数据的处理
int SysDialog::da_pro(char* da_buf)
{
unsigned char crr;
double vout;
int ud,i;
if(da_buf==NULL)
return -1;
for(i=0;i<10;i++){
if(da_buf[i] == 0xAA)
break;
}
if(da_buf[i+0] != 0xAA || da_buf[i+6] != 0xFF)
return -1;
crr = da_buf[i+1] + da_buf[i+2] + da_buf[i+3] + da_buf[i+4];
if(da_buf[i+5] != crr)
return -1;
vout = (da_buf[i+1]*256+da_buf[i+2])/1024.0*8.0;
ud = 800 * vout;
return ud;
}
定时读取pm2.5数据
//pm2.5 update
bzero(buf,350);
if(read(fd_pm25,buf,350)>0){
pm = 0;
pm = da_pro(buf);
if(pm==-1)
info = "Err";
else
info = QString::number(pm);
}