0

0

ESP32 MicroPython:解决ADC与Wi-Fi并发使用冲突的策略

DDD

DDD

发布时间:2025-10-04 12:09:01

|

370人浏览过

|

来源于php中文网

原创

ESP32 MicroPython:解决ADC与Wi-Fi并发使用冲突的策略

本教程旨在解决ESP32在使用MicroPython时,ADC(模拟数字转换器)与Wi-Fi模块并发操作可能遇到的冲突问题。核心在于ESP32的ADC2被Wi-Fi驱动占用,导致两者无法同时工作。文章将详细阐述这一硬件限制,并提供两种主要解决方案:优先选用ADC1引脚,或在特定场景下管理Wi-Fi状态,确保传感器数据采集与网络通信的稳定运行。

ESP32 ADC与Wi-Fi并发冲突:问题剖析

在使用micropython进行esp32项目开发时,开发者可能会遇到一个常见问题:当wi-fi连接激活后,adc(模拟数字转换器)的读取功能失效,并抛出oserror: [errno 116] etimedout错误。这通常发生在尝试读取连接到adc2通道的传感器数据时。

此问题的根源在于ESP32芯片的硬件设计。ESP32集成了两个12位SAR(逐次逼近寄存器)ADC,分别是ADC1和ADC2,共支持18个测量通道。

  • ADC1 拥有8个通道,对应GPIO 32至39。
  • ADC2 拥有10个通道,对应GPIO 0、2、4、12至15以及25至27。

关键限制在于,ADC2被Wi-Fi驱动程序占用。这意味着,当ESP32的Wi-Fi功能(无论是作为站点模式STA_IF还是接入点模式AP_IF)被激活时,ADC2的通道将无法被应用程序正常使用。任何对ADC2的读取尝试都将因资源冲突而超时。

解决方案一:优先选用ADC1引脚

解决ADC与Wi-Fi冲突最直接、最推荐的方法是避免使用ADC2引脚,转而使用ADC1的可用引脚进行模拟量读取。ADC1的通道与Wi-Fi驱动是独立的,因此可以在Wi-Fi活跃时稳定工作。

ADC1可用引脚列表:

立即学习Python免费学习笔记(深入)”;

  • GPIO 32
  • GPIO 33
  • GPIO 34
  • GPIO 35
  • GPIO 36
  • GPIO 39

请注意,某些ESP32开发板上的GPIO 34、35、36、39通常仅作为输入引脚,不具备内部上拉/下拉电阻,且不能用作输出。因此,它们是理想的ADC输入引脚。

以下是修改后的代码示例,将ADC引脚从原来的GPIO 4(ADC2通道)更改为GPIO 34(ADC1通道),以确保在Wi-Fi连接激活时也能正常读取传感器数据:

sematic
sematic

一个开源的机器学习平台

下载
from machine import ADC, Pin
import network
import time

# 将引脚更改为ADC1可用的引脚,例如GPIO 34
# 请根据您的传感器连接和ESP32开发板的实际引脚情况进行选择
adc_pin_number = 34
adc = ADC(Pin(adc_pin_number))
# 如果需要设置衰减,可以根据需要添加,例如:
# adc.atten(ADC.ATTN_11DB) # 0-3.6V

# Wi-Fi credentials
WIFI_SSID = "YOUR_WIFI_SSID"  # 替换为您的Wi-Fi SSID
WIFI_PASSWORD = "YOUR_WIFI_PASSWORD"  # 替换为您的Wi-Fi密码

def read_water_sensor():
    """
    读取水传感器(或其他模拟传感器)的ADC值。
    当使用ADC1引脚时,此函数在Wi-Fi活跃时也能正常工作。
    """
    value = adc.read()
    return value

def connect_wifi():
    """
    连接到指定的Wi-Fi网络。
    """
    sta_if = network.WLAN(network.STA_IF)
    if not sta_if.isconnected():
        print("Connecting to Wi-Fi...")
        sta_if.active(True)
        sta_if.connect(WIFI_SSID, WIFI_PASSWORD)
        while not sta_if.isconnected():
            time.sleep(0.5) # 增加延时避免忙等,减少CPU占用
        print("Connected to Wi-Fi")

# 连接Wi-Fi
connect_wifi()

# 循环读取传感器值并打印
while True:
    water_value = read_water_sensor()
    print("Water sensor value:", water_value)
    time.sleep(1) # 适当延长采样间隔,根据应用需求调整

通过将adc_pin_number设置为ADC1的可用引脚(例如34),可以有效避免Wi-Fi和ADC之间的冲突。

解决方案二:动态管理Wi-Fi状态(谨慎使用)

