Arduino — функции — время
Функция millis()
Функция millis() позволяет считать время, прошедшее с момента запуска текущей программы. Функция возвращает значение в формате «unsigned long» и позволяет считать значения до 50 дней с момента запуска программы. По прошествии этого времени отсчет начнется заново. Ниже приведен пример использования функции millis():
[slh lang=»php»] unsigned long time;
void setup() <
Serial.begin(9600);
>
void loop() <
Serial.print(«Время включения: «);
time = millis(); // запомнить значение времени
Serial.println(time); // отправка информации через последовательный порт
delay(1000);
>
[/slh]
В приведенном выше примере, каждую секунду в монитор порта будет отправляться информация о времени, которое прошло с момента запуска программы. Поскольку время измеряется в миллисекундах, то каждое последующие значение будет отличаться на 1000. Точность считывания зависит от стабильности кварцевого резонатора Arduino.
Функция micros()
Функция micros() является аналогом функции millis(), разница заключается в точности измерения. С помощью функции micros() мы получим время, прошедшее от запуска текущей программы в микросекундах. Счетчик подсчитанных микросекунд будет сброшен по истечении 70 минут. Ниже приведен пример использования функции micros():
[slh lang=»php»] unsigned long time;
void setup() <
Serial.begin(9600);
>
void loop() <
Serial.print(«Время с момента запуска: «);
time = micros();
Serial.print(time);
Serial.println(» мкс «);
delay(1000);
>
[/slh] Так же, как и в примере с функцией millis(), здесь каждую секунду в монитор порта будет отправляться информация об измеренном времени, разница состоит только в том, что в данном случае время измеряется в микросекундах.
Функция delay()
Функция delay() позволяет приостановить выполнение текущей программы на указанное в параметре время. Синтаксис команды выглядит следующим образом:
[slh lang=»php»] //команды
delay(500); //задержка на 0,5 сек
//команды
delay(1000); //задержка на 1с
[/slh]
Время указывается в миллисекундах (1 сек = 1000 мс). Данный параметр может иметь тип «unsigned long», который находится в диапазоне от 0 до 4294967295. Ниже пример использования команды delay():
[slh lang=»php»] #define ledPin 13
void setup()
<
pinMode(ledPin,13);
>
void loop()
<
digitalWrite(ledPin,HIGH); //включить LED
delay(500); //подождать 500ms (0,5 сек)
digitalWrite(ledPin,LOW); //выключить LED
delay(1000); //подождать 1000 мс (1 сек)
>
[/slh]
В приведенном выше примере, светодиод загорается на 0,5 секунды, затем гаснет на 1 секунду и так далее, пока питание Arduino не будет отключено.
Функция delayMicroseconds()
Функция delayMicroseconds() является разновидностью функции delay(). Разница заключается в количестве и точности отсчета времени. Функция delay() позволяет отсчитывать время с точностью до 1 миллисекунды, в то время как delayMicroseconds() с точностью до 1 микросекунды.
Значение, которое можно указать в параметре, находиться в диапазоне от 0 до 16383. Для более длинных временных интервалов следует использовать функцию delay() или несколько раз использовать delayMicroseconds().
[slh lang=»php»] #define outPin 8
void setup()
<
pinMode(outPin, OUTPUT); // контакт 8 как выход
>
void loop()
<
digitalWrite(outPin, HIGH); // контакт 8 высокое состояние
delayMicroseconds(50); // пауза 50 микросекунд
digitalWrite(outPin, LOW); // контакт 8 низкое состояние
delayMicroseconds(50); // пауза 50 микросекунд
>
[/slh]
Этот пример генерирует меандр с периодом 100 микросекунд и заполнением 50%.
Таймер на Ардуино с обратным отсчётом
Таймер на Ардуино с обратным отсчетом с кнопками или энкодером и дисплеем LCD 1602 I2C — интересный и полезный проект. Рассмотрим несколько вариантов таймера с отсчетом времени на Arduino Nano или Uno, которые можно использовать на кухне или в аквариуме для включения световой и звуковой индикации или реле от Ардуино. А вы можете выбрать для себя наиболее подходящий вариант данного проекта.
Простой таймер Ардуино millis()
Чтобы понять принцип работы функции millis() Arduino продемонстрируем пример программы счетчика с выводом времени на монитор порта. Команда millis позволяет осуществлять задержу в выполнении программы без delay и осуществлять при выполнении программы многозадачность. Отсчет времени начинается сразу после загрузки программы в микроконтроллер и открытия монитора порта Arduino IDE.
Пояснения к коду:
- секунда прибавляется через 1000 мс, минута прибавляется когда переменная SEC станет больше 59.
Таймер на Arduino Nano с LCD 1602
Для этого занятия потребуется:
- Arduino Uno / Arduino Nano / Arduino Mega;
- дисплей LCD 1602;
- энкодер ардуино / тактовые кнопки;
- зуммер, светодиод и резистор 220 Ом;
- макетная плата;
- провода «папа-папа», «папа-мама».
Первый вариант проекта — таймер на Ардуино с управлением от кнопки. При нажатии на первую и вторую кнопку можно увеличивать и уменьшать временной интервал в минутах. При клике на третью кнопку, подключенную к пину 6 Ардуино Нано, запускает обратный отсчет. По окончании отсчета зажигается светодиод и включается звуковой сигнал. Четвертая кнопка, подключенная к пину 8, служит для сброса таймера.
Схема сборки таймера на Ардуино с кнопками
Также таймер можно в любой момент остановить нажатием на третью кнопку. После сборки электрической схемы, загрузите следующий пример программы таймера на Ардуино. Обратите внимание, что для работы часов на дисплее с I2C модулем, потребуется установить библиотеку LiquidCrystal_I2C.h. Эту и другие популярные библиотеки можно скачать на нашем сайте на странице — Библиотеки для Ардуино.
Скетч для таймера на Ардуино Нано с кнопками
Пояснения к коду:
- в цикле while секунда вычитается через 1000 мс;
- сбросить таймер можно только, остановив обратный отсчет времени.
Кухонный таймер Ардуино с энкодером
Сейчас рассмотрим, как сделать таймер на Ардуино своими руками с энкодером и LCD. Принцип управления, подобен предыдущему варианту. Поворотом ручки энкодера можно задать необходимый временной интервал, а нажатием на ручку можно запускать и останавливать обратный отсчет времени. Далее размещена схема сборки проекта на Arduino Nano, этот проект можно собрать и на плате Arduino Uno.
Схема таймера на Ардуино Уно / Нано
Кроме сборки готовой схемы, предлагаем вам скачать чертеж корпуса для проекта из фанеры, который можно изготовить на лазерном ЧПУ станке. Готовую программу и макет корпуса для часов таймера на Ардуино Нано можно скачать по ссылке здесь. После сборки схемы загрузите пример скетча в микроконтроллер. В коде добавлены подробные комментарии для понимания работы программы и даны пояснения.
Скетч таймера обратного отсчета времени
Пояснения к коду:
- частоту звукового сигнала можно изменить через команду tone();
- для скетча потребуется установить библиотеку RotaryEncoder.
Заключение. В этом обзоре представлено лишь два варианта изготовления часов с таймером для аквариума или кухни своими руками. В комментариях вы можете оставить вопросы по данному проекту (если они есть) или предложить свой вариант проекта с обратным отсчетом времени, который можно добавить к этому обзору.
Подсчет времени ардуино
medved820
Не получается организовать подсчет времени работы исполнительного устройства (для примера – светодиод). Надо чтобы после остановки подсчет останавливался, а после включения – продолжался.
Как в скетч прикрутить паузу/пуск?
Старик Похабыч
В общем виде так
в самом начале:
общеевремяработы=0
времявключениясветодиода=0
дальше,
если светодиод горит и времявключениясветодиода==0 то
<
времявключениясветодиода=millis()
>
если светодиод не горит и времявключениясветодиода!=0 то
<
общеевремяработы=общеевремяработы+millis()-времявключениясветодиода;
времявключениясветодиода=0;
>
medved820
Подсчет времени выполняется, но импульсно, в момент отключения устройства. Как сделать чтобы счёт шёл в режиме реального времени?
Ниже мои правки
Старик Похабыч
если светодиод горит и времявключениясветодиода==0 то
<
времявключениясветодиода=millis()
>
если светодиод горит и времявключениясветодиода!=0 то
<
текущее_время=millis()
общеевремяработы=общеевремяработы+текущее_время-времявключениясветодиода;
времявключениясветодиода=текущее_время
>
если светодиод не горит и времявключениясветодиода!=0 то
<
общеевремяработы=общеевремяработы+millis()-времявключениясветодиода;
времявключениясветодиода=0;
>
Если делать в режиме реального времени, то совсем реально не надо. Определитесь c нужным интервалом , скажем 0.1 секунды. Иначе будет очень точный подсчет, и на это будет тратиться все полезное время ардуины
Условие нужно подшаманить. Сделать с подусловиями как то так
если светодиод горит то
<
.
тут преобразованный код
.
>
иначе
<
если времявключениясветодиода!=0 то
<
общеевремяработы=общеевремяработы+millis()-времявключениясветодиода;
времявключениясветодиода=0;
>
ДОПОЛНЕНИЕ!
Вот подумалось, что подсчет то можно оставить такой же как был! Но! Ведь постоянно считать нужно для того что бы отображать ?
Тогда делать так
В коде ниже, отдельно (а можно и нет!)
если светодиод горит то
отобразить время горения millis()-время включения светодиода
пожалуй так будет самое точное и быстрое выполнение
Работа по таймеру в Arduino. GyverTimer [12.11.19]
ОБНОВЛЕНИЯ
- v3.2
- Добавлен isEnabled
- Возможность не запускать таймер при создании
- v2.0 – улучшенный алгоритм работы таймера
- Кратные интервалы
- Защита от пропусков
- Защита от переполнения millis()
- Убраны дефайны
- v2.1 – возвращены дефайны
- v2.2 – улучшена стабильность
- v3.0
- Логика работы разделена на интервал и таймаут
- Добавлен общий класс GTimer (для миллисекундного и микросекундного таймера)
- Добавлена возможность остановить и продолжить счёт таймера
ТЕОРИЯ
Я думаю все знают классический алгоритм создания таймера на millis() – счётчике аптайма:
БИБЛИОТЕКА
GyverTimer v3.2
- Миллисекундный и микросекундный таймер
- Два режима работы:
- Режим интервала: таймер “срабатывает” каждый заданный интервал времени
- Режим таймаута: таймер “срабатывает” один раз по истечении времени (до следующего перезапуска)
- Служебные функции:
- Старт
- Стоп
- Сброс
- Продолжить
Поддерживаемые платформы: все Arduino (используются стандартные Wiring-функции)
УСТАНОВКА
- Библиотеку можно найти и установить через менеджер библиотек по названию GyverTimer в:
- Arduino IDE (Инструменты/Управлять библиотеками)
- Arduino IDE v2 (вкладка “Library Manager”)
- PlatformIO (PIO Home, вкладка “Libraries”)
- Про ручную установку читай здесь
ДОКУМЕНТАЦИЯ
Конструктор
Класс GTimer позволяет работать как с миллисекундным, так и с микросекундным таймером. В общем виде пример выглядит так:
Где type это MS (мс, миллисекундный таймер) или US (мкс, микросекундный), period — период в мс или мкс соответственно.
Настройки по умолчанию
- При создании таймера можно ничего не указывать : GTimer myTimer; , тогда таймер будет сконфигурирован как миллисекундный и не запустится
- Если указать только тип таймера (MS/US) GTimer myTimer(MS); , таймер настроится на выбранный режим (мс/мкс) и не запустится
- Если указать тип таймера и интервал GTimer myTimer(US, 5000); , таймер настроится на выбранный режим (мс/мкс) и запустится в режиме интервала
Режимы работы
Таймер может работать в режиме интервалов и в режиме таймаута:
- Интервалы. Запуск — метод setInterval(время) с указанием времени. В режиме интервалов таймер срабатывает (метод isReady() возвращает true ) каждый раз при достижении указанного периода и автоматически перезапускается. Удобно для периодических действий
- Таймаут. Запуск — метод setTimeout(время) с указанием времени. В режиме таймаута таймер срабатывает (метод isReady() возвращает true ) только один раз при достижении указанного периода и автоматически отключается. Для повторного запуска нужно вызвать .setTimeout() с указанием периода, или просто .start() — запустит таймер на новый круг с прежним периодом
Важный момент: сравнение времени происходит в методе isReady() , без его вызова таймер ничего не считает! Нужно вызывать isReady() всегда, когда требуется счёт времени.
Управление таймером
Для управления состоянием таймера есть следующие методы:
- start() — запускает (перезапускает) таймер с последним установленным временем
- stop() — останавливает таймер
- resume() — продолжает отсчёт таймера с момента остановки
- reset() — сбрасывает таймер (отсчёт периода/таймаута начинается заново)
- isEnabled() — возвращает true , если таймер работает (если он не stop() или не вышел таймаут)