ESP32开发:C++运算出现inf值问题求助
解决按键间隔计算输出inf的问题
问题根源
你看到的inf是因为整数除法导致除以0:time_passed是unsigned long类型(整数),当两次按键间隔小于1000毫秒时,time_passed/1000的结果是0。然后0.35 / 0在浮点数运算中会得到无穷大(inf),所以串口输出这个结果。
另外你的代码还有个小问题:直接检测按键高电平会导致按住按钮时loop反复触发计算,不是真正的“两次按下间隔”。
修复方案
- 把整数除法改成浮点数除法,避免出现除以0的情况
- 检测按键的上升沿(从松开到按下的瞬间),确保每次按键只触发一次计算
- 排除第一次按键的异常计算(初始
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
相关产品推荐
相关产品推荐

