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

ESP32开发:C++运算出现inf值问题求助

解决按键间隔计算输出inf的问题

问题根源

你看到的inf是因为整数除法导致除以0:
time_passed是unsigned long类型(整数),当两次按键间隔小于1000毫秒时,time_passed/1000的结果是0。然后0.35 / 0在浮点数运算中会得到无穷大(inf),所以串口输出这个结果。

另外你的代码还有个小问题:直接检测按键高电平会导致按住按钮时loop反复触发计算,不是真正的“两次按下间隔”。

修复方案

  1. 把整数除法改成浮点数除法,避免出现除以0的情况
  2. 检测按键的上升沿(从松开到按下的瞬间),确保每次按键只触发一次计算
  3. 排除第一次按键的异常计算(初始start_time没有参考意义)

修改后的代码

const int ledPin = 5;
const int btnPin = 33;
unsigned long start_time = 0;
unsigned long time_passed;
double current_speed;
bool lastButtonState = LOW; // 记录上一次按键状态

void setup() {
  Serial.begin(115200);  
  pinMode(ledPin, OUTPUT);
  pinMode(btnPin, INPUT_PULLDOWN);
}

void loop() {
  bool buttonState = digitalRead(btnPin);
  
  // 只在按键从松开变为按下时触发
  if (buttonState == HIGH && lastButtonState == LOW) {
    time_passed = millis() - start_time;
    
    // 跳过第一次按键,同时过滤抖动
    if (time_passed > 25 && start_time != 0) {
      // 用1000.0触发浮点数除法,避免结果为0
      current_speed = (0.35 / (time_passed / 1000.0)) * 3.6;
      Serial.println(current_speed);
    }
    
    start_time = millis();
    digitalWrite(ledPin, !digitalRead(ledPin)); // 可选:按键按下时翻转LED反馈
  }
  
  lastButtonState = buttonState; // 更新上一次状态
}

关键修改说明

  • 把time_passed/1000改为time_passed/1000.0:1000.0是浮点数,运算时会把time_passed自动转换为浮点数,得到的是小数结果,不会出现0(除非time_passed是0,但我们已经用time_passed>25过滤了)
  • 上升沿检测:通过对比当前和上一次按键状态,确保只有按键按下的瞬间才执行计算,不会因为按住按钮重复触发
  • start_time != 0:第一次按键时start_time是初始值0,此时计算的间隔没有意义,直接跳过

内容的提问来源于stack exchange,提问作者Seyedmahdi moosavyan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 04:14:56