設備:
1.攀藤 PMS5003T PM2.5 粉塵及溫濕度感測器
2.LCD1602 I2C接口
3. arduino uno
Plantower PMS5003T 是目前較受歡迎的PM2.5感測模組,採用雷射散射原理量測,最小量測粒徑0.3um,依據空氣中不同的懸浮顆粒個數,推算灰塵的質量濃度,體積小、接線簡單、數據詳細、穩定性強是此模組的特色,並且內嵌瑞士生產的溫濕度一體檢測晶片,可以同時監測空氣中顆粒物濃度和溫濕度的二合一傳感器。
PMS5003T型號簡稱為G5T,注意不要買到PMS5003 (G5),兩種價格差不多,有「T」代表多了溫溼度感測功能。
在 Arduino 整合環境功能表點選 草稿碼 / 匯入程式庫 / 管理程式庫
在右上方搜尋框輸入「pms」,下方會列出所有符合條件的程式庫,不同程式庫使用的程式碼並不相同。此處點 選「PMS Library」,該項目右下角會出現「安裝」鈕,按「安裝」鈕開始安裝。
Mirotek 1602 I2C 模組是一個16字元乘2行LCD顯示螢幕,帶有藍色背景和白色背光。原始的1602 LCD需要7個IO端口才能啟動和運行,但是我們的LCD 內置Arduino IIC / I2C接口,為您節省了5個IO端口。
介紹一個目前認為最無敵簡單的函式庫:LiquidCrystal_PCF8574。它第一個優點就是,只要在Arduino IDE的「程式庫管理員」中就能抓到,直接下載就能用!
程式中會有一行設定I2C的位址,基本上1602 LCD不是0x27就是0x3F,若顯示不出內容,請修改一下。
LCD背面,I2C轉接卡上有一個可變電組,用來調亮度的,一般出廠時,它都是調到最亮,可能完全看不到字,請用十字起子調整一下!
程式碼:
#include <LiquidCrystal_PCF8574.h>
#include <SoftwareSerial.h>
LiquidCrystal_PCF8574 lcd(0x27); // 設定i2c位址,一般情況就是0x27和0x3F兩種
long pmat10 = 0;
int pmat25 = 0;
long pmat100 = 0;
unsigned int temperature = 0;
unsigned int humandity = 0;
int pmat25_value=0;
SoftwareSerial pmsSerial(2, 3); // 將Arduino Pin2設定為RX, Pin3設定為TX
void pms5003t_spec(){
int count = 0;
unsigned char c;
unsigned char high;
while (pmsSerial.available()) {
c = pmsSerial.read();
if((count==0 && c!=0x42) || (count==1 && c!=0x4d)){
Serial.println("check failed");
break;
}
if(count > 27){
Serial.println("Done!!");
break;
}
else if(count == 10 || count == 12 || count == 14 || count == 24 || count == 26) {
high = c;
}
else if(count == 11){
pmat10 = 256*high + c;
Serial.print("PM1.0=");
Serial.print(pmat10);
Serial.println(" ug/m3");
}
else if(count == 13){
pmat25 = 256*high + c;
Serial.print("PM2.5=");
Serial.print(pmat25);
Serial.println(" ug/m3");
}
else if(count == 15){
pmat100 = 256*high + c;
Serial.print("PM10=");
Serial.print(pmat100);
Serial.println(" ug/m3");
}
else if(count == 25){
temperature = (256*high + c)/10;
Serial.print("Temp=");
Serial.print(temperature);
Serial.println(" (C)");
}
else if(count == 27){
humandity = (256*high + c)/10;
Serial.print("Humidity=");
Serial.print(humandity);
Serial.println(" (%)");
}
count++;
}
while(pmsSerial.available())
pmsSerial.read();
Serial.println();
}
void setup()
{
pmsSerial.begin(9600);
Serial.begin(9600);
lcd.begin(16, 2); // 初始化LCD
//lcd.begin(20, 4); // 如果是20x4的LCD就是用這行
} // setup()
void loop()
{
pms5003t_spec();
delay(1000);
{
Serial.println();
lcd.setBacklight(255);
lcd.clear();
lcd.setCursor(0, 0); //設定游標位置 (字,行)
lcd.print("PM2.5=");
lcd.print(pmat25);
lcd.print(" PM10=");
lcd.print(pmat100);
lcd.setCursor(0, 1);
lcd.print("T=");
lcd.print(temperature);
lcd.print("(C) ");
lcd.print("H=");
lcd.print(humandity);
lcd.print("(%)");
}
} // loop()