OneNET麒麟座应用开发之十:空气质量数据监测站项目总结

大气质量数据监测站用于测试空气质量监测及数据采集,实现野外或者室内空气质量的检测。

1、项目概述

本项目是一个定制项目,要求采集大气的压力、温度、湿度、PM25、位置等数据并上传到指定的后台服务器。但有时候因为没有条件或因为各种原因不能联网,则采用本地保存的方式,本地保存我们决定使用SD卡来实现。除此外,为了实现显式需求,还需要配套一些东西来实现饮食的需求,如实时时钟记录,上传联网方式的选择等。

2、硬件设计

本项目涉及到的硬件并不复杂,我们对其中几个实用比较多的电路做一个说明。首先说一下串口通讯电路,在本项目中激光PM25传感器、气体质量流量控制器、SD读卡器等都是使用串口来实现通讯,所以我们采用如下的串口电路设计:

该方式即可支持RS232,也可实现RS485,当然简单的TTL也没问题,只需要根据自己的不同需求焊接不同的元器件就可实现。

接下来我们说一说PWM控制电路,其实用的是计时器来实现,由于点击需要12V-24V的电源,所以我们外加一部分电路来实现电机的驱动,而PWM信号则有MCU产生,并能够通过电路提升电压。

最后我们说一下联网部分,联网有多种方式,有线连接、wifi连接都支持,首先说一说wifi,我们使用了ESP8266来实现这一需求,之所以选择ESP8266是因为软硬件实现都比较简单,而且我们对通讯的要求并不十分高,因为10m秒钟记录一个数据就好了,所以成本就是主要理由了。

至于有线我们使用W5500来实现,在以前的文章中已经多次说明过,这一次就不再重复了。

3、软件设计

接下来我们说一说软件的设计,软件的设计较硬件要繁杂的多,我们选取其中一部分前面没有说明过的做一些说明。首先我们说一下PWM控制,每台采集站有2路进气,所以我们需要控制两个气泵,以及2路的PWM,每路可以单独控制,在试验时我们使用50%的占空比。

void PWM_Configuration(void)
{
  //计算初始化的频率和占空比
  TimerPeriod = PWMTimePeriod;//计算用于设置ARR寄存器的值使产生信号的频率为17.57 Khz

  PWM1Pulse = (uint16_t) (((uint32_t) 5 * (TimerPeriod - 1)) / 10);//计算CCR1寄存器的值在通道1和1N产生50%占空比,用于TIM1

  PWM2Pulse = (uint16_t) (((uint32_t) 5 * (TimerPeriod - 1)) / 10);//计算CCR1寄存器的值在通道1和1N产生50%占空比,用于TIM8

  PWM_InitProcess(TIM1,TimerPeriod,PWM1Pulse);
}

其次我们说以说I2C控制,有好几路传感器都使用的是I2C数据通讯来实现,我们在这里我们只说两个基本的I2C操作函数,一个是下发命令,一个是读取数据。所有的操作都刻以通过调用这两个函数来实现。

/*向I2C从站下发指令,指令格式均为1个字节*/
void SendCommandToI2CSlave(I2C_TypeDef* I2Cx,uint8_t deviceAddress,uint8_t command)
{
  uint16_t i2cTimeout=TimeoutPeriod;

  /*产生I2C起始信号*/
  I2C_GenerateSTART(I2C2, ENABLE);

  /*检测 EV5 事件并清除标志*/
  while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT))
  {
    if ((i2cTimeout--) == 0) return ;
  }

  /*发送I2C从站的地址*/
  I2C_Send7bitAddress(I2Cx,deviceAddress,I2C_Direction_Transmitter);

  i2cTimeout=TimeoutPeriod;

  /*检测 EV6 事件并清除标志*/
  while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
  {
    if ((i2cTimeout--) == 0) return ;
  }

  /*下发操作命令*/
  I2C_SendData(I2Cx, command);
  i2cTimeout=TimeoutPeriod;

  /*检测 EV8 事件并清除标志*/
  while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
  {

    if ((i2cTimeout--) == 0) return ;

  }

  /* 产生I2C停止信号 */
  I2C_GenerateSTOP(I2Cx, ENABLE);
}

 /*从I2C从站读取多个字节数据的值*/
