
ESP32 ADC与Wi-Fi冲突的根本原因
esp32集成了两个12位逐次逼近型(sar)adc,共支持18个测量通道。这两个adc单元分别为adc1和adc2,它们各自连接到不同的gpio引脚:
- ADC1: 包含8个通道,连接到GPIO 32至GPIO 39。
- ADC2: 包含10个通道,连接到GPIO 0、2、4、12至15以及25至27。
问题的关键在于,ADC2被Wi-Fi驱动程序占用。这意味着,当ESP32的Wi-Fi功能被激活并正在运行时,应用程序无法同时使用ADC2进行模拟量读取。如果尝试在Wi-Fi活跃状态下通过ADC2读取数据,将会遇到OSError: [Errno 116] ETIMEDOUT: ESP_ERR_TIMEOUT这样的错误,表明ADC读取操作超时。这正是当代码尝试在GPIO 4(属于ADC2)上读取水位传感器数据时,同时Wi-Fi已连接所导致的问题。
解决方案:选择合适的ADC引脚
要解决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) # 适当延长采样间隔代码说明:
- adc_pin_num = 34: 将ADC引脚从GPIO 4更改为GPIO 34。请确保您的实际传感器已连接到ESP32的GPIO 34。
- adc.atten(ADC.ATTN_11DB): 这一行非常重要。ESP32的ADC在默认情况下可能无法读取0-3.3V的完整范围。ATTN_11DB衰减设置可以将输入电压范围扩展到约0-3.3V,以获得更准确的读数。根据传感器的输出电压范围,您可能需要调整衰减设置。
- time.sleep(1): 在主循环中增加适当的延迟,以避免过于频繁地读取和打印,这也有助于系统稳定运行。
注意事项与最佳实践
- 引脚选择: 在设计ESP32项目时,如果需要同时使用Wi-Fi和ADC功能,务必优先选择ADC1的引脚(GPIO 32-39)进行模拟量输入。
- 查阅文档: 始终参考ESP32的官方数据手册和MicroPython文档,了解特定引脚的功能限制和建议用途。这可以帮助您避免潜在的硬件冲突。
- 衰减设置: ADC的衰减设置(adc.atten())对测量精度至关重要。根据您的传感器输出电压范围,选择合适的衰减值。常见的选项包括ADC.ATTN_0DB(0-1.1V)、ADC.ATTN_2_5DB(0-1.5V)、ADC.ATTN_6DB(0-2.2V)和ADC.ATTN_11DB(0-3.9V,实际使用中通常认为0-3.3V)。
- 电源稳定性: 确保为ESP32和传感器提供稳定的电源。不稳定的电源可能导致ADC读数波动或系统不稳定。
- 代码优化: 对于需要上传数据的应用,可以考虑在每次读取后不立即上传,而是累积一定数量的数据或在特定时间间隔后批量上传,以减少网络开销。
总结
ESP32的ADC2与Wi-Fi驱动共享硬件资源是导致ADC读取失败的常见原因。通过理解这一底层机制并选择ADC1的引脚(GPIO 32-39)来连接模拟传感器,可以有效地解决这一冲突,确保您的MicroPython项目能够同时稳定地进行模拟量采集和网络通信。在开发过程中,仔细规划引脚分配并参考官方文档是避免此类问题的关键。










