製做隨身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.麵包板(可有可無)


Arduino UNO R3,最普偏又好用的開發板,
因為才接觸Arduino不到兩個星期,有關網路功能,要等買到網路卡擴充板之後才能繼續了~



先把PMS5003T的線接出來,可參考了官方文件



OLED 0.96吋螢幕,小巧可愛
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();

}






留言

  1. 請問 PMS5003T 氣體感測器 D2 D4的腳位是第幾隻腳?
    程式用 Arduino 1.6.1 軟體 燒入可以嗎?

    回覆刪除
  2. PMS5003T 上有顏色,看顏色接就對了

    回覆刪除
  3. PMS5003T的interface是3.3V, arduino是5V interface, 久了, 會不會壞掉?

    回覆刪除

張貼留言

這個網誌中的熱門文章

電腦概論 -- 程式流程控制

0.96" OLED 上顯示數字跟文字