刚好借此机会分享一下最近做的一个作品
功能:采集传感器数据并存储
硬件:
主控: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次数值然后使用中值滤波算法,如下
- #define FILTER_N 5
- int Filter() {
- int i;
- int filter_sum = 0;
- int filter_max, filter_min;
- int filter_buf[FILTER_N];
- for (i = 0; i < FILTER_N; i++) {
- filter_buf[i] = pm;
- delay(1);
- }
- filter_max = filter_buf[0];
- filter_min = filter_buf[0];
- filter_sum = filter_buf[0];
- for (i = FILTER_N - 1; i > 0; i--) {
- if (filter_buf[i] > filter_max)
- filter_max = filter_buf[i];
- else if (filter_buf[i] < filter_min)
- filter_min = filter_buf[i];
- filter_sum = filter_sum + filter_buf[i];
- filter_buf[i] = filter_buf[i - 1];
- }
- i = FILTER_N - 2;
- filter_sum = filter_sum - filter_max - filter_min ;
- filter_sum = filter_sum / i;
- return filter_sum;
- }
复制代码
减去最大、最小,然后3个数平均
b.PM2.5传感器返回数据校验和判断,
数据位定义如下
程序中对每个字节求和然后和校验和比较是否一致,否则舍弃该帧数据
- bool CheckSum(uint8_t *__buf, int __n)
- {
- bool __flag = false; int __sum = 0;
- for(int i=0; i<(__n-2); i++)
- {
- __sum += __buf[i];
- }
-
- if(__sum == ((__buf[__n-2]<<8) + __buf[__n-1]))
- {
- __flag = true;
- }
- return __flag;
- }
复制代码
c.文件写入
- File myFile = SD.open("DS1302.txt", FILE_WRITE);
- if (myFile)
- {
- myFile.print(buf); //print DS1302
- myFile.print(myDHT22.getTemperatureC());
- myFile.print("C ");
- myFile.print(myDHT22.getHumidity());
- myFile.print("% ");
-
- myFile.print(" PM1.0 ");
- myFile.print((pmsDatabuf[4]<<8) + pmsDatabuf[5]);
- myFile.print(" PM2.5 ");
- myFile.print((pmsDatabuf[6]<<8) + pmsDatabuf[7]);
- myFile.print(" PM10 ");
- myFile.print((pmsDatabuf[8]<<8) + pmsDatabuf[9]);
- myFile.println();
- myFile.close();
- Serial.println("数据成功写入SD卡");
- }
复制代码
程序编译
上运行
存储测试一
存储测试二
晚上测试,我是1min保存一次,保存1h不到10k,按这样算500M的SD卡,可以保存(500*10^3)/240 天,
如果测得5min保存一次,1h下来不到2k,所以不用担心SD卡容量不够问题
注:pm2.5传感器IO电平3.3V,建议加上电平转换模块
后续改进:
使用无线模块使数据传到网络端,方便远程查看;
做一个上位机解析软件分析PM2.5传感器通信数据;
此内容由EEWORLD论坛网友sanhuasr原创,如需转载或用于商业用途需征得作者同意并注明出处