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

Arduino LED显示圆周率代码故障排查及优化建议

Arduino LED圆周率显示问题排查与优化

问题根源

1. int类型溢出

Arduino中int是16位有符号整数,最大值为32767。你的代码中change每次循环乘10,执行到第5次循环时,change变为100000,远超32767,触发整数溢出,导致change值异常,后续计算完全偏离预期。

2. 浮点数精度误差

double类型无法精确存储十进制小数0.3141(二进制浮点数的固有局限),计算change*pi时会产生精度损失,转换为int后的值与预期不符,进一步导致亮灯错误。

修复后的代码

直接用数组存储要显示的圆周率数字序列,彻底规避浮点数和溢出问题:

#define led0 2
#define led1 3
#define led2 4
#define led3 5
#define led4 6
#define led5 7
#define led6 8
#define led7 9
#define led8 10
#define led9 11

// 存储要显示的数字序列:3、1、4、1,之后无限重复0
int pi_sequence[] = {3, 1, 4, 1};
int sequence_len = sizeof(pi_sequence)/sizeof(pi_sequence[0]);
int current_index = 0;

void setup() {
  // 批量初始化引脚
  for(int i=2; i<=11; i++){
    pinMode(i, OUTPUT);
  }
}

void loop(){
  int current_digit;
  // 先遍历序列,之后一直显示0
  if(current_index < sequence_len){
    current_digit = pi_sequence[current_index];
    current_index++;
  } else {
    current_digit = 0;
  }

  // 根据数字点亮对应LED
  switch(current_digit){
    case 0: digitalWrite(led0, HIGH); break;
    case 1: digitalWrite(led1, HIGH); break;
    case 2: digitalWrite(led2, HIGH); break;
    case 3: digitalWrite(led3, HIGH); break;
    case 4: digitalWrite(led4, HIGH); break;
    case 5: digitalWrite(led5, HIGH); break;
    case 6: digitalWrite(led6, HIGH); break;
    case 7: digitalWrite(led7, HIGH); break;
    case 8: digitalWrite(led8, HIGH); break;
    case 9: digitalWrite(led9, HIGH); break;
  }
  delay(200);
  // 熄灭所有LED
  for(int i=2; i<=11; i++){
    digitalWrite(i, LOW);
  }
}

优化建议

  • 用数组简化引脚管理:创建引脚数组int led_pins[] = {2,3,4,5,6,7,8,9,10,11};,通过led_pins[digit]直接获取对应引脚,省去大量宏定义和switch判断。
  • 替换delay为非阻塞延时:使用millis()实现非阻塞延时,避免程序在延时期间无法响应其他操作,方便后续扩展功能。
  • 扩展序列更便捷:若要增加圆周率更多位数,只需修改pi_sequence数组即可,无需改动逻辑代码。
  • 避免变量溢出:如果需要使用递增计数变量,优先选择unsigned long类型,其最大值为4294967295,大幅降低溢出风险。

内容的提问来源于stack exchange,提问作者Калоян Георгиев

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 10:17:46