Arduino技术问题:循环末尾delay函数无法结束致程序仅运行一次
水培项目循环卡死问题排查与修复
问题根源
Arduino的delay()函数要求参数为无符号长整型(unsigned long),你的代码中存在两个关键问题:
- 整数溢出:16位Arduino的
int类型最大值为32767,2*1000*60=120000已超出范围,计算结果会变成负数;负数强制转为unsigned long时会变成极大数值,导致delay()执行时间远超预期,看起来像“永远无法结束”。 - 字符串输出错误:
Serial.println('On')使用单引号(仅适用于单个字符),会导致输出乱码,虽不影响循环,但属于语法错误。
修复方案
- 所有
delay()参数直接写整数常量,或在数值后加UL后缀强制转为无符号长整型,避免溢出。 - 修正
Serial.println的字符串引号,改用双引号包裹字符串。
修改后的代码
#include <Wire.h> #include <Adafruit_PWMServoDriver.h> Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); #define SERVOMIN 250 #define SERVOMAX 650 #define USMIN 600 #define USMAX 2400 #define SERVO_FREQ 50 uint8_t servonum = 0; int D3 = 3; int D4 = 4; void setup() { Serial.begin(9600); Serial.println("Reboot!"); pinMode(D3, OUTPUT); pinMode(D4, OUTPUT); pwm.begin(); pwm.setOscillatorFrequency(27000000); pwm.setPWMFreq(SERVO_FREQ); // Analog servos run at ~50 Hz updates delay(10); } void loop() { Serial.println("On"); digitalWrite(D3, LOW); digitalWrite(D4, LOW); pwm.setPWM(servonum, 0, 170); delay(500); pwm.setPWM(servonum, 0, 300); // 0.5分钟延迟 delay(30000); //delay(3000); // Off for 10 minutes Serial.println("Off"); pwm.setPWM(servonum, 0, 170); delay(500); pwm.setPWM(servonum, 0, 300); Serial.println("Pump on"); digitalWrite(D3, HIGH); digitalWrite(D4, HIGH); delay(15000); // TURN ON PUMP FOR 15 seconds Serial.println("Pump Off"); digitalWrite(D3, LOW); digitalWrite(D4, LOW); // TURN OFF PUMP, TURN ON delay(120000); // 2分钟延迟 } void setServoPulse(uint8_t n, double pulse) { double pulselength; pulselength = 1000000; // 1,000,000 us per second pulselength /= SERVO_FREQ; // Analog servos run at ~60 Hz updates pulselength /= 4096; // 12 bits of resolution pulse *= 1000000; // convert input seconds to us pulse /= pulselength; pwm.setPWM(n, 0, pulse); }
内容的提问来源于stack exchange,提问作者R0b0tn1k
相关产品推荐
相关产品推荐

