目錄
前言
話說樓主終於升級當爸了,寶寶現在5個月了,寶寶出生的時候是冬天,正是魔都空氣污染嚴重的時候,當時就想搞個自動開啟空氣凈化器,由於種種原因一直沒有時間搞,最近終於閑下來了這個事情終於提上議程了,現在是夏天,空氣都還行,各種空氣質量相關電子產品都打折,正是動手的好時機。
計划的主要功能有:
- 自動檢測空氣質量(pm2.5,Pm10)
- 自動檢測溫度,濕度,氣壓
- 定時上傳空氣質量數據到服務器,並通過手機App顯示
- 當空氣質量差的時候自動開啟空氣凈化器並報警提示關窗
- 當空氣質量凈化完畢后自動關閉空氣凈化器
架構
計划使用ardunio連接空氣質量傳感器,溫度,濕度,氣壓傳感器,通過wifi模塊通過http上傳到服務器后台,服務器采用.net mvc架構。app使用網站提供的接口獲取數據並顯示
計划使用的硬件有:
Ardunio mini pro
攀藤G5 空氣質量傳感器
繼電器
溫濕度傳感器
氣壓傳感器
WIFI模塊
電源模塊
有些朋友可能會問為啥用ardunio pro mini,主要有兩個原因,一個便宜,一個性能夠用。
空氣質量傳感器使用攀藤的原因主要是該傳感器市場反饋性能不錯,經過試驗確實性能不錯,另外一個就是現在買便宜:-)
電源模塊為啥要用兩個的原因是部分傳感器使用3.3v電壓,部分傳感器使用5v電壓,計划使用交流轉5v模塊獲得5V點,然后5v電再接一個降壓模塊獲得3.3v電
我會用一系列的文章來記載我這次的DIY,有興趣的朋友可以加我扣扣-1942916494,大家一起探討。
獲取溫度和濕度
溫度和濕度傳感器使用的是 “AOSONG AM2320”, 這個傳感器的特點是進度高,價格實惠
硬件連接
AM2320一共有4個接口,1接5v電源,2接ardunio的A4,3接地線,4接ardunio的A5
連接電腦
ardunio mini pro需用FTDI-232連接電腦,連線 ardunio vcc - ftdi vcc, ardunio gnd - ftdi gnd, ardunio tx - ftdi rx, ardunio rx - ftdi tx, ardunio rst - ftdi rst
如果已經用降壓模塊連接了ardunio的電源,不要接vcc和gnd,如果已經用降壓模塊連接了ardunio的電源,不要接vcc和gnd,如果已經用降壓模塊連接了ardunio的電源,不要接vcc和gnd
接好后,把ftdi連接到電腦的usb上,如果是第一次連接會安裝驅動,裝好后,會虛擬出一個com口
我的是com5
編寫代碼
使用官方IDE編寫代碼,下載地址:https://www.arduino.cc/en/Main/Software
可以下載綠色版,解壓縮就能用
打開后界面是這樣的
點工具,開發板選擇ardunio mini or ardunio mini pro,端口選擇虛擬出來的那個com口。
下載AM2320 ardunio支持庫
https://github.com/Ten04031977/AM2320-master
導入庫到Ardunio IDE中
ardunio IDE中點擊項目-加載庫-添加一個zip庫,選擇下載下來的zip文件即可
編寫代碼
打開上一次的文件或者新建一個文件,拷貝下面的代碼到ardunio IDE中
#include <Wire.h> #include <AM2320.h> #include <SoftwareSerial.h> SoftwareSerial pm25Serial(8, 9); // RX, TX AM2320 th; //新增 struct _panteng { unsigned char len[2]; unsigned char pm1_cf1[2]; unsigned char pm2_5_cf1[2]; unsigned char pm10_0_cf1[2]; unsigned char pm1_0[2]; unsigned char pm2_5[2]; unsigned char pm10_0[2]; unsigned char d[20]; } panteng; float caiqarr[8] = {0,50,100,150,200,300,400,500}; float cpm10arr[8] = {0,50,150,250,350,420,500,600}; float cpm25arr[8] = {0,35,75,115,150,250,350,500}; int caculateAiq(float * aiqarr, float * contaminatarr,int val , int size) { int findidx = 1; for(int i=findidx;i<size;i++,findidx++) { if(contaminatarr[i] >= val) break; } if(findidx >= size) return (int)aiqarr[size - 1]; float aiq = (aiqarr[findidx]-aiqarr[findidx - 1]) / (contaminatarr[findidx] - contaminatarr[findidx - 1]) * (val - contaminatarr[findidx - 1]) + aiqarr[findidx - 1]; return (int)aiq; } void setup() { // put your setup code here, to run once: Serial.begin(9600); //USB串口向PC發送數據 pm25Serial.begin(9600); //軟串口連接傳感器 pinMode(13, OUTPUT);//內置led digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); } void loop() { // put your main code here, to run repeatedly: unsigned char c; char str[100]; static int state = 0; static int count = 0; static int time = 0; int pm1_0, pm2_5, pm10_0; //PM1.0、PM2.5、PM10 int i; while (pm25Serial.available()) { c = pm25Serial.read(); // say what you got: //Serial.print("I received: "); //Serial.println(c, DEC); //Serial.println("read"); switch (state) { case 0: if (0x42 == c) { digitalWrite(13, HIGH); //開始讀取亮燈 state = 1; } break; case 1: if (0x4d == c) { state = 2; count = 0; //Serial.println(' '); } break; case 2: ((unsigned char *) &panteng)[count++] = c; sprintf(str, "%02X ", c); if (count > 28) { state = 0; pm1_0 = panteng.pm1_0[0] * 256 + panteng.pm1_0[1]; pm2_5 = panteng.pm2_5[0] * 256 + panteng.pm2_5[1]; pm10_0 = panteng.pm10_0[0] * 256 + panteng.pm10_0[1]; int pm25aiq = caculateAiq(caiqarr,cpm25arr,pm2_5,8); int pm10aiq = caculateAiq(caiqarr,cpm10arr,pm10_0,8); sprintf(str, "%d\t%d\t%d\t%d\t%d\t%d", time++, pm1_0, pm2_5, pm10_0, pm25aiq, pm10aiq); Serial.println(str); snprintf(str, 16, "PM2.5=%d ", pm2_5);
//新增 if(th.Read()==0) { Serial.print("humidity: "); Serial.print(th.h); Serial.print("%, temperature: "); Serial.print(th.t); Serial.println("*C"); } digitalWrite(13, LOW); //結束讀取熄燈 } break; default: break; } } }
點擊上傳,IDE會自動編譯,並上傳代碼到ardunio中。
上傳完畢后,點擊工具,串口監視器,在彈出的窗口中就可以看到當前的空氣質量和當前的溫度和濕度了
強行插入硬廣告
http://www.51bilin.com/,比利牛匯聚全網優惠,為您網購省錢,自動采集當前各大電商最優惠的活動,購物前搜一搜,幫您省錢,提供Chrome插件,android客戶端,iOS客戶端即將推出。