Функция millis() является одной из самых важных и полезных функций в программировании Arduino. Она возвращает количество миллисекунд, прошедших с момента запуска программы. Это позволяет создавать временные задержки, измерять интервалы времени и выполнять задачи в определенные моменты времени без блокировки программы.
Основы функции millis()
Функция millis() не принимает аргументов и возвращает значение типа unsigned long, которое представляет количество миллисекунд, прошедших с момента запуска программы. Это значение увеличивается каждую миллисекунду и переполняется через примерно 50 дней (после чего оно снова начинается с нуля).
cpp
void setup() {
Serial.begin(9600); // Инициализация последовательного порта
}
void loop() {
unsigned long currentMillis = millis(); // Получаем текущее время
Serial.println(currentMillis); // Выводим текущее время в миллисекундах
delay(1000); // Задержка на 1 секунду
}
В этом примере текущее время в миллисекундах будет выводиться в последовательный порт каждую секунду.
Использование millis() для временных задержек
Одна из самых распространенных задач, для которой используется millis(), – это создание временных задержек без блокировки программы. Вместо использования функции delay(), которая блокирует выполнение программы на заданное время, вы можете использовать millis() для создания задержек, которые не блокируют программу.
cpp
unsigned long previousMillis = 0; // Переменная для хранения времени последнего изменения состояния
const long interval = 1000; // Интервал задержки в миллисекундах
void setup() {
pinMode(LED_BUILTIN, OUTPUT); // Инициализация встроенного светодиода
}
void loop() {
unsigned long currentMillis = millis(); // Получаем текущее время
if (currentMillis - previousMillis >= interval) {
// Сохраняем время последнего изменения состояния
previousMillis = currentMillis;
// Изменяем состояние светодиода
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}
}
В этом примере светодиод будет мигать с интервалом в 1 секунду, но выполнение программы не будет блокироваться. Это позволяет выполнять другие задачи в функции loop() в то же время.
Использование millis() для измерения интервалов времени
Функция millis() также может быть использована для измерения интервалов времени. Например, вы можете измерить время, которое занимает выполнение определенной задачи, или время, прошедшее с момента последнего события.
cpp
unsigned long startTime; // Переменная для хранения времени начала задачи
void setup() {
Serial.begin(9600); // Инициализация последовательного порта
startTime = millis(); // Сохраняем время начала задачи
}
void loop() {
// Выполняем какую-то задачу
for (int i = 0; i < 1000; i++) {
// Пустая операция для примера
}
// Измеряем время выполнения задачи
unsigned long elapsedTime = millis() - startTime;
Serial.print("Время выполнения задачи: ");
Serial.print(elapsedTime);
Serial.println(" мс");
// Задержка перед следующим измерением
delay(1000);
}
В этом примере время выполнения задачи будет выводиться в последовательный порт каждую секунду.
Использование millis() для выполнения задач в определенные моменты времени
Вы также можете использовать millis() для выполнения задач в определенные моменты времени. Например, вы можете создать программу, которая будет выполнять определенные действия каждые 5 секунд.
cpp
unsigned long previousMillis = 0; // Переменная для хранения времени последнего выполнения задачи
const long interval = 5000; // Интервал выполнения задачи в миллисекундах
void setup() {
Serial.begin(9600); // Инициализация последовательного порта
}
void loop() {
unsigned long currentMillis = millis(); // Получаем текущее время
if (currentMillis - previousMillis >= interval) {
// Сохраняем время последнего выполнения задачи
previousMillis = currentMillis;
// Выполняем задачу
Serial.println("Выполняется задача каждые 5 секунд");
}
}
В этом примере сообщение “Выполняется задача каждые 5 секунд” будет выводиться в последовательный порт каждые 5 секунд.
Проблемы и ограничения
Хотя millis() является мощным инструментом, он имеет несколько ограничений и проблем, которые нужно учитывать:
- Переполнение: Значение, возвращаемое millis(), является 32-битным беззнаковым целым числом, которое переполняется через примерно 50 дней. Это означает, что если вы используете millis() для измерения интервалов времени, которые превышают 50 дней, вы можете столкнуться с проблемами.
- Точность: Функция millis() не является абсолютно точной и может иметь небольшие отклонения в зависимости от нагрузки на процессор и других факторов.
- Блокировка программы: Хотя millis() позволяет создавать временные задержки без блокировки программы, он не может полностью заменить delay() в некоторых ситуациях. Например, если вам нужно приостановить выполнение программы на определенное время, вы все равно можете использовать delay().
Заключение
Функция millis() является мощным инструментом для работы с временем в программировании Arduino. Она позволяет создавать временные задержки, измерять интервалы времени и выполнять задачи в определенные моменты времени без блокировки программы. Однако важно учитывать ограничения и проблемы, связанные с использованием millis(), и выбирать подходящий метод в зависимости от конкретной задачи.
Надеюсь, это руководство помогло вам понять, как использовать функцию millis() в Arduino и какие возможности она предоставляет. Если у вас есть вопросы или вы хотите узнать больше, не стесняйтесь задавать их в комментариях. 🚀