void GetBytesFromI2CSlave(I2C_TypeDef* I2Cx,uint8_t deviceAddress,uint8_t *pData,uint16_t bytesNum)
{
  uint16_t i2cTimeout=TimeoutPeriod;
  /*如果I2C总线忙,则等待一段时间*/
  while (I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY))
  {
    if ((i2cTimeout--) == 0) return ;
  }

  /* 产生 I2C 起始信号 */
  I2C_GenerateSTART(I2Cx, ENABLE);

  /*检测 EV5 事件并清除标志*/
  while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT))
  {
    if ((i2cTimeout--) == 0) return ;
  }

  /*发送I2C从站的地址*/
  I2C_Send7bitAddress(I2Cx,deviceAddress+1,I2C_Direction_Receiver);
  i2cTimeout=TimeoutPeriod;

  /*检测 EV6 事件并清除标志*/
  while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))
  {

    if ((i2cTimeout--) == 0) return ;

  }

  while(bytesNum)
  {
    if(bytesNum==1)
    {
      I2C_AcknowledgeConfig(I2Cx, DISABLE);//关闭应答
      I2C_GenerateSTOP(I2Cx, ENABLE);//停止信号
    }
    i2cTimeout=TimeoutPeriod;
    /*检测 EV7 事件并清除标志*/
    while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED))
    {

      if ((i2cTimeout--) == 0) return ;

    }

    /*通过 I2C,从设备中读取一个字节的数据 */
    *pData=I2C_ReceiveData(I2Cx);

    pData++;

    bytesNum--;
  }

  /*使能应答,方便下一次 I2C 传输*/
  I2C_AcknowledgeConfig(I2Cx, ENABLE);
}

接下来我们看看将数据存储到本地SD卡的操作过程,数据保留2位小数,并且采用4舍5入处理。

//将数据写入到SD卡
void WriteDataToSDCard(void)
{
  //将数据写入SD卡
  saveData[0]=((int16_t)(tempProcessValue*100+0.5))/100.0;//温度测量值
  saveData[1]=((int16_t)(presProcessValue*100+0.5))/100.0;//压力测量值
  saveData[2]=((int16_t)(flowProcessValue1*100+0.5))/100.0;//流量计1的标况流量
  saveData[3]=flowTatolVolume1;//流量计1的工况累计流量
  saveData[4]=flowStdTatolVolume1;//流量计1的标况累计流量
  saveData[5]=((int16_t)(flowProcessValue2*100+0.5))/100.0;//流量计2的标况流量
  saveData[6]=flowTatolVolume2;//流量计2的工况累计流量
  saveData[7]=flowStdTatolVolume2;//流量计2的标况累计流量

  saveDate[0]=systemYear;
  saveDate[1]=systemMonth;
  saveDate[2]=systemDate;
  saveDate[3]=systemHour;
  saveDate[4]=systemMinute;
  saveDate[5]=systemSecond;    

  SDCardFileOperation();
}

4、结果展示

我们在OneNET上创建了一个产品,6台设备,以及4个应用,来验证方案的效果,在测试过程中我们使用了Wifi方式来进行此次测试,因为这也是我们正是产品主要使用的连网方式。我们看一看数据上传的趋势图:

接下来我们看看显示位置及温湿度的应用截图:

我们再来看看显示大气压、温度和湿度的截图:

我们再来看看气体流量及柱状图显示:

至此,我们的测试项目完成,再次感谢电子发烧友和中国移动OneNET给我们带来的完美体验。

时间: 2024-10-20 09:13:05

OneNET麒麟座应用开发之十:空气质量数据监测站项目总结的相关文章

OneNET麒麟座应用开发之二:串口读取PM25传感器数据

作为环境数据监测站首先要获取大气中可吸入颗粒物的数据.为了检测PM25数据,我们采用北京海联信为的HLPM025K3型号传感器,该传感器使用激光法测量PM25和PM10的数据. 该型传感器的检测对象如下: M2.5:测量空气中0.3-2.5微米颗粒物: PM10:测量空气中 0.3-10微米颗粒物. 该传感器采用的通讯协议如下: (1)波特率: 9600bit/S;数据位:8位;停止位:1位;校验位:无; (2)数据发送间隔时间为0.8-1.2S(秒) , (3)数据格式:7个字节,其中校验位=

OneNET麒麟座应用开发之九:与SD卡通讯并保存数据

