天天看點

智能家居DIY-空氣品質檢測篇-擷取空氣污染指數

1. 自動檢測空氣品質(pm2.5,Pm10)

2. 自動檢測溫度,濕度,氣壓

3. 定時上傳空氣品質資料到伺服器,并通過手機App顯示

4. 當空氣品質差的時候自動開啟空氣淨化器并報警提示關窗

5. 當空氣品質淨化完畢後自動關閉空氣淨化器

前言

話說樓主終于更新當爸了,寶寶現在5個月了,寶寶出生的時候是冬天,正是魔都空氣污染嚴重的時候,當時就想搞個自動開啟空氣淨化器,由于種種原因一直沒有時間搞,最近終于閑下來了這個事情終于提上議程了,現在是夏天,空氣都還行,各種空氣品質相關電子産品都打折,正是動手的好時機。

計劃的主要功能有:

  1. 自動檢測空氣品質(pm2.5,Pm10)
  2. 自動檢測溫度,濕度,氣壓
  3. 定時上傳空氣品質資料到伺服器,并通過手機App顯示
  4. 當空氣品質差的時候自動開啟空氣淨化器并報警提示關窗
  5. 當空氣品質淨化完畢後自動關閉空氣淨化器

架構

計劃使用ardunio連接配接空氣品質傳感器,溫度,濕度,氣壓傳感器,通過wifi子產品通過http上傳到伺服器背景,伺服器采用.net mvc架構。app使用網站提供的接口擷取資料并顯示

計劃使用的硬體有:

Ardunio mini pro

智能家居DIY-空氣品質檢測篇-擷取空氣污染指數

攀藤G5 空氣品質傳感器

智能家居DIY-空氣品質檢測篇-擷取空氣污染指數

繼電器

智能家居DIY-空氣品質檢測篇-擷取空氣污染指數

溫濕度傳感器

智能家居DIY-空氣品質檢測篇-擷取空氣污染指數

氣壓傳感器

智能家居DIY-空氣品質檢測篇-擷取空氣污染指數

WIFI子產品

智能家居DIY-空氣品質檢測篇-擷取空氣污染指數

電源子產品

智能家居DIY-空氣品質檢測篇-擷取空氣污染指數
智能家居DIY-空氣品質檢測篇-擷取空氣污染指數

有些朋友可能會問為啥用ardunio pro mini,主要有兩個原因,一個便宜,一個性能夠用。

空氣品質傳感器使用攀藤的原因主要是該傳感器市場回報性能不錯,經過試驗确實性能不錯,另外一個就是現在買便宜:-)

 電源子產品為啥要用兩個的原因是部分傳感器使用3.3v電壓,部分傳感器使用5v電壓,計劃使用交流轉5v子產品獲得5V點,然後5v電再接一個降壓子產品獲得3.3v電

我會用一系列的文章來記載我這次的DIY,有興趣的朋友可以加我扣扣-1942916494,大家一起探讨。

擷取空氣污染指數

硬體連接配接

首先連接配接攀藤G5傳感器和ardunio,隻要連3根線,vcc,gnd,把攀藤G5的tx線連到ardunio的D8口

智能家居DIY-空氣品質檢測篇-擷取空氣污染指數

注意攀藤的vcc和gnd是紫色和黃色的不是紅色和黑色

攀藤的vcc和gnd是紫色和黃色的不是紅色和黑色

重要的話說三遍,攀藤的tx是綠色的線,綠色的線接D8,理論上可以接任意一個數字口,不過不要接4,5,原因是arduino的i2c是通過這個兩個數字接口,我們很多傳感器都是用i2c來和ardunio來通訊,是以不要占用這兩個口

連接配接電腦

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口

智能家居DIY-空氣品質檢測篇-擷取空氣污染指數

我的是com5

編寫代碼

使用官方IDE編寫代碼,下載下傳位址:https://www.arduino.cc/en/Main/Software

可以下載下傳綠色版,解壓縮就能用

打開後界面是這樣的

智能家居DIY-空氣品質檢測篇-擷取空氣污染指數

點工具,開發闆選擇ardunio mini or ardunio mini pro,端口選擇虛拟出來的那個com口。

建立一個檔案,拷貝下面的代碼到ardunio IDE中

#include <SoftwareSerial.h>

SoftwareSerial pm25Serial(8, 9); // RX, TX

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);
          digitalWrite(13, LOW); //結束讀取熄燈
        }
        break;
      default:
        break;
    }
  }


}
      

  

 點選上傳,IDE會自動編譯,并上傳代碼到ardunio中。

智能家居DIY-空氣品質檢測篇-擷取空氣污染指數

上傳完畢後,點選工具,序列槽螢幕,在彈出的視窗中就可以看到目前的空氣品質了

智能家居DIY-空氣品質檢測篇-擷取空氣污染指數

強行插入硬廣告

http://www.51bilin.com/,比利牛彙聚全網優惠,為您網購省錢,自動采集目前各大電商最優惠的活動,購物前搜一搜,幫您省錢,提供Chrome插件,android用戶端,iOS用戶端即将推出。

智能家居DIY-空氣品質檢測篇-擷取空氣污染指數

繼續閱讀