Qt实现天气预报与PM2.5监测系统(3)PM2.5模块程序

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);
    }

你可能感兴趣的:(传感器,qt,串口通信)