從 ESP32的接腳圖,看出 BOOT 按鈕對應的接腳為 GPIO0,即接腳 0
---------------------------------------------------------------------------------------
檔案/範例/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 熱點,結果如下: