我正在尝试制作自己的延迟功能。简而言之mydelay
函数每toggled
秒调用secs
函数。代码写得不好,我知道(这是第一个版本)。但我只是想让它正常工作。然后我会重构它。但我有一些意想不到的错误。第一次x
函数中的循环正常工作。它打印“我在一起”1秒钟,然后打印“Im ending mydelay”,这是我想要的行为。但在x
完成循环后。它第二次循环。它进入mydelay
函数(没关系)。但那时根本就没有印刷“我在一起”。它只是打印“Im ending mydelay”,这是不好的。
以下是代码:
#include <Arduino.h>
int led = 7;
void setup() {
Serial.begin(9600);
pinMode(led, OUTPUT);
}
void loop() {
x();
Serial.println("Im ending main loop");
}
void x() {
for (int i = 0; i <= 10; i++) {
mydelay(led, 0, 1);
mydelay(led, 1, 1);
}
}
void mydelay(int pin, int hol, int secs) {
int starttime = millis();
while ((millis() - starttime) <= (secs * 1000)) Serial.println("I am in while");
toggled(pin, hol);
Serial.println("Im ending mydelay");
}
void toggled(int pin, int hol) {
digitalWrite(led, hol);
}
答案 0 :(得分:2)
将int starttime = millis();
更改为unsigned long starttime = millis();
。这个可能是问题所在,因为如果你使用的是int
,你的程序会在32秒后发疯。这是一个问题,因为int
只能容纳从-32,768到32,767的数字。
另外,你不妨试试这个:
while ((millis() - starttime) <= (secs * 1000))
{
Serial.println("I am in while");
}
答案 1 :(得分:1)
也许你可以尝试用这样的东西重置millis,我没有arduino所以它没有经过测试,但希望它可以提供帮助。
extern volatile unsigned long timer0_millis;
unsigned long reset = 0;
#include <Arduino.h>
int led = 7;
void setup() {
Serial.begin(9600);
pinMode(led, OUTPUT);
}
void loop(){
x();
Serial.println("Im ending main loop");
setMillis(reset);
}
void setMillis(unsigned long new_millis){
uint8_t oldSREG = SREG;
cli();
timer0_millis = new_millis;
SREG = oldSREG;
}
void x() {
for (int i = 0; i <= 10; i++) {
mydelay(led, 0, 1);
mydelay(led, 1, 1);
}
}
void mydelay(int pin, int hol, int secs) {
int starttime = millis();
while ((millis() - starttime) <= (secs * 1000)) Serial.println("I am in while");
toggled(pin, hol);
Serial.println("Im ending mydelay");
}
void toggled(int pin, int hol) {
digitalWrite(led, hol);
}