Как работают основные функции времени в Arduino. Какие возможности предоставляют delay(), millis() и micros(). Как правильно измерять и контролировать время в скетчах Arduino.
Основные функции времени в Arduino
Arduino предоставляет несколько встроенных функций для работы со временем, которые позволяют точно измерять интервалы и создавать задержки в программах. Рассмотрим основные из них:
- delay() — создает паузу заданной длительности
- delayMicroseconds() — пауза в микросекундах
- millis() — возвращает время работы программы в миллисекундах
- micros() — возвращает время в микросекундах
Правильное использование этих функций критически важно для создания проектов с точным таймингом и синхронизацией.
Функция delay() — создание пауз в программе
Функция delay() позволяет приостановить выполнение программы на заданное количество миллисекунд. Это самый простой способ создать паузу:
void setup() { pinMode(LED_BUILTIN, OUTPUT); } void loop() { digitalWrite(LED_BUILTIN, HIGH); delay(1000); // Пауза 1 секунда digitalWrite(LED_BUILTIN, LOW); delay(1000); }
Важно помнить, что delay() полностью блокирует выполнение программы. В течение паузы Arduino не сможет выполнять никакие другие задачи.

Когда использовать delay()
- Для простых задержек в некритичных участках кода
- Когда точность паузы не важна (погрешность может достигать нескольких миллисекунд)
- В учебных проектах для наглядности
Недостатки delay()
- Блокирует выполнение всей программы
- Не позволяет выполнять параллельные задачи
- Может привести к пропуску важных событий (например, нажатий кнопок)
Функция millis() — измерение времени выполнения
Функция millis() возвращает количество миллисекунд, прошедших с момента запуска скетча. Это позволяет измерять интервалы времени без блокировки программы:
unsigned long previousMillis = 0;
const long interval = 1000;
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > = interval) {
previousMillis = currentMillis;
// Выполнить действие каждую секунду
}
}
Такой подход не блокирует выполнение и позволяет программе реагировать на другие события.
Преимущества использования millis()
- Не блокирует выполнение программы
- Позволяет реализовать несколько параллельных таймеров
- Более точное измерение времени по сравнению с delay()
Функция micros() — высокоточное измерение времени
Функция micros() аналогична millis(), но возвращает время в микросекундах. Это позволяет измерять очень короткие интервалы с высокой точностью:

unsigned long startTime = micros();
// Выполнение быстрой операции
unsigned long duration = micros() - startTime;
micros() особенно полезна для измерения длительности коротких импульсов или времени выполнения критичных участков кода.
Области применения micros()
- Измерение длительности коротких сигналов (например, от ультразвуковых датчиков)
- Точная синхронизация в протоколах связи
- Профилирование производительности кода
Практические примеры использования функций времени
Рассмотрим несколько практических примеров, демонстрирующих применение функций времени в реальных проектах:
Мигание светодиодом без delay()
const int ledPin = 13;
unsigned long previousMillis = 0;
const long interval = 1000;
int ledState = LOW;
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
ledState = (ledState == LOW) ? HIGH : LOW;
digitalWrite(ledPin, ledState);
}
}
Этот код заставляет светодиод мигать каждую секунду без использования delay(), что позволяет выполнять другие задачи параллельно.

Измерение длительности нажатия кнопки
const int buttonPin = 2;
unsigned long pressStartTime = 0;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
if (digitalRead(buttonPin) == LOW) {
if (pressStartTime == 0) {
pressStartTime = millis();
}
} else {
if (pressStartTime > 0) {
unsigned long pressDuration = millis() - pressStartTime;
Serial.print("Длительность нажатия: ");
Serial.print(pressDuration);
Serial.println(" мс");
pressStartTime = 0;
}
}
}
Этот пример показывает, как можно использовать millis() для измерения длительности нажатия кнопки.
Ограничения и особенности функций времени
При работе с функциями времени в Arduino важно учитывать некоторые ограничения:
- Переполнение счетчика: millis() и micros() переполняются примерно через 50 дней и 70 минут соответственно
- Точность: На точность влияет частота процессора и прерывания
- Разрешение: millis() имеет разрешение 1 мс, micros() — 4 мкс на большинстве плат Arduino
Учет этих особенностей поможет создавать более надежные и точные временные системы в проектах Arduino.