理论上,如果您的应用场景强制要求使用ADC2引脚,并且可以容忍Wi-Fi的短暂中断,那么可以考虑在读取ADC2之前暂时禁用Wi-Fi,读取完成后再重新激活Wi-Fi。

操作流程大致如下:

  1. 禁用Wi-Fi接口 (sta_if.active(False))。
  2. 读取ADC2引脚的模拟值。
  3. 重新激活Wi-Fi接口并重新连接 (sta_if.active(True) 后 sta_if.connect())。

然而,此方法强烈不推荐作为常规解决方案,原因如下:

  • 效率低下: 频繁地连接和断开Wi-Fi会消耗大量时间,影响系统响应速度。
  • 网络不稳定: Wi-Fi连接的频繁中断和重连可能导致网络不稳定,影响数据传输的可靠性。
  • 复杂性增加: 需要额外的逻辑来处理Wi-Fi的连接状态和错误处理,增加了代码的复杂性。

因此,除非有非常特殊且不可避免的需求,否则应始终优先选择使用ADC1引脚。

注意事项与最佳实践

  1. 深入了解ESP32引脚功能: 在项目设计初期,务必查阅您所使用的ESP32模块的数据手册和引脚图,明确哪些GPIO支持ADC功能,以及它们属于ADC1还是ADC2。
  2. 优先选择ADC1引脚: 在需要同时使用Wi-Fi和ADC功能的场景中,始终将模拟传感器连接到ADC1的可用引脚。
  3. 解析ETIMEDOUT错误: 当遇到OSError: [Errno 116] ETIMEDOUT错误时,首先检查是否正在使用ADC2引脚且Wi-Fi已激活。此错误通常是硬件资源冲突的信号。
  4. MicroPython固件更新: 确保您的ESP32设备运行的是最新稳定版的MicroPython固件,以获得最佳的兼容性和性能。
  5. 确保电源稳定: Wi-Fi模块在工作时会消耗相对较大的电流。不稳定的电源可能导致ESP32运行异常,甚至影响ADC的测量精度。

总结

ESP32的ADC2与Wi-Fi驱动共享资源是其硬件特性之一,导致两者无法同时工作。理解这一限制对于开发稳定可靠的MicroPython物联网应用至关重要。通过优先选择ADC1引脚进行模拟量读取,可以有效避免Wi-Fi和ADC之间的冲突,确保传感器数据采集与网络通信的并发执行。在极少数必须使用ADC2的场景下,动态管理Wi-Fi状态虽然可行,但因其效率低下和可能导致网络不稳定,故不作为推荐的通用解决方案。始终遵循最佳实践,仔细规划引脚分配,是成功开发ESP32项目的关键。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

989

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

50

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

195

2025.12.29

物联网有哪些应用
物联网有哪些应用

物联网应用有智能家居、智慧城市、工业自动化、农业智能化、物流和供应链管理、医疗健康、智能交通、能源管理、环境监测、智能零售等等。详细介绍:1、智能家居,物联网技术可以将家庭中的各种设备和家居系统连接到互联网,实现智能化的家居控制和管理,例如,通过智能手机可以远程控制家中的照明、温度、安防系统等;2、智慧城市,物联网技术可以应用于城市基础设施和公共服务,实现智慧城市的建设等等。

228

2023.09.05

物联网中的m2m概念
物联网中的m2m概念

M2M是人与机器连接的手段与方式。想了解更多的相关内容,可以阅读本专题下面的文章。

414

2024.03.12

物联网应用岗位
物联网应用岗位

常见岗位包括:物联网架构师;物联网工程师;数据分析师;云计算工程师;应用程序开发人员;嵌入式系统工程师;网络安全分析师;产品经理;物联网项目经理;业务分析师等等。想了解更多物联网应用的相关内容,可以阅读本专题下面的文章。

396

2024.05.21

传感器故障解决方法
传感器故障解决方法

传感器故障排除指南:识别故障症状(如误读或错误代码)。检查电源和连接(确保连接牢固,无损坏)。校准传感器(遵循制造商说明)。诊断内部故障(目视检查、信号测试、环境影响评估)。更换传感器(选择相同规格,遵循安装说明)。验证修复(检查信号准确性,监测异常行为)。

455

2024.06.04

vlookup函数使用大全
vlookup函数使用大全

本专题整合了vlookup函数相关 教程,阅读专题下面的文章了解更多详细内容。

28

2025.12.30

金山文档相关教程
金山文档相关教程

本专题整合了金山文档相关教程,阅读专题下面的文章了解更多详细操作。

29

2025.12.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.6万人学习

Django 教程
Django 教程

共28课时 | 2.6万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号