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);
    }
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值