:::

4-1 為PM2.5感測器增加液晶顯示

器材準備

跟精簡版比起來這次加入LCD1602螢幕顯示PM2.5與溫溼度資訊,因為要多佔用兩個IO,所以原本的蜂鳴器就拿掉了,腳位規劃如下圖:

LCD1602_I2C在arduino已有LiquidCrystal_I2C函式庫可用,不過在ESP-01上面並不適用,GOOGLE一下網路上已有大德改寫完成,網址如下:

https://github.com/agnunez/ESP8266-I2C-LCD1602

請先下載函式庫解壓到arduino底下的library資料夾,命名為LiquidCrystal_I2C

編輯Arduino程式

#include <DHT.h>
#include <ESP8266WiFi.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h> 

#define  DHTPIN     1    
#define  DHTTYPE    DHT22 
DHT dht(DHTPIN, DHTTYPE,11);

LiquidCrystal_I2C lcd(0x27,16,2); // Check I2C address of LCD, normally 0x27 or 0x3F
  
//*-- IoT Information
#define SSID    "無線網路名稱"          
#define PASS    "無線網路密碼"       
#define HOST    "pm25.tn.edu.tw"     
#define PORT    80
String PMgps = "學校經緯度座標";  
String schoolcode = "學校代碼";   
int no = 0;                                  //設備編號,可設定0~255,在監測網上可區別一校多個設備
long updateInterval = 1200000;    //傳送資料時間間隔,測試完請設定1800000(30分鐘)
long updateLcd = 10000;     //LCD更新時間間隔
long resettime =86400000;       //每24小時自動重開機


//sharp GP2Y1051 二代 start
int incomeByte[7];
int data;
int z=0;
int sum, count;
float average_pm2d5,sum_2s;
unsigned long error, starttime, updateStart, updateStart2;

 
void updateSensor( float T)
{
  
   if(abs( millis() - updateStart2) > updateLcd ) { 
   float h = dht.readHumidity();
   float t = dht.readTemperature(); 
   lcd.clear();
   lcd.print("PM2.5:");
   lcd.print(T,1);
   lcd.setCursor(11,0);
   lcd.print("ug/m3");
   lcd.setCursor(0,1);
   lcd.print("T:");
   lcd.print(t,1);
   lcd.print("'C H:");
   lcd.print(h,1);
   lcd.print("%"); 
   updateStart2 = millis(); 
   }
     
   if(abs( millis() - updateStart) > updateInterval | updateStart == 0 ){    
  float h = dht.readHumidity();
  float t = dht.readTemperature();
     WiFiClient client;
    if( !client.connect( HOST, PORT ) )
    {
         return;
    }
    else
    {
        String getStr = "GET /xoops/api.php?schoolcode=" + schoolcode + "&no=" + no + "&pm25=" + T + "&t=" + t + "&h=" + h +"&gps=" + PMgps + " HTTP/1.1\r\n";
        client.print( getStr );
        client.print( "Host: pm25.tn.edu.tw\n" );
        client.print( "Connection: close\r\n\r\n" );
        client.stop();
        updateStart = millis();      //重設上傳時間
     }     
    }     
   
  
}

void setup()
{
    Serial.begin( 2400 );

    WiFi.begin( SSID, PASS );
 
    lcd.begin(0,2);      // In ESP8266-01, SDA=0, SCL=2               
    lcd.backlight();
    dht.begin();
    starttime=millis();      //設定Sharp感測器開始的擷取時間
    updateStart = millis();      //設定第一次即上傳
    updateStart2 = millis();      //LCD更新計時器
  
}
 
void loop(){
   //每24小時重開機
  if(starttime >= resettime) {
    ESP.restart();  
    }

  while (Serial.available()>0){
    data=Serial.read();
    if(data == 170){
      z=0;
      incomeByte[z]=data;
    }
    else{
      z++;
      incomeByte[z]=data;
    } 
    if(z==6)
    {
      sum=incomeByte[1]+ incomeByte[2]+ incomeByte[3] + incomeByte[4];
 
      if(incomeByte[5]==sum && incomeByte[6]==255 )
      {
        float vo=(incomeByte[1]*256.0+incomeByte[2])/1024.0*5.00;
        float pm = vo*700;
        sum_2s=sum_2s + pm;
        count++;
        if(abs(millis()-starttime)>2000){    
          average_pm2d5=(sum_2s/count)*1.00;
          updateSensor(average_pm2d5);
          starttime=millis();
          sum_2s=0;
          count=0;
        }
      }
      else{
        z=0;
        Serial.flush();
        data='/0';
        for(int m=0;m<7;m++){
          incomeByte[m]=0;
        }
      }
      z=0;
    }
  }
}

預設每10秒刷新一次螢幕資訊,每20鐘上傳資料到資訊中心,修改好後上傳到ESP-01(詳細上傳方式請參閱第1章)

電路接線圖

線太多看起來有點複雜,不過對顏色就不會錯了,圖片忘了標示上排電源是5V,下排電源3.3V

接好線路,插上變壓器,打完收工

圖示中T代表溫度,H代表溼度


搜尋