繁体   English   中英

Arduino创建延迟功能

[英]Arduino creating delay function

我正在尝试使自己的延迟功能。 简而言之mydelay功能调用toggled功能,每一个secs秒。 我知道代码写得不好(这是第一个版本)。 但是我只是想让它正常工作。 然后我将其重构。 但是我有一些意想不到的错误。 第一次在x函数中的循环正常工作。 它正在打印“我在一段时间内” 1秒钟,然后打印“我正在结束mydelay”,这是我想要的行为。 但是在完成x的循环之后。 第二次循环。 它进入mydelay函数(可以)。 但是,它根本不打印“我在一段时间内”。 它只是打印“ Im结尾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);
}

更改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");
}

也许您可以尝试使用类似这样的方法重置千分尺,但我没有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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM