iT邦幫忙

2021 iThome 鐵人賽

DAY 29
0
自我挑戰組

Maker making IoT !!系列 第 29

[Day28] Esp32 + IFTTT + Google Sheet - (程式碼講解)

1.前言

OK,今天要來說說Code的部分,上一篇我們把資料儲存在Google Sheet中,那今天就是程式碼的解說,這次程式碼的loop就使用到非常少,因為此次程式利用到方法。

2.方法 Function

這個技巧在許多城市中都很常遇見,這大幅減少主程式的程式碼,而變成在需要用到時再去使用,類似於函式,下面會開始講解上次的程式碼。

void loop() {
  initWifi();
  makeIFTTTRequest();
  //delay(20000);       //Send Time
  // enable timer deep sleep
    esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);    
    Serial.println("Going to sleep now");
    // start deep sleep for 3600 seconds (60 minutes)
    esp_deep_sleep_start();
}

是否有看見在第32、33、36行,都寫上一段程式,但如果你跑去網路上查詢此段意思可能查無結果,因為該段程式碼就寫在程式裡面,只是透過這幾行去呼叫而已,舉例第32行執行後,程式會接續去呼叫第43行的initWifi(),那當initWifi()這區塊程式跑完。就又會回到loop中接續執行第33行,然後就持續接續下去。

void initWifi() {
  Serial.print("Connecting to: "); 
  Serial.print(ssid);
  WiFi.begin(ssid, password);  

  int timeout = 10 * 4; // 10 seconds
  while(WiFi.status() != WL_CONNECTED  && (timeout-- > 0)) {
    delay(250);
    Serial.print(".");
  }
  Serial.println("");

  if(WiFi.status() != WL_CONNECTED) {
     Serial.println("Failed to connect, going back to sleep");
  }

  Serial.print("WiFi connected in: "); 
  Serial.print(millis());
  Serial.print(", IP address: "); 
  Serial.println(WiFi.localIP());
}

// Make an HTTP request to the IFTTT web service
void makeIFTTTRequest() {
  Serial.print("Connecting to "); 
  Serial.print(server);
  
  WiFiClient client;
  int retries = 5;
  while(!!!client.connect(server, 80) && (retries-- > 0)) {
    Serial.print(".");
  }
  Serial.println();
  if(!!!client.connected()) {
    Serial.println("Failed to connect...");
  }
    Serial.print("Request resource: "); 
  Serial.println(resource);
  // Temperature in Celsius
  String jsonObject = String("{\"value1\":\"") + myAHT10.readTemperature() + "\",\"value2\":\"" + myAHT10.readHumidity() + "\"}";
  client.println(String("POST ") + resource + " HTTP/1.1");
  client.println(String("Host: ") + server); 
  client.println("Connection: close\r\nContent-Type: application/json");
  client.print("Content-Length: ");
  client.println(jsonObject.length());
  client.println();
  client.println(jsonObject);
        
  int timeout = 5 * 10; // 5 seconds             
  while(!!!client.available() && (timeout-- > 0)){
    delay(100);
  }
  if(!!!client.available()) {
    Serial.println("No response...");
  }
  while(client.available()){
    Serial.write(client.read());
  }
    Serial.println("\nclosing connection");
  client.stop(); 
}

像這種前面有加void xxx()的這種,代表進入到這方法時只單純計算,卻不會回傳數值,而如果遇到前面加型別那救世會回傳數值。

例如

int test(int x){
    return x+10;
}
void loop(){
    int x = 10;
    Serial.print(test(x));
}

當程式跑到第6行要輸出時,會先跑test()這方法,而經過test()這方法後return(回傳)會把x+10在回傳回來,那除了上述寫法還有一種寫法。

int test(int x){
    return x+10;
}
void loop(){
    int x = 10;
    x = test(x);
    Serial.print(x);
}

像上面這例子,會到第6行進test()方法中在回傳x+10的數值,在透過第7行輸出,那這兩種都可以使用,只是各位需要記得,當方法有回傳值時,需要拿變數接收或輸出

歡迎交流

好了,因為此次程式碼中運用到許多方法的寫法,所以各位可能都不懂,所以就在這最後的教學又做一點科普,在上一篇的程式碼當中因為大部分也都跟前幾篇的傳輸大同小異,都是對函式庫中的函式做運用,運用的當可以做出更創新的用途,所以希望大家往後可以持續研究且繼續進步,開創出自己的小天地。明天是本次系列的最終章,就用結語來做個圓滿的THE END吧!!


上一篇
[Day27] Esp32 + IFTTT + Google Sheet
下一篇
[Day29] Maker making IoT完賽心得與一些後續的期待!
系列文
Maker making IoT !!30

尚未有邦友留言

立即登入留言