Lab12-2

WIFI 上傳 thingspeak (DHT22溫度溼度)

[材料]

Arduino主板 x 1

麵包板 x 1

wifi ESP8266 x 1

DHT22 x 1  (參考Lab9的溫溼度感測器)

[數據上傳至ThingSpeak網站]

1. 先到ThingSpeak網誌註冊自己的帳號:https://thingspeak.com/,請自己的email@前的帳號來當作註冊ID,並新增一個頻道(channel)、包括兩個顯示圖(Field)。

2. 參考Lab9的電路,連接溫濕度感測器DHT22。

3.  溫濕度數據透過wifi,上傳至ThingSpeak,程式碼如下。


#include <SoftwareSerial.h>

SoftwareSerial esp8266(4,5); 

String apiKey = "";     // ""內輸入ThingSpeak的Write API Key

String ssid = "";       // ""內輸入wifi基地台的名稱

String password = "";   // ""內輸入wifi基地台的密碼

boolean DEBUG = true;


#include "DHT.h"        // 匯入DHT函式庫

DHT dht(2, DHT22);      // DHT22的訊號接到pin2


void showResponse(int waitTime){

    long t=millis();

    char c;

    while (t+waitTime>millis()){

      if (esp8266.available()){

        c=esp8266.read();

        if (DEBUG) Serial.print(c);

      }

    }        

}


boolean thingSpeakWrite(float value1, float value2){   //自己增加或減少要上傳的數據項目

  String cmd = "AT+CIPSTART=\"TCP\",\"";

  cmd += "184.106.153.149";

  cmd += "\",80";

  esp8266.println(cmd);

  if (DEBUG) Serial.println(cmd);

  if(esp8266.find("Error")){

    if (DEBUG) Serial.println("AT+CIPSTART error");

    return false;

  }

  String getStr = "GET /update?api_key=";

  getStr += apiKey;

  getStr +="&field1=";

  getStr += String(value1);

  getStr +="&field2=";

  getStr += String(value2);

  // getStr +="&field3=";                             //自己增加或減少要上傳的數據項目

  // getStr += String(value3);

  // ...

  getStr += "\r\n\r\n";

  cmd = "AT+CIPSEND=";

  cmd += String(getStr.length());

  esp8266.println(cmd);

  if (DEBUG)  Serial.println(cmd);

  delay(100);

  esp8266.print(getStr);

  if (DEBUG)  Serial.print(getStr);

  else{

    esp8266.println("AT+CIPCLOSE");

    if (DEBUG)   Serial.println("AT+CIPCLOSE");

    return false;

    }

  return true;

}



void setup() {                

  Serial.begin(9600); 

 

  //wifi的設定要排在前面

  esp8266.begin(115200);

  esp8266.write("AT+UART_DEF=9600,8,1,0,0\r\n");

  delay(1500);

  esp8266.begin(9600);

  Serial.println("ESP8266...OK");

  esp8266.println("AT+CWMODE=1");   // set esp8266 as client

  showResponse(10000);  

  esp8266.println("AT+CWJAP=\""+ssid+"\",\""+password+"\"");

  showResponse(10000);  //顯示並等待wifi完成連線


  //其他零件的設定排在後面

  dht.begin();

}



void loop() {

   float dhtT = dht.readTemperature();

   float dhtH = dht.readHumidity();

   Serial.println("Temp="+String(dhtT)+" *C");

   Serial.println("Humidity="+String(dhtH)+" %");

   

   delay(1000);                            // 傳送資料前,最好等待一秒處理再上傳

   thingSpeakWrite(dhtT, dhtH);                      //自己增加或減少要上傳的數據項目


   delay(20000);    // thingspeak需要15秒以上才能更新

}



[成果]

[基本問題]

1. 完成電路與程式,並將數據呈現在Thingspeak上。


[挑戰問題]

1. 調整圖表的呈現方式,包括資料量、時間間隔、圖表類型等不同呈現方式。