ESP32 WiFi初始化导致GPIO2模拟读数固定为4095问题求助
问题原因
这个问题是ESP32的固有硬件限制导致的,核心冲突如下:
- ESP32共有2个ADC外设,分别为ADC1和ADC2,GPIO2属于ADC2的通道范围
- 乐鑫官方硬件设计中,ADC2和WiFi模块共用同一条硬件总线,当WiFi功能处于启用状态时,ADC2的控制权会被WiFi驱动完全占用,用户代码无法正常读取ADC2通道的模拟值,你遇到的固定返回满量程4095是该冲突的典型表现
- 你注释WiFi连接代码时WiFi未启动,ADC2控制权归用户代码所有,所以无论是空引脚读白噪声还是接传感器都能返回正常数值,启用WiFi后冲突触发,读数直接异常,完全符合该限制的特征
解决方案
方案1(最推荐)
将传感器的连接引脚更换到ADC1对应的GPIO引脚,ADC1的可用引脚为GPIO32、GPIO33、GPIO34、GPIO35、GPIO36、GPIO39,这些引脚的模拟读取完全不受WiFi功能影响,仅需修改代码中sensePin的定义值为对应引脚即可。
方案2(仅适用于无需持续保持WiFi连接的场景)
如果必须使用ADC2的引脚,可在每次读取模拟值前主动关闭WiFi,读取完成后再恢复WiFi连接,示例修改代码如下:
void TestSensor() { for (int i = 0; i < 100; i++) { // 读取前关闭WiFi释放ADC2控制权 WiFi.disconnect(true); WiFi.mode(WIFI_OFF); delay(10); senseOut = analogRead(sensePin); Serial.println(senseOut); // 读取完成后恢复WiFi连接 WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); // 等待WiFi连接成功的逻辑可自行补充 delay(100); } }
该方案会导致WiFi连接频繁断开重连,不适用需要持续联网的场景。
内容的提问来源于stack exchange,提问作者k_evan_a
相关产品推荐
相关产品推荐

