:::

4-1 修改sample程式

    一開始從網路搜尋而來,修改了很多次幾乎內容全改,本來想把一些版權宣告刪掉因為怕太亂,不過秉持自由軟體開源精神,就都先保留囉!若有哪些程試片段版權是別人的,也麻煩告知喔!

程式路徑與檔名為:

    雲端→空污感測實務課程→Arduino程式→1050722→LED4_Buzzer_DHT22_ESP8266_Relay_air2_sample

 

    請將以下資訊修改完,才能上傳Arduino,這樣回傳的資料才不會大家都一樣。

1. 修改自己學校的無線網路名稱、密碼:例如名稱 jljhs-dlink-1 密碼 jljhs123


    雙斜線//內容後是註解,可保留中心電腦教室測試的無線網路名稱密碼,在前面加雙斜線註解掉就好。

2. 修改自己的學校代碼

3. 修改設備編號(若同校有兩個以上的老師參加研習,自行決定用哪個編號0~255)

4. 修改自己學校的GPS,參考以下文件,或參考「用Google Map取得GPS座標」教學影片。

    雲端→台南市國中小基本資料.doc

 

完整程式碼:

#include <SoftwareSerial.h>
#include <DHT.h>
#define _rxpin      4    //接ESP8266 TX
#define _txpin      5    //接ESP8266 RX
#define  RST        6    //接ESP8266 RST
#define  DHTPIN     7    //接DHT22資料傳輸
#define  LED_G      8    //接綠燈
#define  LED_Y      9    //接黃燈
#define  LED_R      10   //接紅燈
#define  LED_B      11   //接藍(紫)燈
#define  Relay2     12   //Control Fan or Light
#define  Buzzer     13   //接蜂鳴器
#define  DHTTYPE    DHT22 // SENSOR TYPE - THE ADAFRUIT LIBRARY OFFERS SUPPORT FOR MORE MODELS
DHT dht(DHTPIN, DHTTYPE);
SoftwareSerial WiFiSerial( _rxpin, _txpin ); // ESP8266 RX, TX

//*-- IoT Information
String SSID = "TN-Computer-bridge";          //無線網路名稱
String PASS = "computer123";                 //無線網路密碼
//String SSID = "修改自己的無線網路名稱";      //無線網路名稱
//String PASS = "修改自己的無線網路密碼";      //無線網路密碼
String schoolcode = "修改自己的學校代碼";    //學校代碼
int no = 0;                                  //設備編號,可設定0~255,在監測網上可區別一校多個設備
String PMgps = "修改自己的學校經緯度座標";   //學校經緯度座標
//long updateInterval = 1800000;               //傳送資料時間間隔,測試完請設定1800000(30分鐘)
long updateInterval = 10000;                 //傳送資料時間間隔,測試用10000(10秒鐘) 時間太短亦會發生錯誤

String IP = "pm25.tn.edu.tw";                //PM2.5網站網址

//sharp GP2Y1051 二代 start
int incomeByte[7];
int data;
int z=0;
int sum, sount;
unsigned long error, starttime;
 
// Arduino夏普GP2Y1051AU0F的串口讀取_源代碼_Weesky維天監製
// 作者ID:Weesky ; ...
// 2014年11月23日
// v1.0 基礎版本,成功讀取數值,並且算出PM2.5濃度。
// v1.1 改進了算法,這樣看起來數值高了些。對於愛好者操作更容易了。
//請不要在採樣週期裡面添加延遲delay這樣的。不然串口寄存器只有64Byte,很可能被塞滿。
// 修改者:ng344
// 增加溫濕度感測、2-way-relay、ESP8266、LED警示

void setup()
{
  Serial.begin(2400);
  dht.begin();
  WiFiSerial.begin(9600);
  starttime=millis();      //設定Sharp感測器開始的擷取時間
  sendtoWiFi("AT");
  delay(1000);
  if(WiFiSerial.find("OK"))
  {
    Serial.println("RECEIVED: OK after AT Command\nData ready to sent!");
    connectWiFi();
  }
  else{
    Serial.println("fale");
  }
  pinMode(LED_G,OUTPUT);
  pinMode(LED_Y,OUTPUT);
  pinMode(LED_R,OUTPUT);
  pinMode(LED_B,OUTPUT);
  pinMode(RST,OUTPUT);
  pinMode(Relay2,OUTPUT);
  pinMode(Buzzer,OUTPUT);
  
  digitalWrite(LED_G,LOW);
  digitalWrite(LED_Y,LOW);
  digitalWrite(LED_R,LOW);
  digitalWrite(LED_B,LOW);
  digitalWrite(RST,HIGH);
  digitalWrite(Relay2,HIGH);
  
}
 
