產品說明0
配件清單
- 1、PM2.5激光粉塵傳感器V2 x1
- 2、紅外CO2二氧化碳傳感器(0-50000ppm) x1
- 3、DFRobot Bluno M3控制器(兼容Arduino/STM32) x1
- 4、LCD Keypad Shield 按鍵擴展板 x1
許願人: 程老師,坐標魔都,初中信息老師一枚。
我的心願: 籌集xxxx元心願單產品購買返點,為學校5個班級配備空氣檢測裝置套件,檢測空氣質量。
心願故事:
我大魔都是最魅力的時尚中心,最發達的金融中心,最小資的文化中心…延續著過去的輝煌,保持著今天的繁榮,創造著未來的希望!
啥啥都好,吃嘛嘛香,但近幾年來空氣愈發不好,一到冬天,霧霾時常光顧…
作為一枚朝七晚六的老師,經常會忘了看空氣質量指數,有時候上室外課,帶著祖國的花朵們呼吸霧霾的感覺真的是衰爆…於是想,要是能做一個空氣質量檢測裝置,放在家里和教室裡,就能實時檢測數據,提醒家人和學校的師生們:今天有霧霾,出門須謹慎。對北方來說,這個裝置應該是剛需吧。
於是,今年年初的時候,做了一個PM2.5和二氧化碳檢測的裝置,效果還不錯哦。現在終於有機會在心願單上和大家一起分享啦!希望能得到大家的支持!
摘要:
採用Arduino開源硬件,搭配PM2.5空氣質量傳感器和紅外CO2二氧化碳傳感器,製成一個小型的室內空氣質量檢測台。
又到一年一度的冬日魔都霧霾季,2017年的第一個工作日就在這樣一個“中度污染”日子裡到來。這日子沒法過了!
新年第一天上班,你們懂得手上剛好有一個閒置的PM2.5傳感器,一個紅外CO2二氧化碳的傳感器,本著不浪費的小市民心理,打算做一個小應用玩玩。搜刮了一圈桌子,找了一塊Bluno M3和LCD keypad液晶屏。
說明:
Bluno M3並不是一個常見的Arduino板,它是DF基於STM32開發的Arduino兼容板,優點是便宜,管腳資源多;但缺點也很明顯,與一般的Arduino板存在兼容性問題(當然啦,Arduino是8位機,STM32是32位機,有部分不兼容是非常正常的事情)。這邊選擇M3的一個原因是M3有5個UART口,而這PM2.5和紅外傳感器又都是串口設備,對於M3來說是完全夠了的;帶藍牙(教程不含藍牙功能,懶) ;最後就是這個板子放著也是放著~~用UNO,Leonardo,Mega2560等其實也完全沒問題。
LCD keypad雖然佔了很多管腳,但是上面有個PM2.5轉接板的專用接口,省去了我接線的麻煩。
教程:
硬件操作:
紅外二氧化碳用的是雙頭PH2.0,其中一個要改成XH2.54的接頭(用公母頭的杜邦線直插也是可以的,就是最好能固定一下)
這邊選了Bluno M3的Serial1和Serial5兩個串口分別作為PM2.5和CO2的UART通信口,Serial1直接連到的LCD上的PM2.5的接口,所以不用改動,但UART5還是要把排針彎一下的,方便插。
看圖連線
軟件:
在IDE中選擇Bluno M3,選擇對應串口,燒入以下代碼
(注意,Bluno M3的串口是從Serial1開始的,燒錄代碼的時候,為了防止上傳出錯,先不要插PM2.5轉接板,另外,使用UNO,Leonardo的童鞋可以用軟串口來讀取數據,並不一定要Bluno M3的
#include <Arduino.h> #define LENG 31 //0x42 + 31 bytes equal to 32 bytes unsigned char buf[LENG]; unsigned char hexdata[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79}; //Read the CO2 gas density command /Don\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'t change the order long hi, lo, CO2; int PM2_5Value = 0; //define PM2.5 value of the air detector module -
#include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // select the pins used on the LCD panel -
-
void setup() { Serial1.begin(9600); //PM2.5 串口1 Serial5.begin(9600); //CO2 串口5 使用UNO和Leonardo的童鞋可以用软串口 Serial1.setTimeout(1500); //设置超时时间为1500毫秒(大于传感器传送数据周期1秒) lcd.begin(16, 2); // LCD 初始化 } -
void loop() { -
//CO2 value Serial5.write(hexdata, 9); -
for (int i = 0, j = 0; i < 9; i++) { if (Serial5.available() > 0) { -
int ch = Serial5.read(); -
if (i == 2) { hi = ch; //High concentration } if (i == 3) { lo = ch; //Low concentration } if (i == 8) { CO2 = hi * 256 + lo; //CO2 concentration } } } -
//PM2.5 -
-
if (Serial1.find(0x42)) { //检测到0x42时,开始读取 Serial1.readBytes(buf, LENG); -
if (buf[0] == 0x4d) { if (checkValue(buf, LENG)) { PM2_5Value = transmitPM2_5(buf); //count PM2.5 value of the air detector module } } } -
// LCD显示 -
static unsigned long OledTimer = millis(); if (millis() - OledTimer >= 1000) { OledTimer = millis(); -
lcd.setCursor(0, 0); // set the LCD cursor position -
lcd.print(\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"PM2.5: \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"); lcd.print(PM2_5Value); lcd.println(\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" ug/m3 \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"); lcd.setCursor(0, 1); // set the LCD cursor position lcd.print(\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"CO2: \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"); lcd.print(CO2); lcd.print(\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\" PPM \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\"); -
} -
} char checkValue(unsigned char *thebuf, char leng) { char receiveflag = 0; int receiveSum = 0; -
for (int i = 0; i < (leng - 2); i++) { receiveSum = receiveSum + thebuf[i]; } receiveSum = receiveSum + 0x42; -
if (receiveSum == ((thebuf[leng - 2] << 8) + thebuf[leng - 1])) //check the Serial1 data { receiveSum = 0; receiveflag = 1; } return receiveflag; } -
//transmit PM Value to PC int transmitPM2_5(unsigned char *thebuf) { int PM2_5Val; PM2_5Val = ((thebuf[5] << 8) + thebuf[6]); //count PM2.5 value of the air detector module return PM2_5Val; } |
上傳成功,等待15s後,PM2.5開始有數據,室內空氣還不錯,就是二氧化碳濃度有點高(如果CO2濃度一上來是65536,點一下復位先。)
魔都當天的PM2.5濃度如下圖,上午從190掉到180了。(昨天上午)
拿到窗邊,5秒不到CO2是下來了,但這PM2.5,看著好想搬家啊!
總結:PM的精度還闊以,CO2除了有點貴外沒啥缺點,哈幾口氣差不多能到30000多,NDIR的檢測方式在響應速度上確實有點慢,雖然官網給了90s,但還是有點不能忍。