Arduino 如何将延迟转换为毫秒

Arduino 如何将延迟转换为毫秒,arduino,arduino-c++,Arduino,Arduino C++,我有一个简单的延迟代码。 我想知道如何把这个代码转换成毫秒?是否有这样做的功能 long revers = 1000; void setup() { pinMode(D1, OUTPUT); pinMode(D2, OUTPUT); } void loop() { digitalWrite(D1, LOW); delay(revers); digitalWrite(D2, HIGH); delay(revers); d

我有一个简单的延迟代码。 我想知道如何把这个代码转换成毫秒?是否有这样做的功能

long revers = 1000;

void setup() {
  pinMode(D1, OUTPUT); 
  pinMode(D2, OUTPUT);    
}


void loop() {
  digitalWrite(D1, LOW);
  delay(revers);               
  digitalWrite(D2, HIGH);  
  delay(revers);
  digitalWrite(D2, LOW);
  delay(revers);
  digitalWrite(D1, HIGH);
  delay(revers);

}

基本概念是这样的:在一个变量中记录给定时刻的毫秒数,比如“starttime”。现在,在每个循环中,通过从“开始时间”中减去毫秒来检查经过的时间。如果经过的时间大于您设置的延迟时间,请执行代码。重置开始时间以创建重复图案

这对您来说可能太简短了,所以在深入研究代码之前,我强烈建议您阅读以下介绍。虽然篇幅很长,但它广泛地解释了原理。这将帮助您理解下面的代码

最后,有几个库是为了更容易地使用计时而编写的。例如-库,但您可以为其他人搜索arduino计时器库。我在下面举了一个例子

1秒开启,3秒关闭:

unsigned long startMillis;  //some global variables available anywhere in the program
unsigned long currentMillis;
const unsigned long period = 1000;  //the value is a number of milliseconds
int fase; //value used to determine what action to perform


void setup() {
  pinMode(7, OUTPUT); 
  pinMode(8, OUTPUT);    
  startMillis = millis();  //initial start time
  fase = 0;
}



void loop() {
  currentMillis = millis();  //get the current "time" (actually the number of milliseconds since the program started)
  if (currentMillis - startMillis >= period)  //test whether the period has elapsed
  {
    if (fase == 0)
    {
      digitalWrite(8, LOW);
      startMillis = currentMillis;  //IMPORTANT to save the start time of the current LED state.
      fase = 1; //increment fase, so next action will be different
    }
    else if (fase == 1)
    {               
      digitalWrite(7, HIGH);  
      startMillis = currentMillis; 
      fase = 2;
    }
    else if (fase == 2)
    {
      digitalWrite(7, LOW);
      startMillis = currentMillis; 
      fase = 3;
    }
    else if (fase == 3)
    {
      digitalWrite(8, HIGH);
      fase = 0;
      startMillis = currentMillis; 
    }
  }
}
使用SimpleTimer库的闪烁led示例

#include <SimpleTimer.h>

// the timer object
SimpleTimer timer;
int ledPin = 13; 

// a function to be executed periodically
void repeatMe() {
    digitalWrite(ledPin, !digitalRead(ledPin));
}

void setup() {
    pinMode(ledPin, OUTPUT);
    timer.setInterval(1000, repeatMe);
}

void loop() {
    timer.run();
}

标准C++没有MILIS函数。我重新标记了你的问题,这一定是arduino特有的。millis返回启动后的毫秒数,延迟等待给定的时间-它们执行不同的操作,因此在它们之间转换没有多大意义。。。您可以使用millis实现某种延迟,但是您想解决什么问题呢?你想要一个忙碌的等待,比如延迟吗?那就用延迟。或者您希望将代码更改为一个状态机,它经常被调用,并在适当的时候执行不同的任务,然后立即返回?非常感谢您抽出时间。是的,我的意思是每个led灯亮1秒钟,关3秒钟。你的代码不起作用,我修复了它,如果在每种情况下都添加了其他代码。但这是一个时间问题。我不知道为什么当我设置1000毫秒时,这不是1000毫秒,而是大约6000毫秒。你知道为什么吗?我更新了我的答案,并在我的arduino上测试了代码。当前代码对我有效,并且确实有效:LED1开1秒LED1关1秒LED2开1秒LED2关1秒。这是一个4秒的循环。请尝试一下,如果时间不是您想要的,请添加一个逐步模式。是的,您的代码正常,工作方式与我想要的完全相同。但是你能检查一下我的arduino代码,看看有什么问题吗?就像我以前说过的。当我设置1000毫秒时,它的工作方式就像6000毫秒;我不知道为什么。我正在通过网站设置灯光频率。我还没有看到任何东西。但是还有很多事情要做。您可以在循环中的多个点尝试printlnmillis-currentMillis,这可能会显示程序中的时间花费在哪里