製做隨身PM2.5空氣感測器 - 使用Arduino uno R3/OLED 0.96"顯示器/PMS5003T感測器
隨身PM2.5空氣盒子製作
接觸Arduino的時間並不長,花了很多時間在了解硬體的規格上面,
深怕一不小心,就把東西給燒了!!
結果,不出所料,燒掉了一片Arduino UNO R3開發板~
準備的材料:
1.Arduino UNO R3
2.OLED 0.96吋顯示螢幕
3.PMS5003T 氣體感測器
4.擴充板(可有可無)
5.麵包板(可有可無)
先把PMS5003T的線接出來,可參考了官方文件
OLED 0.96吋螢幕,小巧可愛
SDA:A4;SDL:A5
全部組起來,很簡單,並不難!
反正只要有看到VCC,全部接到5V,
有看到GND,就接G或GND
還有,這顆螢幕,只有通電是沒有反應的,千萬不要認為壞掉了喔!
準備好了,寫程式了~~~
此份程式經過長時間除錯跟測試,應該是屬於很穏定版本了
深怕一不小心,就把東西給燒了!!
結果,不出所料,燒掉了一片Arduino UNO R3開發板~
準備的材料:
1.Arduino UNO R3
2.OLED 0.96吋顯示螢幕
3.PMS5003T 氣體感測器
4.擴充板(可有可無)
5.麵包板(可有可無)
Arduino UNO R3,最普偏又好用的開發板,
因為才接觸Arduino不到兩個星期,有關網路功能,要等買到網路卡擴充板之後才能繼續了~
先把PMS5003T的線接出來,可參考了官方文件
SDA:A4;SDL:A5
全部組起來,很簡單,並不難!
反正只要有看到VCC,全部接到5V,
有看到GND,就接G或GND
還有,這顆螢幕,只有通電是沒有反應的,千萬不要認為壞掉了喔!
準備好了,寫程式了~~~
此份程式經過長時間除錯跟測試,應該是屬於很穏定版本了
#define OLED_EN
#if defined (OLED_EN)
#include <U8glib.h>
U8GLIB_SH1106_128X64 u8g(U8G_I2C_OPT_NO_ACK);
#endif
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);
#define PMS_SET 4
#define LED 13
#if defined (OLED_EN)
long pmat10=0;
long pmat25=0;
long pmat100=0;
long pmt=0;
long pmh=0;
char buf[50];
int sensorVal;
#endif
void draw() {
u8g.setFont(u8g_font_8x13);
u8g.drawStr(0, 10, "T=");
u8g.setPrintPos(17, 10);
u8g.print(int(pmt));
u8g.drawStr(33, 10, "(C)");
u8g.drawStr(60 ,10, "H=");
u8g.setPrintPos(78, 10);
u8g.print(int(pmh));
u8g.drawStr(103, 10, "(%)");
u8g.drawStr(0,25, "PM2.5=");
u8g.setFont(u8g_font_fub25);
u8g.setPrintPos(50, 40);
u8g.print(int(pmat25));
u8g.setFont(u8g_font_profont12);
u8g.drawStr(0, 64, "PM1=");
u8g.setPrintPos(25, 64);
u8g.print(int(pmat10));
u8g.drawStr(60, 64, "PM10=");
u8g.setPrintPos(92, 64);
u8g.print(int(pmat100));
u8g.setFont(u8g_font_5x8);
u8g.drawStr(85, 52, "(ug/m3)");
}
void ecoMode(){
sensorVal = digitalRead(PMS_SET);
if (sensorVal == LOW){
delay(30000);
digitalWrite(PMS_SET, HIGH);
digitalWrite(LED, HIGH);
delay(30000);
}
else if (sensorVal == HIGH){
digitalWrite(PMS_SET, HIGH);
digitalWrite(LED, HIGH);
}
}
void retrievepm25(){
int count = 0;
unsigned char c;
unsigned char high;
while (mySerial.available()) {
c = mySerial.read();
if((count==0 && c!=0x42) || (count==1 && c!=0x4d)){
Serial.println("check failed");
break;
}
if(count > 27){
Serial.println("complete");
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){
pmt = (256*high + c)/10;
Serial.print("Temp=");
Serial.print(pmt);
Serial.println(" (C)");
}
else if(count == 27){
pmh = (256*high + c)/10;
Serial.print("Humidity=");
Serial.print(pmh);
Serial.println(" (%)");
}
count++;
}
while(mySerial.available()) mySerial.read();
Serial.println();
}
void decidePM25(){
if(pmat25 >= 40){
u8g.firstPage();
do {
draw();
u8g.setFont(u8g_font_5x8);
u8g.drawStr(0, 52, "(Normal Mode)");
} while( u8g.nextPage() );
delay(500);
digitalWrite(PMS_SET, HIGH);
digitalWrite(LED, HIGH);
sensorVal = digitalRead(PMS_SET);
Serial.println("normalMode");
Serial.println(sensorVal,DEC);
delay(1500);
}
else {
u8g.firstPage();
do {
draw();
u8g.setFont(u8g_font_5x8);
u8g.drawStr(0, 52, "(Economic Mode)");
} while( u8g.nextPage() );
delay(500);
digitalWrite(PMS_SET, LOW);
digitalWrite(LED, LOW);
sensorVal = digitalRead(PMS_SET);
Serial.println("ecoMode");
Serial.println(sensorVal,DEC);
}
ecoMode();
}
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
pinMode(PMS_SET, OUTPUT);
// pinMode(4,INPUT_PULLUP);
pinMode(LED,OUTPUT);
digitalWrite(PMS_SET, HIGH);
for (int i = 0; i < 30; i++) {
retrievepm25();
delay(2000);
u8g.firstPage();
do {
draw();
u8g.setFont(u8g_font_5x8);
u8g.drawStr(0, 52, "(Normal)");
} while( u8g.nextPage() );
}
delay(500);
}
void loop() {
retrievepm25();
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );
delay(500);
decidePM25();
}
請問 PMS5003T 氣體感測器 D2 D4的腳位是第幾隻腳?
回覆刪除程式用 Arduino 1.6.1 軟體 燒入可以嗎?
PMS5003T 上有顏色,看顏色接就對了
回覆刪除PMS5003T的interface是3.3V, arduino是5V interface, 久了, 會不會壞掉?
回覆刪除怕的話接個電組就行了~
刪除