Как перевести задержку в миллис
У меня есть простой код с задержками. Я хотел бы знать, как преобразовать этот код в миллис? Есть ли функция для этого?
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);
}
1 ответ
Основная концепция такова: запишите в переменную millis() в данный момент - скажем, "время начала". Теперь, во время каждого цикла (), проверяйте время, которое прошло, вычитая millis() из "starttime". Если истекшее время больше установленного времени задержки, выполните код. Сбросьте время начала, чтобы создать повторяющийся шаблон.
Это может быть слишком коротким объяснением для вас, поэтому перед тем, как вы углубитесь в код, я настоятельно рекомендую вам прочитать это введение об использовании millis() для синхронизации. Это долго, но это подробно объясняет принцип. Это поможет вам понять код ниже.
Наконец, есть несколько библиотек, написанных для облегчения использования времени. Например, SimpleTimer-библиотека, но вы можете использовать Google "Библиотека таймера 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
#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();
}