ESP32教學系列(七):以PMS5003T測量空氣品質 – 談UART的使用

前言

接下來的幾篇文章會陸續介紹微控制器常用的介面,這篇我們將使用攀藤科技推出的的PMS5003T PM2.5溫溼度二合一感測器來介紹ESP32 UART的用法。

UART簡介

UART的全名是「通用非同步接收器/發送器 (Universal Asynchronous Receiver/Transmitter)」,主要用途是實現串列資料的傳送與接收,一般常用於兩個不同設備或裝置之間的通訊,具體的實物通常會以微控制器內部的周邊裝置(peripheral)或是IC的形式出現。

使用UART傳輸訊息時,兩邊的設備需要用相同的資料格式以及約定好的傳輸速度才能互相通訊,這個資料傳輸速度在UART中稱為鮑率(baud rate),單位是bps (bits per sec),意思是每秒鐘傳送多少個位元數。如果格式或鮑率不一致,就會無法正確溝通。

UART的其中一項優點是只需要兩條資料線,一條用來發送資料(TX),另一條用來接收資料(RX),設備之間的TX與RX成對連接。

UART連接示意圖

在ESP32使用UART

Arduino名稱UART代號TXRX是否能直接使用
SerialUART0GPIO 1GPIO 3
Serial1UART1GPIO 10GPIO 9❌,需要重新定義接腳
Serial2UART2GPIO 17GPIO 16

ESP32總共有3個UART(3.3V TTL電壓準位),UART0與UART2都可以直接使用,但是UART1預設的兩隻接腳都連接到模組內的SPI Flash,沒辦法直接使用。

但由於ESP32有接腳多工(pin multiplexing)的功能,我們只要將UART1重新映射到其他GPIO後就依然可以正常使用。所有接腳都可以重新映射,一般會將UART0留做與開發板通訊,需要與其他裝置通訊時再使用UART1和UART2。

假如使用預設接腳,只需要在setup()函式中宣告即可。

Serial2.begin(9600); // 設定Serial2鮑率為9600

假如要重新映射接腳,首先要匯入HardwareSerial函式庫。這個函式庫已經內建在Arduino IDE,因此不需要另外安裝。

具體作法可以參考下面的程式範例:

#include <HardwareSerial.h>

HardwareSerial NewSerial(1);  // 使用UART1

void setup() {
  // 初始化NewSerial
  NewSerial.begin(9600, SERIAL_8N1, 12, 14) // 配置的參數依序為鮑率, UART配置, RX, TX。其餘參數使用預設值即可
}

void loop() {

}

其他說明事項

  • 自定義的NewSerial除了一開始要特別宣告之外,其他的用法都與一般的Serial相同(read, write, println, available, …)
  • Serial的第二項參數預設是SERIAL_8N1,意思是8個資料位元、無校驗位和1個停止位元。如果要使用其他配置可以參考Arduino文件中的Parameters欄(連結)(github連結)
  • GPIO34, 35, 36, 39接腳只能允許輸入,如果定義到TX接腳會無法使用。
  • GPIO 6~ GPIO 11連接到模組的SPI Flash,使用這些接腳可能會使ESP32運作時產生問題,在定義UART接腳時請記得避開。

測量空氣品質的好幫手 – PMS5003T

PMS5003T是攀藤科技推出的一款PM2.5溫溼度二合一感測器,它可以測量常見大小的懸浮微粒以及環境溫濕度數值做為目前空氣品質的參考。

測量懸浮微粒有很多種方法,專業的監測儀器大多使用β射線衰減法或是擺動式錐狀微量天平法,雖然結果準確、精度高,但價格昂貴,需要定期校正儀器、檢查管路流率與更換濾紙,通常只有政府單位或專業的實驗室才會使用這類儀器。

另一種常見的測量方法是雷射散射,它的原理是將一束雷射光打在空氣中,當空氣中有顆粒物時就會使雷射光產生散射,接著就能經由不同的散射角度以及光的強度進一步推算出空氣中不同尺寸的顆粒物濃度,是目前手持式懸浮微粒測量設備最常見的測量方法,攀藤科技推出的PMS系列感測器,包含PMS5003T內部也都是使用這種方法。

PMS5003T可以連續採集空氣中不同大小的懸浮微粒(如PM1.0、PM2.5、PM10)數量並且計算出質量濃度,最小可以測量到0.3um的顆粒。除了偵測懸浮微粒之外,在它的感測器內部另外有一顆測量溫濕度的晶片,這些資料(懸浮微粒與溫溼度的數值)會以UART輸出。

💡 Tips: 環境濕度對於雷射散射原理感測器的測量結果會有很大的影響,當濕度越高,測量誤差就越大。

外觀

感測器接口使用的是1.25mm的連接器,與一般杜邦線的規格不同,購買時可以注意一下店家有沒有附上轉接線或轉接板,這樣在實驗的時候會方便一些。

PMS5003T外觀
PMS5003T 訊號接口

連接器的另一端是進氣孔與出氣孔

PMS5003T 進氣風扇
PMS5003T 進氣風扇

腳位定義

感測器訊號經由3.3V 電壓準位的UART輸出,只需要4條線VCC、GND、TX、RX,就能完成基本的操作。

PMS5003T 引腳順序
PMS5003T 引腳順序

下表說明了感測器的接腳與功能:

接腳名稱功能
Pin1VCC電源正端 4.5 ~ 5.5V
Pin2GND電源負端
Pin3SET設定腳。高電位或空接是正常工作狀態;低電位為休眠狀態。TTL 邏輯準位3.3V
Pin4RXD序列埠接收腳。TTL 邏輯準位3.3V
Pin5TXD序列埠傳送腳。TTL 邏輯準位3.3V
Pin6RESET重置接腳,低電位重置。TTL 邏輯準位3.3V
Pin7NC空接
Pin8NC空接

💡 Tips: 注意Pin1需要接5V,其他通訊與控制接腳(Pin3~Pin6)的邏輯準位都是3.3V。

傳輸協議

在預設的主動傳輸模式下,PMS5003T的鮑率為9600bps,8個資料位元,無校驗位元,1個停止位元,資料總長度32 bytes。

根據官方的資料手冊(連結),主動式傳輸協議的資料內容如下表所示:

PMS5003T主動式傳輸協議的內容
PMS5003T主動式傳輸協議的內容

實際將感測器資料以16進位方式讀取出來後,搭配手冊的內容,我們就可以知道每個欄位資料所代表的意義:

訊框格式與實際資料
訊框格式與實際資料

上面這段資料所傳遞的訊息是:

  • PM1.0濃度: 8 ug/m^3
  • PM2.5濃度: 12 ug/m^3
  • PM10濃度: 12 ug/m^3
  • 溫度: 23 °C
  • 濕度: 44 %

現在我們已經知道感測器會傳出什麼內容了,接下來就來看看怎麼用ESP32讀取這些資料吧!

範例1: 讀取空氣中的懸浮微粒濃度

PMS5003T這顆PM2.5感測器使用UART傳輸資料,我們將會使用ESP32讀取感測器資料,將結果顯示在Arduino IDE的序列埠監控視窗上。

材料清單

元件連接示意圖

線路連接圖
線路連接圖

💡 Tips: 連接時要注意感測器與開發板的TX、RX腳位連接。

安裝函式庫

首先,我們先安裝PMS Library這個函式庫,它支援攀藤科技其他型號的PM2.5感測器,而且已經幫我們寫好了接收感測器資料的程式,使用起來相當方便。

安裝 PMS Library
安裝 PMS Library

程式碼

說明

在這個程式中,我們使用了Serial (UART0) 與 Serial2 (UART2)。Serial用來與電腦通訊,Serial2用來連接感測器。當感測器傳來資料時,Arduino IDE的序列埠監控視窗就會輸出PM1.0、PM2.5與PM10.0的數值。

執行結果

輸出結果
輸出結果

範例2: 讀取溫溼度與PM2.5數值

PMS Library最大的缺點是只能讀取懸浮微粒,但有熱心的網友幫忙擴充了溫溼度讀取的功能,我們只需要找出函式庫內容並且修改一下就可以讀取目前的溫溼度數值。

元件連接示意圖

硬體接線與範例1相同,因此不需要重新連接。

修改函式庫

接下來我們要找出PMS Library所在的位置,每台電腦的安裝路徑可能會略有不同,預設安裝的位置會在

C:\Users\USER\Documents\Arduino\libraries\PMS_Library\src

進入到src資料夾後,應該會看到PMS.cpp與PMS.h這兩個檔案

PMS Library 檔案
PMS Library 檔案

照著這個網站提供的程式修改函式庫的檔案內容後,接下來我們就可以讀取PM2.5以及溫溼度資料了!

程式碼

說明

由於PMS系列的感測器不是每一款都有溫溼度的功能,原始的函式庫裡面只讀取了空氣微粒的資料,而修改後的函式庫則是幫我們把訊息串後面的溫溼度數值也一起讀出來。

執行結果

懸浮微粒與溫濕度的感測輸出
懸浮微粒與溫濕度的感測輸出

小結

由於ESP32的GPIO有接腳多工(pin multiplexing)的功能,在使用UART的時候除了可以用預設的TX與RX接腳,也可以使用HardwareSerial函式庫重新映射到其他接腳,最多可以用到3組UART。唯一要注意的是,並不是所有的GPIO接腳都能使用(具體可以使用哪些接腳請參考 ESP32教學系列(三):數位輸入與輸出(上)),在映射時需要多加留意。我們也在這篇文章中實際解析PMS5003T這顆PM2.5感測器的用法與輸出的資料內容,並且以ESP32的UART讀取感測器資料,將資料顯示在序列埠監控視窗。下一篇文章將會談一談SPI的用法。