3213|2

565

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

EEWORLD DIY-做一个环境参数存储系统 [复制链接]


刚好借此机会分享一下最近做的一个作品
功能:采集传感器数据并存储
硬件:
主控:arduino开发板
传感器:温度传感器DHT22、PM2.5传感器PMS3003(也要求测PM1.0、PM10.0浓度)
存储模块,因为要在保存的数据前面加上时间戳,便于后期EXCEL分析,所以再添加时钟装置DS1302


如果只测pm2.5的话可以用GP2Y1014,但是考虑到准确度、速度等方面因素还是考虑了价格高的PMS3003,激光测试颗粒物浓度,采用光散射原理,参数如下

DHT22、DS1302、SD模块不做介绍,网上很多

实物图

下面空板是自己焊线,使用排针将arduino的电源引出来,因为arduino电源脚不够用



软件部分:
接线:

DHT22 SDA---D8
PMS3003 TX---D0
DS1302
CLK---D7
IO---D6
CE---D5
SD
MOSI - D11
MISO - D12
CLK - D13
CS - D4


a.为保证数据准确,连续获得5次数值然后使用中值滤波算法,如下
  1. #define FILTER_N 5
  2. int Filter() {
  3.   int i;
  4.   int filter_sum = 0;
  5.   int filter_max, filter_min;
  6.   int filter_buf[FILTER_N];
  7.   for (i = 0; i < FILTER_N; i++) {
  8.     filter_buf[i] = pm;
  9.     delay(1);
  10.   }
  11.   filter_max = filter_buf[0];
  12.   filter_min = filter_buf[0];
  13.   filter_sum = filter_buf[0];
  14.   for (i = FILTER_N - 1; i > 0; i--) {
  15.     if (filter_buf[i] > filter_max)
  16.       filter_max = filter_buf[i];
  17.     else if (filter_buf[i] < filter_min)
  18.       filter_min = filter_buf[i];
  19.     filter_sum = filter_sum + filter_buf[i];
  20.     filter_buf[i] = filter_buf[i - 1];
  21.   }
  22.   i = FILTER_N - 2;
  23.   filter_sum = filter_sum - filter_max - filter_min ;
  24.   filter_sum = filter_sum / i;
  25.   return filter_sum;
  26. }
复制代码

减去最大、最小,然后3个数平均

b.PM2.5传感器返回数据校验和判断,
数据位定义如下

程序中对每个字节求和然后和校验和比较是否一致,否则舍弃该帧数据
  1. bool CheckSum(uint8_t *__buf, int __n)
  2. {
  3.   bool __flag = false; int __sum = 0;

  4.   for(int i=0; i<(__n-2); i++)
  5.   {
  6.     __sum += __buf[i];
  7.   }
  8.   
  9.   if(__sum == ((__buf[__n-2]<<8) + __buf[__n-1]))
  10.   {
  11.     __flag = true;
  12.   }

  13.   return __flag;
  14. }
复制代码


c.文件写入
  1. File myFile = SD.open("DS1302.txt", FILE_WRITE);
  2.          if (myFile)
  3.       {
  4.            myFile.print(buf); //print DS1302
  5.          myFile.print(myDHT22.getTemperatureC());
  6.          myFile.print("C ");
  7.          myFile.print(myDHT22.getHumidity());
  8.          myFile.print("% ");
  9.          
  10.                  myFile.print(" PM1.0 ");
  11.          myFile.print((pmsDatabuf[4]<<8) + pmsDatabuf[5]);
  12.                  myFile.print(" PM2.5 ");
  13.          myFile.print((pmsDatabuf[6]<<8) + pmsDatabuf[7]);
  14.                  myFile.print(" PM10 ");
  15.          myFile.print((pmsDatabuf[8]<<8) + pmsDatabuf[9]);
  16.          myFile.println();
  17.            myFile.close();
  18.            Serial.println("数据成功写入SD卡");
  19.       }
复制代码


程序编译

上运行

存储测试一

存储测试二


晚上测试,我是1min保存一次,保存1h不到10k,按这样算500M的SD卡,可以保存(500*10^3)/240 天,
如果测得5min保存一次,1h下来不到2k,所以不用担心SD卡容量不够问题

注:pm2.5传感器IO电平3.3V,建议加上电平转换模块

后续改进:
使用无线模块使数据传到网络端,方便远程查看;
做一个上位机解析软件分析PM2.5传感器通信数据;



此内容由EEWORLD论坛网友sanhuasr原创,如需转载或用于商业用途需征得作者同意并注明出处


最新回复

    采集这么多数据? 上位机需要如何处理呢?   你的Arduion 版本够低的  详情 回复 发表于 2017-10-23 11:00
点赞 关注
 

回复
举报

565

帖子

0

TA的资源

一粒金砂(高级)

沙发
 
补充:PM2.5传感器返回数据有国内标准、国际标准两种,程序中取一种作为判断
 
 

回复

22

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
    采集这么多数据? 上位机需要如何处理呢?
  你的Arduion 版本够低的
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表