一開始從網路搜尋而來,修改了很多次幾乎內容全改,本來想把一些版權宣告刪掉因為怕太亂,不過秉持自由軟體開源精神,就都先保留囉!若有哪些程試片段版權是別人的,也麻煩告知喔!
程式路徑與檔名為:
雲端→空污感測實務課程→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; } }