---
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.
重點材料說明:
---

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
實體接線圖:
---


範例程式碼:
---
```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> 雲端物聯網數據平台上, 你可即時看到剛剛上傳的資料與圖表, 範例如下:



:::info
執行時, 在本機 Arduino IDE 的 Serial Monitor 監視器上,也可以看到 MQ-135 正在蒐集檢測的值。正常的空氣品質下, 約在150左右,若異常約落在700以上。
:::
---
* ***Yungger 勇哥***: :smile::smile::smile: 就是這麼簡單, 希望能對你邁向創客之路有更近一步的幫助 !