之前写项目正好卡在这个地方,结果发现了这个官方例程
顺带就写篇博客
虽说是按键切换模式,但官方例程并未使用中断
代码
// 演示如何在wifi和蓝牙模式之间切换,或者同时使用
// 按键绑定在GPIO 0 和 GND之间,模式也随之按下而切换
#include "WiFi.h"
#define STA_SSID "wifi名称"
#define STA_PASS "wifi密码"
#define AP_SSID "Esp32"
enum { STEP_BTON, STEP_BTOFF, STEP_STA, STEP_AP, STEP_AP_STA, STEP_OFF, STEP_BT_STA, STEP_END }; //枚举,即别名
//没有指定值的枚举元素,其值为前一元素加 1。也就说 STEP_BTON 的值为 0,STEP_BTOFF 的值为 1...
void setup() {
Serial.begin(115200);
pinMode(12, INPUT_PULLUP); //引脚12,输入模式
WiFi.onEvent(WiFiEvent);
Serial.print("ESP32 SDK: ");
Serial.println(ESP.getSdkVersion());
Serial.println("按下按键切换至下一模式");
}
void loop() {
static uint8_t lastPinState = 1; //unsigned int ,esp32引脚默认电平为高
uint8_t pinState = digitalRead(12); //unsigned char
if(!pinState && lastPinState){ //如果本次引脚电平不等于前次
onButton();
}
lastPinState = pinState;
}
void onButton(){
static uint32_t step = STEP_BTON;
switch(step){
case STEP_BTON://BT only
Serial.println("** 启动蓝牙");
btStart();
break;
case STEP_BTOFF://ALL Off
Serial.println("** 关闭蓝牙");
btStop();
break;
case STEP_STA://STA Only
Serial.println("** 启动wifi站点模式");
WiFi.begin(STA_SSID, STA_PASS); //连接wifi
break;
case STEP_AP://AP Only
Serial.println("** 关闭wifi站点模式");
WiFi.mode(WIFI_AP);
Serial.println("** 开启AP模式");
WiFi.softAP(AP_SSID); //初始化AP,wifi名字为AP_SSID
break;
case STEP_AP_STA://AP+STA
Serial.println("** 启动wifi站点模式");
WiFi.begin(STA_SSID, STA_PASS);
break;
case STEP_OFF://All Off
Serial.println("** wifi关闭");
WiFi.mode(WIFI_OFF);
break;
case STEP_BT_STA://BT+STA
Serial.println("** 启动 wifi站点模式+蓝牙");
WiFi.begin(STA_SSID, STA_PASS);
btStart();
break;
case STEP_END://All Off
Serial.println("** 关闭 wifi站点模式+蓝牙");
WiFi.mode(WIFI_OFF);
btStop();
break;
default:
break;
}
if(step == STEP_END){
step = STEP_BTON;
} else {
step++;
}
//抖动消除
delay(100);
}
void WiFiEvent(WiFiEvent_t event){
switch(event) {
case SYSTEM_EVENT_AP_START:
Serial.println("AP Started");
WiFi.softAPsetHostname(AP_SSID);
break;
case SYSTEM_EVENT_AP_STOP:
Serial.println("AP Stopped");
break;
case SYSTEM_EVENT_STA_START:
Serial.println("STA Started");
WiFi.setHostname(AP_SSID);
break;
case SYSTEM_EVENT_STA_CONNECTED:
Serial.println("STA Connected");
WiFi.enableIpV6();
break;
case SYSTEM_EVENT_AP_STA_GOT_IP6:
Serial.print("STA IPv6: ");
Serial.println(WiFi.localIPv6());
break;
case SYSTEM_EVENT_STA_GOT_IP:
Serial.print("STA IPv4: ");
Serial.println(WiFi.localIP());
break;
case SYSTEM_EVENT_STA_DISCONNECTED:
Serial.println("STA Disconnected");
break;
case SYSTEM_EVENT_STA_STOP:
Serial.println("STA Stopped");
break;
default:
break;
}
}
结果: