:::

8. 程式撰寫

一、需下載安裝的軟體或程式

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);
} 

 


搜尋