Альтернативные методы измерения времени
Помимо встроенных функций, существуют альтернативные способы работы со временем в Arduino:
Использование аппаратных таймеров
Arduino имеет встроенные аппаратные таймеры, которые можно настроить для более точного измерения времени и генерации прерываний:
#include
void setup() {
Timer1.initialize(1000000); // Установка периода таймера на 1 секунду
Timer1.attachInterrupt(timerIsr); // Подключение функции-обработчика
}
void timerIsr() {
// Код, выполняемый каждую секунду
}
void loop() {
// Основной код программы
}
Этот подход позволяет выполнять точные периодические действия без влияния на основной цикл программы.
Внешние часы реального времени (RTC)
Для проектов, требующих долговременного отслеживания времени, можно использовать внешние модули RTC:
#include
RTC_DS3231 rtc;
void setup() {
rtc.begin();
// Установка времени при необходимости
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
void loop() {
DateTime now = rtc.now();
// Использование текущего времени
}
RTC модули сохраняют время даже при отключении питания, что делает их идеальными для долгосрочных проектов.

Оптимизация использования функций времени
Для создания эффективных и отзывчивых программ важно оптимизировать использование функций времени:
Избегайте частых вызовов millis() и micros()
Вместо постоянных проверок времени в цикле loop(), сохраняйте значение в переменную:
void loop() { unsigned long currentMillis = millis(); // Используйте currentMillis для всех проверок времени в этом цикле }
Используйте unsigned long для хранения времени
Тип unsigned long обеспечивает достаточный диапазон для хранения миллисекунд без риска переполнения в течение длительного времени.
Учитывайте переполнение счетчика
При сравнении временных интервалов используйте вычитание с учетом возможного переполнения:
if ((unsigned long)(currentMillis - previousMillis) >= interval) {
// Действие
}
Такой подход корректно работает даже при переполнении счетчика millis().
Заключение: выбор правильного подхода к измерению времени
Выбор метода измерения и контроля времени в Arduino зависит от конкретных требований проекта:

- Для простых задержек в некритичных участках кода подойдет delay()
- Для неблокирующего измерения интервалов используйте millis()
- Для высокоточных измерений коротких интервалов применяйте micros()
- Для сложных временных схем рассмотрите использование аппаратных таймеров
- Для долговременного отслеживания даты и времени используйте внешние RTC модули
Правильное использование функций времени позволяет создавать более эффективные, отзывчивые и надежные проекты на Arduino. Экспериментируйте с различными подходами, чтобы найти оптимальное решение для вашей задачи.
Часы реального времени DS1307 для Arduino (без батарейки) [#3-1], цена 22.80 грн — Prom.ua (ID#371138092)
Характеристики и описание
Модуль часов реального времени для Arduino / I2C 24C32 DS1307 Полностью собранный модуль часов реального времени и календаря с дополнительной памятью на микросхеме DS1307 для Arduino. Модуль часы реального времени DS1307 используется в макетах и проектах на микроконтроллерах для снятия с него показаний реальной текущей даты и времени. Эта информация используется для мониторинга и регистрации даты и времени, а также для управления с ее помощью различными устройствами. Управление модулем реального времени осуществляется из Arduino контроллеров или других управляющих микропроцессорных устройств через IIC (Inter-Integrated Circuit) интерфейс с помощью специальных программ.![]() Колодка Р1 имеет контакты SQ, DS, SCL, SDA, VCC, GND, BAT. Колодка Р2 имеет контакты DS, SCL, SDA, VCC, GND. Питание модуля осуществляется или от встроенной батареи, или от Arduino контроллера (другого управляющего микропроцессорного устройства), или от внешего источника питания. В микросхеме DS1307 имеется встроенная схема, определяющая аварийное отключение питания и автоматически подключающая резервную батарейку. При этом отсчет времени продолжается и после восстановления питания часы показывают правильное время. Найти PDF c помощью Google Характеристики:
Комплектация: — DS1307 (без батарейки) x 1 |
— Реквизиты для оплаты приходят вам на — Покупатель должен оплатить лот на протяжении 7-ми дней. |
— Товар отправляется только после 100% предоплаты, если не выбрана опция «наложенный платеж». — Стоимость доставки оплачивает покупатель при получении посылки. — При покупке нескольких лотов, стоимость доставки комбинируется. |
Не делайте необдуманных покупок! — Товары из разных партий могут иметь незначительные отличия между изображением на сайте и фактическим видом.![]() — По любым вопросам относительно товара используйте кнопку «Задать вопрос о товаре». — После покупки вы обязуетесь оплатить покупку на протяжении 7-ми дней,в противном случае нам придется оставить «отрицательный» отзыв по сделке. |
Был online: Сегодня
Продавец Ardu.prom.ua (наложка НП от 150 грн!)
6 лет на Prom.ua
- Каталог продавца
- Отзывы
1715
г. Запорожье. Продавец Ardu.prom.ua (наложка НП от 150 грн!)
Был online: Сегодня
Код: #3-1
На складе в г. Запорожье
Доставка по Украине
70+ купили
22.80 грн
Оптовые цены
Доставка
Оплата и гарантии
Популярные производители в категории Наборы и компоненты для самостоятельной сборки электроники
Без бренда
STMicroelectronics
Kradex
Arduino
Sxemki
Maszczyk
Noname
NXP Semiconductors
International Rectifier
waveshare
RobotDyn
Infineon
Texas Instruments
У нас покупают
Наборы и компоненты для самостоятельной сборки электроники
Аксессуары для фото-, видеокамер
Съемные объективы
ТОП теги
Термоусадочная машина
4. 0 speaker
Дисплей lcd1602
Лазерный модуль зеленый
Igbt infineon
Diy годинник
Преобразователь 5
Насколько вам
удобно на проме?
Дополнительное профессиональное образование педагогических работников города Москвы
Педагогический дизайнер — профессия будущего!
05 декабря
Сегодня методические службы становятся драйвером развития каждой Московской школы.
Появляется запрос на специалистов нового формата, способных внедрять инновации и направлять работу проектных офисов и рабочих групп.
Педагогический дизайнер занимается дизайном образовательных программ на основе актуальных трендов, придумывает и внедряет новые алгоритмы в профессиональную деятельность сотрудников школы и новые траектории развития школьников.
На программе «Педагогический дизайнер в образовательной организации» Вы научитесь:
— качественно разрабатывать учебные программы, уроки, проекты внеучебной активности обучаемых;
— разрабатывать и реализовывать индивидуально-ориентированные образовательные программы с учетом личностных и возрастных особенностей обучающихся;
— эффективно использовать разнообразные формы, технологии и приемы обучения;
— успешно использовать на занятиях и во внеурочной деятельности современные формы и методы воспитательной работы;
— развивать у обучающихся познавательную активность, самостоятельность, инициативу, творческие способности, способности к труду и жизни в условиях современного мира;
— организовывать и осуществлять контроль и оценку результатов освоения обучающимися образовательной программы.
Старт курса 6 декабря.
Обучение проводится по вторникам в 16:00 (online).
Подробности и регистрация: https://www.dpomos.ru/curs/2388288/#card
Очные и заочные курсы от АНО «НЦИО»
29 ноября
Уважаемые коллеги!
Информируем Вас о том, что осталось 2 места на следующий очный курс:
Основы программирования на языке Java Script для использования в образовательном процессе – шифр № 04632-22/23-В (преподаватель Герасимова А.А.):
Старт – 13 декабря
Даты и время проведения:
Лекционные дни – 13 и 15 декабря, начало в 14:00
Консультационный день – 16 декабря, начало с 14:00
Занятия будут проводиться c использованием робототехнической платформы Sphero. У Вас будет возможность сразу применить полученные знания.
Преимущества:
! МИНИ-ГРУППЫ не более 6 человек.
!! Индивидуальный подход в процессе обучения.
!!! Выдаем официальные документы установленного образца. Документы вносятся в систему ФИС ФРДО.
А также сообщаем, что продолжается набор на заочную форму обучения с применением ДОТ по следующим темам:
1. Обучение школьников деятельности с робототехническим конструктором VEX IQ и подготовка к робототехническим соревнованиям — шифр № 04630-22/23-В-ЗД
2.Обучение школьников деятельности с робототехническим конструктором VEX EDR и подготовка к робототехническим соревнованиям — шифр № 04631-22/23-В-ЗД
3. Основы программирования на языке Java Script для использования в образовательном процессе — шифр № 04633-22/23-В-ЗД
Программы рассчитаны на 24 часа (срок освоения курса 6 недель с момента запуска курса).
Преимущества:
! Индивидуальный старт вне зависимости от группы.
!! Возможность планирования графика обучения под свои потребности и загруженность.
!!! Выдаем официальные документы установленного образца. Документы вносятся в систему ФИС ФРДО.
!!!! Доставка документов по всей России.
По всем возникающим вопросам можно обратиться по телефону, указанному в карточке курса, или по электронной почте [email protected]
ДОП ЛИГА приглашает на обучение
23 ноября
Уважаемые коллеги, приглашаем вас пройти обучение по программам повышения квалификации:
Антитеррористическая защищенность образовательных организаций. Шифр 04428-22/23-В-ЗД
Оказание первой помощи в образовательной организации. Шифр 04427-22/23-В-ЗД
Проектирование и реализация программы воспитания в образовательной организации. Шифр 04300-22/23-В-ЗД
Проектирование и реализация программы воспитания в дошкольной образовательной организации. Шифр 04299-22/23-В-ЗД
Разработка и реализация дополнительной общеобразовательной программы в рамках проекта «Успех каждого ребенка». Шифр 04301-22/23-В-ЗД
Даты открытия ближайших групп:
Ноябрь — 28.11.2022
Декабрь — 05.12.2022; 12.12.2022; 19.12.2022; 26.12.2022
Все новости
Ардуино — Время
- Учебное пособие по Arduino
- Ардуино — Дом
- Ардуино — Обзор
- Arduino — Описание платы
- Ардуино — Установка
- Arduino — Структура программы
- Arduino — типы данных
- Arduino — переменные и константы
- Ардуино — Операторы
- Arduino — операторы управления
- Arduino — петли
- Ардуино — Функции
- Ардуино — Струны
- Arduino — Струнный объект
- Ардуино — Время
- Ардуино — Массивы
- Функциональные библиотеки Arduino
- Arduino — функции ввода/вывода
- Arduino — расширенная функция ввода/вывода
- Arduino — функции символов
- Arduino — математическая библиотека
- Arduino — Тригонометрические функции
- Расширенный Arduino
- Ардуино — Двойной и ноль
- Arduino — широтно-импульсная модуляция
- Arduino — случайные числа
- Ардуино — Прерывания
- Ардуино — Связь
- Arduino — Интегральная схема Inter
- Arduino — последовательный периферийный интерфейс
- Проекты Arduino
- Arduino — мигающий светодиод
- Arduino — Затухающий светодиод
- Arduino — чтение аналогового напряжения
- Arduino — светодиодная гистограмма
- Arduino — выход с клавиатуры
- Arduino — сообщение клавиатуры
- Arduino — управление кнопками мыши
- Arduino — клавиатура, серийный номер
- Датчики Arduino
- Arduino — датчик влажности
- Arduino — датчик температуры
- Arduino — детектор воды/датчик
- Arduino — ИК-датчик
- Arduino — ультразвуковой датчик
- Arduino — соединительный переключатель
- Управление двигателем
- Arduino — Двигатель постоянного тока
- Arduino — Серводвигатель
- Arduino — шаговый двигатель
- Arduino и звук
- Arduino — библиотека тонов
- Arduino — беспроводная связь
- Arduino — сетевая связь
- Полезные ресурсы Arduino
- Ардуино — Краткое руководство
- Arduino — полезные ресурсы
- Ардуино — Обсуждение
- Выбранное чтение
- Примечания к экзаменам UPSC IAS
- Передовой опыт разработчиков
- Вопросы и ответы
- Эффективное составление резюме
- Вопросы для собеседования с персоналом
- Компьютерный глоссарий
- Кто есть кто
Предыдущая страница
Следующая страница
Arduino предоставляет четыре различные функции управления временем. Они —
S.No. | Функция и описание |
---|---|
1 | задержка () функция Функция delay() работает довольно просто. Он принимает один целочисленный (или числовой) аргумент. Это число представляет время (измеряется в миллисекундах). |
2 | функция delayMicroseconds () Функция delayMicroseconds() принимает один целочисленный (или числовой) аргумент. В миллисекунде тысяча микросекунд, а в секунде миллион микросекунд. |
3 | миллис () функция Эта функция используется для возврата числа миллисекунд в момент, когда плата Arduino начинает выполнение текущей программы. |
4 | микрос () функция Функция micros() возвращает количество микросекунд с момента, когда плата Arduino начинает выполнение текущей программы. Это число переполняется, т.е. возвращается к нулю примерно через 70 минут. |
Предыдущая страница Распечатать страницу Следующая страница
Отсчитывается ли системное время на Arduino?
Стандартная библиотека мало зависит от платформы, поэтому она очень переносима. Однако одна из этих зависимостей является источником для реального времени, который полностью зависит от платформы, и поэтому библиотеки обычно оставляют функцию в качестве заглушки, которую пользователь может переопределить в соответствии с конкретной платформой или для реализации. перехватывать функции или обратные вызовы для запуска стандартных библиотечных часов.
При использовании библиотеки avr-libc, используемой платформами Arduino на базе AVRfДля time()
для продвижения вперед необходимо вызывать функцию ловушки system_tick()
с интервалом в 1 секунду (обычно из таймера или прерывания RTC) (см. Документация avr-libc time.h Также необходимо установить время при инициализации с помощью функции set_system_time()
.
Вызов system_tick()
из таймера 1 Гц будет поддерживать также можно использовать прерывание тревоги RTC, продвигая цель совпадения тревоги для каждого прерывания.Таким образом, вы могли бы, например:
недействительным rtc_interrupt() { // Установить следующее прерывание на 1 секунду. РТК РТК ; int next = rtc.getSeconds() + 1 ; если( следующий == 60 ) { следующий = 0 ; } rtc.setAlarmSeconds(следующий); // обновляем стандартное время системный_тик(); } недействительным init_system_time() { тм время_компонента ; РТК РТК ; // Получаем *непротиворечивые* компоненты времени, т. е. обеспечиваем // компоненты не считываются ни с одной стороны минутной границы делать { component_time.tm_sec = rtc.getSeconds() ; component_time.tm_min = rtc.getMInutes(), component_time.tm_hour = rtc.getHours(), component_time.tm_mday = rtc.getDay(), component_time.tm_mon = rtc.getMonth() - 1, // январь = 0 в структуре tm component_time.tm_year = rtc.getYear() + 100 // Количество лет с 1900 } while( component_time.tm_min != rtc.getMinutes() ) ; set_system_time(mktime(&component_time) - UNIX_OFFSET); // Установить будильник на данный момент + одну секунду rtc.attachInterrupt(rtc_interrupt); rtc.setAlarmSeconds( rtc.getSeconds() + 1 ) ; rtc.enableAlarm(rtc.MATCH_SS); }
Альтернативой является полное переопределение time()
и непосредственное чтение RTC при каждом вызове. Преимущество этого заключается в том, что не требуются никакие обработчики прерываний, например:
#include <время.ч> extern "C" time_t time( time_t* time ) { тм время_компонента ; РТК РТК ; // Получаем *непротиворечивые* компоненты времени, т. е. обеспечиваем // компоненты не считываются ни с одной стороны минутной границы делать { component_time.tm_sec = rtc.getSeconds() ; component_time.tm_min = rtc.