ESP8266+霍尔传感器+OLED转速表代码异常:仅重复执行setup求助
问题分析与解决方案
核心问题是代码中调用了未定义的prueba()函数,导致ESP8266程序崩溃触发看门狗重启,因此设备不断重复执行setup()函数,无法进入loop()运行逻辑。
修复步骤
- 移除未定义函数调用:删除
setup()中的prueba();语句,这是导致重启的直接原因。 - 提前初始化中断:在
setup()中完成中断挂载,无需等到loop()第一次执行时才挂载,确保程序启动后就能开始计数。 - 优化中断变量处理:读取
volatile类型的counter时,使用临界区保护(关闭/开启中断),避免中断触发导致数据读取异常,同时无需频繁挂载/卸载中断。 - 移除冗余延迟:
loop()中的delay(200)会阻塞程序运行,建议移除以保证转速计算的实时性。
修改后的完整代码
#include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SH110X.h> #define i2c_Address 0x3c ///< 地址参考 datasheet; 128x64 用0x3D, 128x32 用0x3C #define SCREEN_WIDTH 128 // OLED宽度 #define SCREEN_HEIGHT 64 // OLED高度 #define OLED_RESET -1 // QT-PY / XIAO 用-1 Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); const int ir_pin = 12; volatile unsigned int counter = 0; unsigned long previousMillis = 0; unsigned int rpm = 0; void setup() { pinMode(ir_pin, INPUT_PULLUP); delay(250); display.begin(i2c_Address, true); display.display(); delay(1000); display.clearDisplay(); display.setCursor(0, 0); display.setTextSize(1); display.setTextColor(SH110X_WHITE); display.print("WELCOME: "); display.display(); delay(1000); // 增加欢迎语显示时长,可选 display.clearDisplay(); // 初始化中断 attachInterrupt(digitalPinToInterrupt(ir_pin), IRinterrupt, RISING); } void loop() { unsigned long currentMillis = millis(); if(currentMillis - previousMillis >= 1000){ // 临界区保护读取counter noInterrupts(); unsigned int tempCounter = counter; counter = 0; interrupts(); rpm = tempCounter * 60; previousMillis = currentMillis; // 更新OLED显示 display.clearDisplay(); display.setTextSize(1); display.setTextColor(SH110X_WHITE); display.setCursor(0, 10); display.print("RPM: "); display.println(rpm); display.display(); } } void IRinterrupt(){ counter++; }
额外检查项
- 确认OLED的I2C地址是否正确:部分1.3寸SH1106模块的地址为
0x3D,如果显示异常可尝试修改i2c_Address。 - 霍尔传感器接线:确保传感器输出引脚正确连接到ESP8266的GPIO12(D6),且电源、接地接线正常。
- ESP8266中断引脚兼容性:如果GPIO12仍有异常,可更换为其他支持中断的引脚(如D2/GPIO4、D1/GPIO5)。
内容的提问来源于stack exchange,提问作者OSVALDO CESAR QUINTEROS TERRAZ
相关产品推荐
相关产品推荐

