---
# System prepended metadata

title: '**智慧家庭系列 – 空氣品質檢測**'
tags: [' Arduino', ' Yungger', ' MQ-135', ' 智慧家庭', ' 感測器', ' 空氣品質', ' 物聯網', ' IDEAS Chain', 勇哥, ' IoT', ' ESP8266']

---

---
tags: 勇哥, Yungger, IoT, 物聯網, 智慧家庭, MQ-135, 空氣品質, 感測器, ESP8266, Arduino, IDEAS Chain
---

# **智慧家庭系列 – 空氣品質檢測**

今天剛好有個機會, 需要對同好演示一下感知器在物聯網中扮演的角色。 其實對於 IoT 創客而言, 手頭上總會有一堆板子與感知器. 加上最近智慧家庭宅是個很夯的賣點, 所以, 隨手就拿了一個身邊有的 MQ-135 Gas Sensor 來做個對周遭二氧化碳濃度的監測演示與簡易說明。

既然要聊的是物聯網, 便需要再挑一片具 WiFi 連網功能的板子, 此範例採用的是 ESP8266 來實作它。 至於要燒錄什麼語言來驅動它呢？雖然最近我寫的都是 MicroPython, 而同好懂的是用 Arduino IDE 來開發, 但其實天下程式語言是一法通就萬法通. 所以, 索性我就將它改成 Arduino 版的來解說。   



實驗目標簡述：
---
我們將建置一個空氣品質監測站, 透過一個 MQ-135 氣體感測器, 定時將檢測到空氣品質數據上傳至雲端物聯網數據平台上 (這裡我用的是<font color="red">資策會服創所的雲端數據服務平台 IDEAS Chain</font> 來演示, 當然你也可以使用其他服務平台, 或自己架一個也行)。 當檢測到空氣品質出現異常數據時, 例如二氧化碳濃度值過高時, 就能自動送出即時訊息通知使用者 (這裡我用以一個 LED 來演示, 當數據異常時 LED 亮, 正常時則滅)。

至於, 使用者收到通知後, 自然便可以再決定接下來是否要採取一些相對應的動作。 處理方式可以是人工 or 半人工, 或甚至再連動一些全自動化裝置來排除異常。當然, 這些就會是因人因需求而異了, 在此就預留些想像的空間給同好吧 ！ 但若是身為創客的我本人, 自然是會要求一系列的全自動化, 例如, 手機 or LINE通知, 偵測熱源, 馬達控制開窗, 風扇排氣, ...etc.     


重點材料說明：
---

![](https://i.imgur.com/5XwR8qS.jpg)

MQ-135 空氣品質檢測感測器模組：

一、 尺寸：32mm X22mm X30mm（長X寬X高）

二、 主要晶片：LM393、MQ-135 氣體感測器

三、 工作電壓：DC 5V

四、 特點：

＊雙路信號輸出（類比數值輸出及TTL電位輸出）
＊TTL輸出有效信號為低電位。
＊具有信號輸出指示。（當輸出低電位時信號燈亮）
＊類比數值輸出對應至 0~5V 電壓輸出，濃度越高，電壓越高。
＊具有長期的使用壽命和可靠的穩定性。

:::info
特別提醒：感測器通電後，需要預熱20S左右，測量的資料才穩定。因為內部有電熱絲，感測器發熱是屬於正常現象，但如果燙手就不正常了。
:::


實作展示開始：
---

**[準備的材料]**

• Arduino 板子 x 1 -- 這裡是用內建 WiFi 連網的 ESP8266
• MQ-135 x 1 -- 腳位 DO 可不用接
• 麵包板(含電源模組) x 1 
• 連接線 x 3
• 雲端物聯網數據平台 x 1



實體接線圖：
---
![](https://i.imgur.com/3sCrbYm.jpg)

![](https://i.imgur.com/lmR06Qi.jpg)


範例程式碼：
---


```C++
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

WiFiClient client;
HTTPClient http; 

#define AP_ID "Your AP SSID"
#define AP_PWD "Your AP password"
const String access_token = "Your Device Access Token";

int value_sensor = 0;
int value_led = 0;

void connectWiFi() {
  WiFi.begin(AP_ID, AP_PWD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  Serial.println("");
  Serial.print("WiFi ");
  Serial.print(AP_ID);
  Serial.println ("connected");  
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

void post(String device_key, String data){  
  Serial.print("[HTTP] begin...\n");
  http.begin(client, "http://iiot.ideaschain.com.tw/api/v1/"+device_key+"/telemetry");  //Specify destination device by its access token
  http.addHeader("Content-Type", "application/json");                                     
  Serial.print("[HTTP] POST...\n");
  int httpCode = http.POST(data); 
  if (httpCode > 0) {
    Serial.printf("[HTTP] POST... code: %d\n", httpCode);
    if (httpCode == HTTP_CODE_OK) {
      const String& payload = http.getString();
      Serial.println("received payload:\n<<");
      Serial.println(payload);
      Serial.println(">>");
    }
  } 
  else {
      Serial.printf("[HTTP] POST... failed, error: %s\n", http.errorToString(httpCode).c_str());
  }
  http.end();  
}

void setup() {
  pinMode(LED_BUILTIN, OUTPUT)  
  Serial.begin(115200);
  delay(10);
  while (!Serial) { ; }   
  connectWiFi();
}

void loop(){
  value_sensor = analogRead(0);       
  value_led = (value_sensor >= 700) ? 0:1 ;   
  digitalWrite(LED_BUILTIN, value_led); 
  Serial.println();
  Serial.println("Sensor Value:"+String(value_sensor)+", LED:"+String(value_led));
  String data = "{\"sensor\":"+String(value_sensor)+"\", led\":"+String(value_led)+"}";  
  post(access_token, data);       
  delay(5000);  
}
```


量測的結果：
---

在 <font color="red">IDEAS Chain</font> 雲端物聯網數據平台上, 你可即時看到剛剛上傳的資料與圖表, 範例如下:

![](https://i.imgur.com/nsY2kR5.jpg)

![](https://i.imgur.com/mu77rOc.jpg)



![](https://i.imgur.com/txhLLun.jpg)

:::info
執行時, 在本機 Arduino IDE 的 Serial Monitor 監視器上，也可以看到 MQ-135 正在蒐集檢測的值。正常的空氣品質下, 約在150左右，若異常約落在700以上。
:::

---

* ***Yungger 勇哥***： :smile::smile::smile: 就是這麼簡單, 希望能對你邁向創客之路有更近一步的幫助 ! 

