uno改進版專用驅動程式(WCH CH340G):http://www.wch.cn/download/CH341SER_EXE.html
Arduino程式編輯器下載:https://downloads.arduino.cc/arduino-1.8.9-windows.exe
匯入彩色螢幕程式庫(UTFT):https://drive.google.com/open?id=1Od6TVh_Moa6Zq1iW6-tpKqJcxmFidTiV
匯入方式:
下載完整pm2.5系統程式:
http://maker.tn.edu.tw/uploads/tad_book3/file/uno_esp8266_G5T_TFT.ino (108/5/1更新 for ALL )
http://maker.tn.edu.tw/uploads/tad_book3/file/uno_esp8266_G5T_TFT_NNJH.ino (108/5/1更新 for 南寧高中 )
http://maker.tn.edu.tw/uploads/tad_book3/file/uno_esp8266_G5T_TFT_NTIVS.ino (108/5/1更新 for 南工 )
下載方式:按右鍵,點「另存連結為(K)...」
修改現場 WiFi 名稱(SSID)和密碼(PASS),必須注意「 "TN-Edu-4G-1005" 」雙引號內不能有多餘的空格!!
SSID:TN-Edu-4G-1005
PASS:38786890
修改個人代號或場地名稱
南工物聯網系統:iot-user 改成自己自訂的代號或設備所在的場地名稱。
#include <SoftwareSerial.h> SoftwareSerial esp8266(7,8); // make RX Arduino line is pin 4, make TX Arduino line is pin 5. SoftwareSerial pmsSerial(2, 3); // RX, TX byte PmsList[32]; #include <UTFT.h> UTFT myGLCD(QD220A,A2,A1,A5,A4,A3); extern uint8_t SmallFont[]; extern uint8_t BigFont[]; extern uint8_t SevenSegNumFont[]; ////////請更改為你的資料//////// #define SLogo "修改液晶呈現的學校縮寫" #define SSID "修改自己的WiFi名稱" #define PASS "修改自己的WiFi密碼" #define ThingSpeakKEY "修改自己在ThingSpeak上的Key" #define SCHOOLCODE "修改自己的學校代碼" #define NO "修改自訂的設備編號" //////////////////////////////// bool CheckSum(uint8_t *__buf, int __n) { bool __flag = false; int __sum = 0; for(int i=0; i<(__n-2); i++) { __sum += __buf[i]; } if(__sum == ((__buf[__n-2]<<8) + __buf[__n-1])) { __flag = true; } return __flag; } void setup(){ /* pinMode(12,OUTPUT); digitalWrite(12,HIGH); pinMode(9,OUTPUT); pinMode(10,OUTPUT); pinMode(11,OUTPUT); */ pinMode(13,OUTPUT); digitalWrite(13,HIGH); pinMode(12,OUTPUT); digitalWrite(12,HIGH); pinMode(14,OUTPUT); //A0 digitalWrite(14,HIGH); //A0 String cmd; Serial.begin(9600); esp8266.begin(9600); // your esp's baud rate might be different //esp8266.begin(115200); // your esp's baud rate might be different pmsSerial.begin(9600); // PMS3003 UART has baud rate 9600 pmsSerial.setTimeout(1500); //sendDebug("AT+RST"); //delay(10000); sendEsp8266("AT"); delay(10000); sendEsp8266("AT+CWMODE=1"); delay(1000); cmd="AT+CWJAP=\""; cmd+=SSID; cmd+="\",\""; cmd+=PASS; cmd+="\""; sendEsp8266(cmd); myGLCD.InitLCD(); myGLCD.clrScr(); //analogWrite(5,100); myGLCD.setFont(BigFont); myGLCD.print("PM2.5 Sencor", 0, 0); myGLCD.setFont(BigFont); myGLCD.setColor( 255 , 255 , 0 ); myGLCD.print(SLogo, CENTER , 25); //設定螢幕顯示的學校縮寫 myGLCD.setFont(SmallFont); myGLCD.setColor( 255 , 0 , 0 ); myGLCD.print("(pm2.5)", 30 ,45); myGLCD.setFont(SmallFont); myGLCD.setColor( 255 , 0 , 0 ); myGLCD.print("ug/m3", 40 , 110); myGLCD.setFont(SmallFont); myGLCD.setColor( 255 , 0 , 0 ); myGLCD.print("(Temp)", 130 ,105); myGLCD.setFont(SmallFont); myGLCD.setColor( 255 , 0 , 0 ); myGLCD.print("(Humandity)", 120 ,135); } void loop(){ /*if (esp8266.available()){ Serial.write(esp8266.read());} if (Serial.available()){ esp8266.write(Serial.read());} */ if(pmsSerial.available()) { static int __index = 0; PmsList[__index] = pmsSerial.read(); switch(__index) { case 0: __index = (PmsList[0] == 0x42) ? 1 : 0; break; case 1: __index = (PmsList[1] == 0x4d) ? 2 : 0; break; case 2: __index = 3; break; case 3: int __len = (PmsList[2] << 8) + PmsList[3]; if(__len == (28)) { if(pmsSerial.readBytes(&PmsList[4], __len) == __len) { if(CheckSum(PmsList, 32) == 1) { int a; Serial.print("atmosphere, PM1.0="); a = (PmsList[10]<<8) + PmsList[11]; Serial.print(a); Serial.println(" ug/m3"); int b; Serial.print("atmosphere, PM2.5="); b = (PmsList[12]<<8) + PmsList[13]; Serial.print(b); Serial.println(" ug/m3"); int c; Serial.print("atmosphere, PM10="); c = (PmsList[14]<<8) + PmsList[15]; Serial.print(c); Serial.println(" ug/m3"); float t; Serial.print("Temperature="); t = (PmsList[24]<<8) + PmsList[25]; t = t/10; Serial.print(t); Serial.println("c"); float h; Serial.print("Humility="); h = (PmsList[26]<<8) + PmsList[27]; h = h/10; Serial.print(h); Serial.println("%"); delay(1000); myGLCD.setFont(SevenSegNumFont); if ((b) < (16)){ myGLCD.setColor(0, 255, 0); } else if( (b) > (16) & (b)<(36)) { myGLCD.setColor(VGA_YELLOW); } else if ((b) > (35) & (b)<(55) ){ myGLCD.setColor(208,123, 0); } else if ((b) > (54) & (b)<(151) ) { myGLCD.setColor(VGA_RED); } else if ((b) > (150) ) { myGLCD.setColor(VGA_PURPLE); } if ((b) < (10) ) { myGLCD.print("00"+String(b) , 5, 58 ); } else if ((b) > (9) & (b) < (100)) { myGLCD.print("0"+String(b) , 5, 58 ); } else if ((b) > (99) ) { myGLCD.print(String(b) , 5, 58 ); } myGLCD.setFont(BigFont); if ((t) < (10) ) { myGLCD.setColor(VGA_BLUE); myGLCD.print("0"+String(t) , 115 , 115); } else if ((t) > (9) & (t) < (100) ) { myGLCD.setColor(VGA_WHITE); myGLCD.print(String(t) , 115 , 115); } if (h < 10) { myGLCD.setColor(VGA_BLUE); myGLCD.print("0"+String(h) , 115 , 150); } else if (h > 9 & h < 65) { myGLCD.setColor(VGA_WHITE); myGLCD.print(String(h) , 115 , 150); } else if (h >= 65) { myGLCD.setColor(VGA_RED); myGLCD.print(String(h) , 115 , 150); } String IP ="184.106.153.149"; // ThingSpeak IP Address: 184.106.153.149 String GET = "GET /update?key=" ; GET += ThingSpeakKEY; String cmd = "AT+CIPSTART=\"TCP\",\""; cmd += IP; cmd += "\",80"; sendEsp8266(cmd); delay(1000); cmd = GET + "&field1="+a+"&field2="+b+"&field3="+c+"&field4="+t+"&field5="+h; //sendEsp8266( "AT+CIPSEND=105" ); sendEsp8266( "AT+CIPSEND="+(String)(cmd.length()+2) ); //送出的字串長度需+2 delay(1000); sendEsp8266(cmd); delay(1000); sendEsp8266( "AT+CIPCLOSE" ); delay(5000); IP ="120.115.2.47"; // 上傳台南市政府教育局PM2.5監測 http://maker.tn.edu.tw/modules/tn_pm25/index.php GET = "GET /api.php?schoolcode="; GET += SCHOOLCODE; GET += "&no="; GET += NO; cmd = "AT+CIPSTART=\"TCP\",\""; cmd += IP; cmd += "\",80"; sendEsp8266(cmd); delay(1000); cmd = GET + "&pm25="+b+"&t="+t+"&h="+h; sendEsp8266( "AT+CIPSEND="+(String)(cmd.length()+2) ); //送出的字串長度需+2 delay(1000); sendEsp8266(cmd); delay(1000); sendEsp8266( "AT+CIPCLOSE" ); /* if (b<16){ analogWrite(9,0);//綠 analogWrite(10,255);//藍 analogWrite(11,255);//紅 } else if( b > 16 & b<36) { analogWrite(9,0); analogWrite(10,255); analogWrite(11,0); } else if( b > 35 & b < 55) { analogWrite(9,100); analogWrite(10,200); analogWrite(11,100); } else if( b > 54 & b < 151) { analogWrite(9,255); analogWrite(10,255); analogWrite(11,0); } else if(b > 150 ) { analogWrite(9,255); analogWrite(10,0); analogWrite(11,0); } */ delay(6000); } } } __index = 0; break; } } } void sendEsp8266(String sent_cmd) { Serial.print("SEND: "); Serial.println(sent_cmd); esp8266.println(sent_cmd); }