網頁

2017年9月26日 星期二

Arduino ESP32 教學 - 三個實作範例

範列一:寫一個程式,按  BOOT 按鈕一次,led 閃爍的間隔時間變短,即閃爍速度變快。

從 ESP32的接腳圖,看出 BOOT 按鈕對應的接腳為 GPIO0,即接腳 0
Pin Functions

---------------------------------------------------------------------------------------
檔案/範例/01.Basics/Blink
因為 led 是在接腳16 ,所以在程式碼內增加一條敘述:
#define LED_BUILTIN 16 

改完後,再按「上傳」。(請先確定 esp32 要切換到 「on」的位置)
---------------------------------------------------------------------------------------
檔案/範例/01.Basics/DigitalReadSerial
DigitalReadSerial
int pushButton = 0; // boot 按鈕在接腳 0
pinMode(pushButton, INPUT_PULLUP);  //原來的 INPUT 改成  INPUT_PULLUP

改完後,再按「上傳」。

按 右邊的「序列埠監控視窗」,看 com3 的結果。
若看不到結果,請把 下面的 baud rate 改成 9600。( 因程式 serial.begin(9600) )
當你按 esp32控制板的boot按鈕,com3 的視窗會出現0。

檔案/新增 (或直接 按 「新增」 圖示)
將 DigitalReadSerial 內的程式 拷貝過來
把原來的 int pushButton = 0 改成
int pushButton = 0, delaytime=100;// time 是保留字,不能用

將  Blink內的程式某些指令敘述 拷貝過來
#define LED_BUILTIN 16 // led is pin 16

 pinMode(LED_BUILTIN, OUTPUT);

digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
 delay(1000);                       // wait for a second
 digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
 delay(1000);

加上下面敘述:
// 按了 button 按鈕,delaytime減 10,led 閃爍愈快,但如果delaytime <0 ,就改成 delaytime=100

if(buttonState==0){
  delaytime -=10;
  if (delaytime < 0){
    delaytime=100;
  }
最後程式如下:
---------------------------------------------------------------
#define LED_BUILTIN 16 // led is pin 16

// digital pin 2 has a pushbutton attached to it. Give it a name:
int pushButton = 0, delaytime=100; // time 是保留字,不能用

// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
  // make the pushbutton's pin an input:
  pinMode(pushButton, INPUT_PULLUP);
  pinMode(LED_BUILTIN, OUTPUT);

}

// the loop routine runs over and over again forever:
void loop() {
  // read the input pin:
  int buttonState = digitalRead(pushButton);
  // print out the state of the button:
  Serial.println(buttonState);
  delay(1);        // delay in between reads for stability

  if(buttonState==0){
  delaytime -=10;
  if (delaytime < 0){
    delaytime=100;
  }
  }

  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(delaytime);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(delaytime);
}
結果:


-----------------------------------------------------------------------------------------------------

範列二:一開始 led 是亮,在15:53:01, led變暗。在15:54:01, led 又變亮

檔案/範例/wifi/WiFiIPv6

修改 wifi 的ssid和密碼。

#define STA_SSID "asus3"
#define STA_PASS "12345678"

加入
#define LED_BUILTIN 16

void setup 修改如下:
void setup(){
    Serial.begin(115200);
    WiFi.disconnect(true);
    WiFi.onEvent(WiFiEvent);
    WiFi.mode(WIFI_MODE_APSTA);
    WiFi.softAP(AP_SSID);
    WiFi.begin(STA_SSID, STA_PASS);
    pinMode(LED_BUILTIN, OUTPUT); // 一開始 led 是亮著
}

在 void wifiConnectedLoop(){
delay(1000); // 延1秒
....
......

Serial.printf("UTC: %02u:%02u:%02u (GMT)\n", h, m, s);


序列埠監控視窗的結果如下,每一秒 顯示一次時間,不過這不是台灣的時區,顯示 07時,但當時的時間是下午15時,所以應該加上 8 。


程式要求 :一開始 led 是亮,在15:53:01, led變暗。在15:54:01, led 又變亮

在 void wifiConnectedLoop() 修改程式如下:

Serial.printf("UTC: %02u:%02u:%02u (GMT)\n", h+8, m, s);

if( h+8 ==15  && m == 53 && s ==1 ){
      digitalWrite(LED_BUILTIN, HIGH);
      Serial.print("Light Off!!\n");
    }
 if( h+8 ==15 && m == 54 && s==1 ){
      digitalWrite(LED_BUILTIN, LOW);
      Serial.print("Light On!!\n");
    }

按「上傳」鈕,要裝電池,才能連到 wifi  熱點。

結果:
一開始 led 是亮著

在 15:53:01, led 變暗

在 15:54:01, led 又變亮

問題 :
根據 com3輸出的結果,有時不一定每秒都會出現,例如 1秒,又跳到3秒。

題目 :一開始 led 是亮,但在  09:56:01 要讓 led 變暗,到了 09:56:30 又要變亮
所以把程式改成:
在最前面加
int lighoff =0 ;//一開始是亮
void wifiConnectedLoop() 改成:

Serial.printf("UTC: %02u:%02u:%02u (GMT)\n", h+8, m, s);
     if ( !lightoff ) {
        if( h+8 ==9  && m == 56 && s >= 1 && s< 30 ){
         
           digitalWrite(LED_BUILTIN, HIGH);
           Serial.print("Light Off!!\n");
           lightoff=1;
              }
     }
    else {
         if( h+8 ==9 && m == 56  && s >=30 ){
   
          digitalWrite(LED_BUILTIN, LOW);
          Serial.print("Light On!!\n");
          lightoff=0;
          }           
         }
完整程式碼
結果為:

-------------------------------------------------------------------------------------------------------------
範列三:如何修改時區
草稿碼/匯入程式庫 /加入 .ZIP程式庫, 選擇 time.zip, 匯入

檔案/範例/time

結果:

工具/開發板/ESP32 Dev Module

工具/Core Debug level /Verbose

在 time 視窗, 修改 wifi ssid  的名稱和 wifi   密碼。

onst char* wifi_ssid = "asus3";
const char* wifi_pass = "12345678";

在 time.h 時區改為 JST-8。

Time(char *time_zone = "JST-8"): time_zone(time_zone) {}

上傳完畢,要裝電池,才能連到 wifi  熱點,結果如下:

有關  ESP32 的更多例子,我改用 BlocklyDuino 來設計,請看我的一系列文章「A.課程設計與教學-上課實作範例- BlocklyDuino-ESP32」,例如: