[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吧!!


<<:  Day29 Blazor 单元测试

>>:  JavaScript class

【JavaScript】浅层拷贝与深层拷贝

【前言】 本系列为个人前端学习之路的学习笔记,在过往的学习过程中累积了很多笔记,如今想藉着IT邦帮忙...

【Day10】Git 版本控制 - 将档案 push 到 GitHub 的懒人包

今天来总结一下该如何将档案从本地数据库 push 到 GitHub 上,写个简单的懒人包,也算再复习...

[区块链&DAPP介绍 Day26] Dapp 实战 投票系统 - 2

延续昨天没做完的议题,今天来把 js & html 补完,让变成一个完整的 Dapp 首先 ...

番外篇(2)一起来做 To Do List!- 实作篇(2)

大家新年快乐!上一篇完成後还剩下这些功能: 可以一次删除全部的代办事项 能删除所有已完成的代办事项的...

Day4 Python基础语法二

今天的影片内容为介绍在Python中常用来储存资料的形式,分别是串列(list)、元祖(tuple)...