ESP32同时使用Wifi与DallasTemperature出现Guru Meditation Error如何解决
ESP32同时使用WiFi与DS18B20传感器报错解决方案
问题根因
- 串口初始化顺序错误:
connectToWiFi函数中已调用串口输出方法,但你在setup中先执行WiFi连接再初始化串口,未初始化的串口操作会触发非法内存访问。 - 代码语法缺陷:你提供的代码中
setup函数缺少闭合的}符号,会导致程序运行时栈结构异常。 - 库版本与资源冲突:你使用的2.0.0版本ESP32核心包搭配旧版OneWire库时,WiFi射频操作和OneWire直接读写GPIO寄存器的逻辑存在时序冲突,调用
sensors.begin()时会触发LoadProhibited错误。
修复方案
- 调整初始化顺序,将串口初始化放在
setup第一行,先初始化DS18B20传感器再连接WiFi,避免资源抢占。 - 补全代码的闭合括号,修正语法问题。
- 优先选择GPIO4、GPIO18、GPIO19这类与WiFi外设无复用关系的引脚连接DS18B20的数据线,避免硬件冲突。
- 升级OneWire库到2.3.5及以上版本,修复ESP32下与WiFi的兼容问题。
修复后参考代码
#include <OneWire.h> #include <DallasTemperature.h> #include <WiFi.h> // Wifi Settings #define WIFI_NETWORK "name" #define WIFI_PASSWORD "pass" #define WIFI_TIMOUT_MS 20000 // 建议更换到GPIO4等无复用引脚 const int oneWireBus = 4; OneWire oneWire(oneWireBus); DallasTemperature sensors(&oneWire); int status; int connectToWiFi() { Serial.println(" "); Serial.print("Connencting to WiFi"); Serial.print(" "); WiFi.mode(WIFI_STA); WiFi.begin(WIFI_NETWORK, WIFI_PASSWORD); unsigned long startAttemptTime = millis(); while(WiFi.status() != WL_CONNECTED && millis() - startAttemptTime < WIFI_TIMOUT_MS) { Serial.print("."); delay(700); } if (WiFi.status() != WL_CONNECTED) { Serial.println("Failed connect to WiFi!"); return 0; } else { Serial.print("Connected to WiFi:"); Serial.println(WIFI_NETWORK); Serial.println(WiFi.localIP()); return 1; } } void setup() { // 先初始化串口 Serial.begin(115200); // 先初始化传感器再连接WiFi sensors.begin(); status = connectToWiFi(); } void loop() { }
内容的提问来源于stack exchange,提问作者Marcel Kopera
相关产品推荐
相关产品推荐