void loop(){
  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 )
      {
 
        /* Serial.print("Data OK! |");
        for(int k=0;k<7;k++)
        {
          Serial.print(incomeByte[k]);  //列印出接收到Sharp的資料
          Serial.print("|");
        } 
        */
        //Serial.print(" Vo=");
        float vo=(incomeByte[1]*256.0+incomeByte[2])/1024.0*5.00;
        //Serial.print(vo,3);
        //Serial.print("v | ");
        float T = vo*700;
        // 這裡我修改過咯,2014年11月23日,v1.1
        // 普通Arduinio玩家也可以算出濃度啦!
        // 當然更精準的還需要自行標定哦:)  
        //Serial.print(" PM2.5 = ");
        //Serial.print(T,2);
        //Serial.print("ug/m3 ");
        //Serial.println();
        updateSensor(T);
        delay(updateInterval);   // 設定傳送時間間隔
      }
      else{
        z=0;
        Serial.flush();
        data='/0';
        for(int m=0;m<7;m++){
          incomeByte[m]=0;
        }
      }
      z=0;
    }
  }
}

void updateSensor( float T)
{
  digitalWrite(LED_G,HIGH);
  digitalWrite(LED_Y,HIGH);
  digitalWrite(LED_R,HIGH);
  digitalWrite(LED_B,HIGH);
  delay(2000);

  digitalWrite(LED_G,LOW);
  digitalWrite(LED_Y,LOW);
  digitalWrite(LED_R,LOW);
  digitalWrite(LED_B,LOW);
  delay(1000);
  
   if(T>=0 && T<36) {
    digitalWrite(LED_G,HIGH);
   }
   else if(T>=36 && T<54) {
    digitalWrite(LED_Y,HIGH);
   }
   else if(T>=54 && T<71) {
    digitalWrite(LED_R,HIGH);
   }
   else if(T>=71 && T<200) {
    digitalWrite(LED_B,HIGH);
   }
   else if(T>=200) {
    digitalWrite(LED_B,HIGH);
    digitalWrite(Relay2,LOW);
    delay(1000);
    tone(Buzzer,500);
    delay(1000);
    tone(Buzzer,1000);
    delay(1000);
    noTone(Buzzer);}
   else {digitalWrite(Relay2,HIGH);
    delay(1000);
   }
    //   noTone(Buzzer);}
    // 設定 ESP8266 作為 Client 端
    String cmd = "AT+CIPSTART=\"TCP\",\"" + IP + "\",80";
    sendtoWiFi(cmd);
    delay(1000);
    if( WiFiSerial.find("Error") )
    {
        Serial.print( "RECEIVED: Error\nExit1" );
        return;
    }
    float h = dht.readHumidity();
    float t = dht.readTemperature();
    boolean sendOK = false;  
    
    cmd = "GET /xoops/api.php?schoolcode=" + schoolcode + "&no=" + no + "&pm25=" + T + "&t=" + t + "&h=" + h + "&gps=" + PMgps + "\r\n";
    sendtoWiFi("AT+CIPSEND=" + (String)cmd.length());
    delay(5000);

    if(WiFiSerial.find( ">" ) )
    {
        Serial.print(">");
        WiFiSerial.print(cmd);          //送出pm2.5資料
        if( WiFiSerial.find("OK") ){    //檢查WiFi模組是否正確傳出資料
          sendOK = true;
          }
        Serial.print(cmd);
    }
    else
    {
        sendtoWiFi( "AT+CIPCLOSE" );
    }

    if(sendOK)
    {
        Serial.println( "RECEIVED: OK" );
    }
    else
    {
        Serial.println( "RECEIVED: Error\nExit2" );
     // reset ESP8266
        digitalWrite(RST,LOW);  //need chang to HIGH if  Relay use HIGH active
        delay(1000);
        digitalWrite(RST,HIGH);  //need chang to LOW if  Relay use HIGH active
    }
}

void sendtoWiFi(String cmd)
{
    Serial.print("SEND: ");
    Serial.println(cmd);
    WiFiSerial.println(cmd);
}

boolean connectWiFi()
{
    WiFiSerial.println("AT+CWMODE=1");
    Serial.println("Send AT+CWMODE=1");
    delay(3000);
    
    int count =0;
    String cmd="AT+CWJAP=\"" + SSID + "\",\"" + PASS + "\"";
    sendtoWiFi(cmd);
    Serial.println("Waiting for 15 second to connect network .....");
    delay(15000);
    
    /*
    if(WiFiSerial.find("OK"))
    {
        Serial.println("RECEIVED: OK");
        return true;
    }
    else
    {
        Serial.println("RECEIVED: Unknown");
        return false;
    }
    */
    
     cmd = "AT+ CIPMUX=0";
     sendtoWiFi( cmd );
     if( WiFiSerial.find( "Error") )
    {
        Serial.print( "RECEIVED: Error" );
        return false;
    }
    
}