醬是創客的ESP32教學主題第七篇,以Ai-Thinker安信可NodeMCU-32S(使用Arduino語言)來實作教學,本篇教學將著單核多工Task事件處理,也就是我們常說如何用multi-task(多工處理)的方法在單核心下去跑,且不以delay的方式來卡住其他function函數,這個適用於需要同時跑MQTT、TTL訊號或RS232/485/422發送與讀取、亮滅LED、如何安排程式在單核心程式碼跑,並準時在某個時間點跑,請參考此篇

以下是我們今天的目標

  • LED亮與滅的操作與電子元件接線
  • 使用millis()函數來取得系統時間
  • 使用unsigned long來減去時間,並取得絕對時間。因為unsigned long(範圍是0 ~ 4294967295)循環特性,不論溢位與否,相減都可以取得絕對正數時間。所以不會有
    N天後程式碼就不會動的問題
  • 使用pinMode來定義21與22的output模式
  • 使用digitalWrite來亮滅LED

設備:
安信可NodeMCU-32S #露天拍賣 #蝦皮購物

NodeMCU-32S電路接線圖如下

  • GPIO21–(長腳)LED(短腳)–電阻(220歐姆)–GND
  • GPIO22–(長腳)LED(短腳)–電阻(220歐姆)–GND

Arduino 範例程式碼如下

//醬是創客 開發實作的好夥伴
#include "WiFi.h"

//task
unsigned long currentMillis = 0;
unsigned long previousMillisLED21 = 0;
unsigned long previousMillisLED22 = 0;
int intervalLED21 = 1000;
int intervalLED22 = 1500;
boolean LED21state = false; 
boolean LED22state = false; 
 
void setup() {
  Serial.begin(115200);
  //LED
  pinMode(21, OUTPUT);
  pinMode(22, OUTPUT);
}
 
void loop() {
   currentMillis = millis();
   
   if ((unsigned long)(currentMillis - previousMillisLED21) >= intervalLED21) {
      LED21state = !LED21state;
      digitalWrite(21, LED21state);
      // previousMillisLED21存入最後執行的時間
      previousMillisLED21 = currentMillis;
      Serial.println("In LED 21 Current time:");
      Serial.println(previousMillisLED21);
   }

   if ((unsigned long)(currentMillis - previousMillisLED22) >= intervalLED22) {
      LED22state = !LED22state;
      digitalWrite(22, LED22state);
      // previousMillisLED22存入最後執行的時間
      previousMillisLED22 = currentMillis;
      Serial.println("In LED 22 Current time:");
      Serial.println(previousMillisLED22);
   }  
}

Arduino 序列埠監控視窗 輸出如下

In LED 21 Current time:
31000
In LED 22 Current time:
31500
In LED 21 Current time:
32000
In LED 21 Current time:
33000
In LED 22 Current time:
33000