Функция millis() в Arduino является одной из ключевых для работы с временными интервалами. Она возвращает количество миллисекунд, прошедших с момента начала выполнения программы. В отличие от функции delay(), которая приостанавливает выполнение кода, millis() позволяет выполнять другие задачи параллельно, что делает её незаменимой для создания многозадачных приложений.
Основное преимущество millis() заключается в её неблокирующем характере. Это означает, что вы можете отслеживать время, не останавливая выполнение основного кода. Например, с её помощью можно управлять светодиодами, опрашивать датчики или отправлять данные по последовательному интерфейсу с определёнными интервалами, не прерывая работу других функций.
В этой статье мы рассмотрим, как правильно использовать функцию millis(), её основные особенности и приведём практические примеры, которые помогут вам эффективно применять её в своих проектах на Arduino.
Основы работы с функцией millis в Arduino
Функция millis в Arduino возвращает количество миллисекунд, прошедших с момента начала выполнения программы. В отличие от delay, она не блокирует выполнение кода, что позволяет выполнять несколько задач одновременно.
Основное преимущество millis заключается в возможности создания неблокирующих временных интервалов. Например, можно управлять светодиодом, мигающим каждую секунду, при этом выполняя другие операции в основном цикле программы.
Для работы с millis обычно используется переменная типа unsigned long, которая хранит время последнего выполнения действия. Сравнивая текущее значение millis с сохранённым, можно определить, прошёл ли нужный интервал времени.
Пример использования:
unsigned long previousMillis = 0;
const long interval = 1000; // Интервал в 1 секунду
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
// Выполнить действие, например, переключить светодиод
}
}
Важно помнить, что значение millis переполняется через примерно 49 дней. Однако это не влияет на корректность работы, так как разница между текущим и предыдущим значением остаётся верной.
Практические примеры применения millis
Функция millis позволяет создавать временные задержки без блокировки выполнения программы. Например, можно управлять миганием светодиода с интервалом в 500 миллисекунд:
unsigned long previousMillis = 0;
const long interval = 500;
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}
}
unsigned long ledPreviousMillis = 0;
unsigned long printPreviousMillis = 0;
const long ledInterval = 1000;
const long printInterval = 2000;
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - ledPreviousMillis >= ledInterval) {
ledPreviousMillis = currentMillis;
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}
if (currentMillis - printPreviousMillis >= printInterval) {
printPreviousMillis = currentMillis;
Serial.println("Прошло 2 секунды");
}
}
Также millis можно использовать для создания таймера. Например, для отсчета времени выполнения задачи:
unsigned long startMillis = millis();
void loop() {
if (millis() - startMillis >= 10000) {
Serial.println("10 секунд прошло");
startMillis = millis(); // Сброс таймера
}
}
Эти примеры демонстрируют, как millis помогает создавать гибкие и эффективные программы, избегая блокировки кода.










