:::

5-5 修改新程式,上傳Arduino

程式路徑與檔名為:

雲端→空污感測實務課程→Arduino程式→1050513→LED4_Buzzer_DHT22_ESP8266_Relay_air1_sample

需修改程式內容如下紅色框框:

    新增設備編號欄位!若學校有2位以上的老師參加本研習,自行協調上傳的編號(0-255),以利辨識。

    回校安裝務必再看一下  3-3 回校安裝步驟,以免出錯

    最後付上 for Sharp GP2Y1010 新程式:

#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 start
int measurePin = 0; //連接空氣品質傳感器 to Arduino A0 pin
int ledPower = 2;   //Connect 3 led driver pins of dust sensor to Arduino D2
int samplingTime = 280;
int deltaTime = 40;
int sleepTime = 9680;
float voMeasured = 0;
float calcVoltage = 0;
float dustDensity = 0;
//sharp end
void setup() {
Serial.begin(9600);      //MONITOR
dht.begin();            //DHT22
WiFiSerial.begin(9600); //ESP8266
sendtoWiFi("AT");
delay(1000);
if(WiFiSerial.find("OK"))
{
Serial.println("RECEIVED: OK after AT Command\nData ready to sent!");
connectWiFi();
}
pinMode(ledPower,OUTPUT); //sharp
pinMode(RST,OUTPUT);
pinMode(LED_G,OUTPUT);
pinMode(LED_Y,OUTPUT);
pinMode(LED_R,OUTPUT);
pinMode(LED_B,OUTPUT);
pinMode(Relay2,OUTPUT);
pinMode(Buzzer,OUTPUT);
digitalWrite(RST,HIGH);  //CHANGE TO LOW IF HIGH ACTIVE
digitalWrite(LED_G,LOW);
digitalWrite(LED_Y,LOW);
digitalWrite(LED_R,LOW);
digitalWrite(LED_B,LOW);
digitalWrite(Relay2,HIGH);
}
void loop() {
digitalWrite(ledPower,LOW); // power on the LED
delayMicroseconds(samplingTime);
voMeasured = analogRead(measurePin); // read the dust value
delayMicroseconds(deltaTime);
digitalWrite(ledPower,HIGH); // turn the LED off
delayMicroseconds(sleepTime);
// 0 - 5V mapped to 0 - 1023 integer values
// recover voltage
calcVoltage = voMeasured * (5.0 / 1024.0);
// linear eqaution taken from http://www.howmuchsnow.com/arduino/airquality/
// Chris Nafis (c) 2012
if (calcVoltage < 0.583) {
dustDensity = 0;
}
else{
dustDensity = 6 * calcVoltage / 35 - 0.1;
}
Serial.print("Raw Signal Value (0-1023): ");
Serial.print(voMeasured);
Serial.print(" - Voltage: ");
Serial.print(calcVoltage);
Serial.print(" - Dust Density: ");
Serial.print(dustDensity * 1000); // 這裡將數值呈現改成較常用的單位( ug/m3 )
Serial.println(" ug/m3 ");
float T=dustDensity * 1000 ;
updateSensor(T);
delay(updateInterval);   // 設定傳送時間間隔
}
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;
}
}