MicroPython 开发ESP32应用教程 之 WIFI、BLE共用常见问题处理及中断处理函数注意事项

最近在用micropython 开发ESP32s3的应用项目时,总是碰到各种各样的问题,这些问题,在之前的课程中,为了聚焦每个课程的知识内容,我们没有提及,今天我们把之前遇到的一些问题及解决思路跟大家分享一下,希望能帮到碰到类似问题的朋友。

一、MicroPython for ESP32 不同固件之间的差异

要理解这点,我们首先要明白micropython与python的区别:

Python
1、运行于通用操作系统(如 Windows/Linux/macOS),依赖高性能硬件(多核 CPU、GB 级内存),适合桌面、服务器等场景‌ 。
2、作为通用语言,无法直接操作 GPIO、PWM 等硬件外设‌。
3、拥有完整的标准库(如 ossys)和丰富的第三方库(如 NumPy、TensorFlow),覆盖复杂计算场景‌

MicroPython
1、专为微控制器(如 ESP32、STM32)设计,支持资源受限设备(KB 级内存、MHz 级处理器),适用于嵌入式系统和物联网开发‌
2、提供 machine 等模块直接控制硬件(如引脚、传感器),支持实时外设交互(SPI/I2C/UART)‌
3、仅移植 Python 3.4 的部分标准库,功能简化(如不支持多线程),第三方库需针对嵌入式场景定制‌

个人以为,以上是两者主要区别,需要知道两者更多区别的朋友请自行搜索整理。

从以上区别,我们比较容易理解,不同微处理器的MicroPython‌固件,可能支持的功能模块会有所不同,甚至相同微处理器,固件版本不同,也会有差异。

我们现在正在开发的项目,本来开始的时候是打算使用ESP32C3开发的,但随着客户的需求逐渐明确,发现ESP32C3的IO口资源不够用,只能换成ESP32S3,从C3换成s3,开发语言使用的是micropython,按说是非常简单的一件事,但还是遇到问题了,获取天气信息的程序在c3上开发完成后,移植到S3上,说是缺少urequests模块,在开发环境中shell窗口输入help('modules')后,我们发现,s3的固件还真没有urequests模块。知道了原因,处理起来就比较简单,一换支持urequests模块的固件,二自己添加urequests模块。

二、BLE与WIFI共用的问题

这个问题,严格来说其实是第一个问题的具体表现,考虑到ESP32对BLE、WIFI共用的需求比较高,我们单独拿出来讲一讲。

我们开始用BLE来控制WS2812灯珠,功能实现没有问题,但加入WIFI后,总是报“WIFI internal error"之类的错误,在网上搜索原因:

<think>好的,我现在需要帮助用户了解如何通过ESP32-S3的蓝牙功能来配置WiFi连接。首先,我需要理清楚ESP32-S3的蓝牙和WiFi功能的基本情况。根据用户提供的引用,特别是引用[3]提到,当WiFi和蓝牙共存时,它们共用天线,可能会导致蓝牙阻塞,所以需要先初始化蓝牙,等连接成功后再启动网络代码。这是一个关键点,必须注意初始化顺序以避免冲突。 接下来,用户的需求是通过蓝牙来配置WiFi连接,这意味着需要利用蓝牙作为配置通道,传输WiFi的SSID和密码等信息。这通常被称为“蓝牙配网”技术,常见于智能家居设备中。引用[4]提到ESP32-S3集成了WiFiBLE 5.0,适合这种应用场景。 我需要考虑如何实现蓝牙服务,让手机或其他设备能够通过蓝牙发送WiFi凭证给ESP32-S3。首先,需要设置BLE服务,创建一个特征(Characteristic)用于接收数据。然后,当设备通过蓝牙接收到SSID和密码后,使用这些信息连接到WiFi网络。同时,需要处理蓝牙和WiFi的初始化顺序,确保蓝牙先启动并连接,再初始化WiFi,如引用[3]所述。 可能的步骤包括: 1. 初始化蓝牙并创建BLE服务。 2. 在BLE服务中设置特征用于接收配置数据。 3. 解析接收到的数据,提取SSID和密码。 4. 初始化WiFi并连接到指定热点。 5. 处理连接结果,通过蓝牙反馈状态给用户。 同时,需要注意数据格式的约定,比如使用JSON或特定分隔符来分割SSID和密码。此外,错误处理也很重要,比如WiFi连接失败时的重试机制或反馈。 还需要参考乐鑫官方的例程和文档,如引用[1]提到的ESP-IDF中的Wi-Fi Station例程,以及可能的蓝牙例程。可能需要结合使用BLEWiFi的API,确保两者协同工作。 最后,用户可能需要具体的代码示例和步骤说明,所以需要整理出一个清晰的教程,涵盖初始化顺序、蓝牙服务设置、数据解析和WiFi连接过程。同时,提醒用户注意共存时的初始化顺序问题,避免阻塞蓝牙连接。</think>### ESP32-S3通过蓝牙配置WiFi连接的实现方法 #### 1. 技术原理 ESP32-S3通过蓝牙协议(BLE)接收WiFi配置信息,利用其双模通信能力实现无线网络配置。此方法可避免传统WiFi直连配网的复杂操作,特别适用于无屏幕设备的网络初始化[^4]。 #### 2. 实现步骤 **步骤1:初始化蓝牙** ```cpp #include <BLEDevice.h> #include <BLEUtils.h> #include <BLEServer.h> BLEServer *pServer; BLEService *pService; BLECharacteristic *pCharacteristic; void setupBLE() { BLEDevice::init("ESP32-S3_Config"); pServer = BLEDevice::createServer(); pService = pServer->createService(SERVICE_UUID); pCharacteristic = pService->createCharacteristic( CHARACTERISTIC_UUID, BLECharacteristic::PROPERTY_WRITE ); pService->start(); BLEAdvertising *pAdvertising = BLEDevice::getAdvertising(); pAdvertising->addServiceUUID(SERVICE_UUID); pAdvertising->start(); } ``` **步骤2:配置蓝牙回调函数** ```cpp class ConfigCallback: public BLECharacteristicCallbacks { void onWrite(BLECharacteristic *pCharacteristic) { std::string value = pCharacteristic->getValue(); // 解析接收到的配置数据,格式示例:"SSID:PASSWORD" String config = String(value.c_str()); int colonIndex = config.indexOf(':'); String ssid = config.substring(0, colonIndex); String password = config.substring(colonIndex+1); // 存储配置信息 preferences.putString("wifi_ssid", ssid); preferences.putString("wifi_pwd", password); } }; // 在setup()中添加 pCharacteristic->setCallbacks(new ConfigCallback()); ``` **步骤3:WiFi连接实现** ```cpp #include <WiFi.h> void connectWiFi() { String ssid = preferences.getString("wifi_ssid"); String pwd = preferences.getString("wifi_pwd"); WiFi.begin(ssid.c_str(), pwd.c_str()); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("Connected to WiFi"); } ``` **关键注意事项:** 1. 必须**先初始化蓝牙**再启动WiFi,避免射频冲突[^3] 2. 建议使用NVS存储保存配置信息: ```cpp #include <Preferences.h> Preferences preferences; void setup() { preferences.begin("wifi-config", false); } ``` #### 3. 手机端交互流程 1. 手机扫描BLE设备并连接"ESP32-S3_Config" 2. 向指定特征写入配置数据(格式:SSID:Password) 3. ESP32-S3自动断开蓝牙连接 4. 设备使用存储的凭证连接WiFi #### 4. 典型应用场景 - 智能家居设备首次配网 - 工业现场无显示屏设备配置 - 需要远程更新的移动设备
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永远的元子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值