You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP8266+霍尔传感器+OLED转速表代码异常:仅重复执行setup求助

问题分析与解决方案

核心问题是代码中调用了未定义的prueba()函数,导致ESP8266程序崩溃触发看门狗重启,因此设备不断重复执行setup()函数,无法进入loop()运行逻辑。

修复步骤

  1. 移除未定义函数调用:删除setup()中的prueba();语句,这是导致重启的直接原因。
  2. 提前初始化中断:在setup()中完成中断挂载,无需等到loop()第一次执行时才挂载,确保程序启动后就能开始计数。
  3. 优化中断变量处理:读取volatile类型的counter时,使用临界区保护(关闭/开启中断),避免中断触发导致数据读取异常,同时无需频繁挂载/卸载中断。
  4. 移除冗余延迟: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 07:46:32