由于需要记录的数据量比较大,而且有些时候,有的用户不方便实时上传数据,所以要求使用SD卡存储数据然后人工收取上传.为此我们选择了一种通用的SD卡读写器. 1.读卡器简介 该读卡器整合 SD 卡规范和 FAT 文件格式规范,只要通过本模块规定的通讯协议就可以把数据存储在 SD 卡中的文件中.该读卡器连接方便采用串口通讯方式,如下图: 该读卡器摸块通讯协议比较简单,本模块的通讯协议分为命令发送和命令的应答两部分,其中命令格式由4个部分组成:命令识别码(0x55 0xAA),命令号,字节数(参数的个数

国内空气质量数据开源了

经过半个月的使用和维护,总算有个稳定的版本,已开源在https://github.com/hzexe/openair 本项目可以获取中国环境检测总站的空气数据,也包含restful的数据分发服务 当前数据内容包括: 城市的实时空气数据,包括AQI.pm2.5.pm10.co.o3.no2.so2.首要污染物.生活建议.污染描述等数据 城市所有空气检测点(空气站)的实时空气质量,除包含上面城市所有的基本数据,还有检测点名称,经度纬度等信息 城市空气质量历史数据(2013年以来) 检测点空气质量历史

【IOS开发之Objective-C】书签管理器项目

1.项目 新建一个书签管理器的项目,可以存储书签的网址.中文名.星级.访问量和权限信息,具有增.删.改.查和排序的功能. 2.找对象,抽象类 书签管理器,书签管理器,书签管理器--  多读几次书是不是就找到了对象,书签和管理器.书签包含网址.中文名和星级等信息:管理器里面有书签.那么我就可以抽象出两个类了,一个是书签类,一个是管理器类. 我们在书签管理器里面增.删.改.查和排序书签,在书签里面保存书签具有的属性数据. 3.对象的属性和行为分析 书签管理器的存储关系的分析: 4.类的实现 1.书签

Android开发之Activity之间的数据传递

通过putExtra设置值,通过getExtra获取值 putExtra需要设置键值对,getExtra通过对应的键获取传递的值(直接在getExtra之间加上想获取的值类型) 1.在一个Activity通过startActivityForResult()开启另一个Activity 2.该方法通常接收两个参数,第一个是Intent对象,第二个是requestCode 3.在第一个Activity中重写onActivityResult方法,通过switch判断传过来的requestCode(哪个A

iOS版本PM2.5空气质量监控仪

前言 鉴于柴静版<苍穹之下>的火爆,或许更多的人会关心环境,空气质量等环保因素,参考某学院的Swift版本的PM2.5的获取,本人自己写个Objective-C版本的. 基本原理 从服务器获取当前的空气质量数据,气象中心开放接口, 亚洲空气质量实时监控, 参照人家的教程使用亚洲空气质量监控. 本地解析数据,获取PM2.5数值,进行显示. 具体实现 NSNumber *str; -(void) loadData{ self.msgText.text = @"loading....&qu

空气质量实时监测数据接口JSON返回示例

空气质量实时监测数据能够反映实时空气质量,空气质量实时监测数据接口可以查询不同城市的空气质量最新结果.最近几周的空气质量数据和各监测点的数据. 接口名称:空气质量实时监测数据 接口平台:聚合数据 接口地址:http://web.juhe.cn:8080/environment/air/cityair 支持格式:JSON 请求方式:GET 请求示例:http://web.juhe.cn:8080/environment/air/cityair?city=城市名称&key=您申请的APPKEY值 接

【IOS开发之Objective-C】数据持久化--文件和归档

在OC中数据持久化的方式有多种,例如:写入一个文件再或是归档.写入文件的方式我们一般都可以直接读取文件中的数据.比如我把数据写进一个XX.txt文档里面.只有数据写入成功了我就可以直接读取这个文件了.但是这样对于一些用户关键的数据并不能起到保密的作用,如果需要保密还需要使用归档操作. 文件的操作 //首先声明一个字符串 NSString * str1 = @"123456789"; 方式一 直接使用方法: - (BOOL)writeToFile:(NSString *)path ato

空气质量在线检测系统制作 之Smart Airbox 制作流程

已刊登在<无线电>8月刊 在帝都生活的小伙伴们,想必对空气质量一定是不能再敏感,十几米的能见度想想也是醉了.一遇到久违的蓝天,朋友圈就被各种炫蓝天的照片刷屏.既然已经无法奢望室外空气,就在室内空气上下点功夫吧,毕竟一天中的大多数时间还是在室内度过的.于是乎,小熊决定做一个智能空气盒子,实时检测家里的空气是否达标.关爱绳命,从一呼一吸开始- 项目简介 智能空气盒子(Smart AirBox)是空气质量在线检测系统的雏形.该系统可以监测周围的空气质量(VOC.PM2.5.温度.湿度等),并将参数数