
esp32集成了两个12位逐次逼近型(sar)adc,共支持18个测量通道。这两个adc单元分别为adc1和adc2,它们各自连接到不同的gpio引脚:
问题的关键在于,ADC2被Wi-Fi驱动程序占用。这意味着,当ESP32的Wi-Fi功能被激活并正在运行时,应用程序无法同时使用ADC2进行模拟量读取。如果尝试在Wi-Fi活跃状态下通过ADC2读取数据,将会遇到OSError: [Errno 116] ETIMEDOUT: ESP_ERR_TIMEOUT这样的错误,表明ADC读取操作超时。这正是当代码尝试在GPIO 4(属于ADC2)上读取水位传感器数据时,同时Wi-Fi已连接所导致的问题。
要解决ADC与Wi-Fi的冲突,最直接有效的方法是避免使用ADC2的引脚来采集模拟量,转而使用ADC1的引脚。由于ADC1不与Wi-Fi驱动共享资源,因此可以在Wi-Fi活跃状态下自由使用。
推荐的ADC1引脚范围: GPIO 32 - GPIO 39。
以下是一个修改后的MicroPython代码示例,演示如何将水位传感器连接到ADC1的引脚(例如GPIO 34),从而实现ADC读取与Wi-Fi连接的并行工作:
立即学习“Python免费学习笔记(深入)”;
from machine import ADC, Pin
import network
import time
# 将ADC引脚更改为ADC1的可用引脚,例如GPIO 34
# 确保您的硬件已将传感器连接到新的引脚
adc_pin_num = 34
adc = ADC(Pin(adc_pin_num))
adc.atten(ADC.ATTN_11DB) # 设置衰减,以支持0-3.3V的输入范围
# Wi-Fi凭据
WIFI_SSID = "您的Wi-Fi名称"
WIFI_PASSWORD = "您的Wi-Fi密码"
def read_water_sensor():
"""读取水位传感器的模拟值"""
value = adc.read()
return value
def connect_wifi():
"""连接到Wi-Fi网络"""
sta_if = network.WLAN(network.STA_IF)
if not sta_if.isconnected():
print("正在连接到Wi-Fi...")
sta_if.active(True)
sta_if.connect(WIFI_SSID, WIFI_PASSWORD)
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.5)
print("\nWi-Fi连接成功!")
else:
print("已连接到Wi-Fi。")
# 连接到互联网
connect_wifi()
# 主循环:持续读取传感器值并打印
while True:
water_value = read_water_sensor()
print("水位传感器值:", water_value)
time.sleep(1) # 适当延长采样间隔代码说明:
ESP32的ADC2与Wi-Fi驱动共享硬件资源是导致ADC读取失败的常见原因。通过理解这一底层机制并选择ADC1的引脚(GPIO 32-39)来连接模拟传感器,可以有效地解决这一冲突,确保您的MicroPython项目能够同时稳定地进行模拟量采集和网络通信。在开发过程中,仔细规划引脚分配并参考官方文档是避免此类问题的关键。
以上就是ESP32 MicroPython中ADC与Wi-Fi共存问题解析与解决方案的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号