Подсчет времени ардуино

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.

Пояснения к коду:

  1. секунда прибавляется через 1000 мс, минута прибавляется когда переменная SEC станет больше 59.

Таймер на Arduino Nano с LCD 1602

Для этого занятия потребуется:

  • Arduino Uno / Arduino Nano / Arduino Mega;
  • дисплей LCD 1602;
  • энкодер ардуино / тактовые кнопки;
  • зуммер, светодиод и резистор 220 Ом;
  • макетная плата;
  • провода «папа-папа», «папа-мама».

Первый вариант проекта — таймер на Ардуино с управлением от кнопки. При нажатии на первую и вторую кнопку можно увеличивать и уменьшать временной интервал в минутах. При клике на третью кнопку, подключенную к пину 6 Ардуино Нано, запускает обратный отсчет. По окончании отсчета зажигается светодиод и включается звуковой сигнал. Четвертая кнопка, подключенная к пину 8, служит для сброса таймера.

Схема сборки таймера на Ардуино с кнопками

Также таймер можно в любой момент остановить нажатием на третью кнопку. После сборки электрической схемы, загрузите следующий пример программы таймера на Ардуино. Обратите внимание, что для работы часов на дисплее с I2C модулем, потребуется установить библиотеку LiquidCrystal_I2C.h. Эту и другие популярные библиотеки можно скачать на нашем сайте на странице — Библиотеки для Ардуино.

Скетч для таймера на Ардуино Нано с кнопками

Пояснения к коду:

  1. в цикле while секунда вычитается через 1000 мс;
  2. сбросить таймер можно только, остановив обратный отсчет времени.

Кухонный таймер Ардуино с энкодером

Сейчас рассмотрим, как сделать таймер на Ардуино своими руками с энкодером и LCD. Принцип управления, подобен предыдущему варианту. Поворотом ручки энкодера можно задать необходимый временной интервал, а нажатием на ручку можно запускать и останавливать обратный отсчет времени. Далее размещена схема сборки проекта на Arduino Nano, этот проект можно собрать и на плате Arduino Uno.

Схема таймера на Ардуино Уно / Нано

Кроме сборки готовой схемы, предлагаем вам скачать чертеж корпуса для проекта из фанеры, который можно изготовить на лазерном ЧПУ станке. Готовую программу и макет корпуса для часов таймера на Ардуино Нано можно скачать по ссылке здесь. После сборки схемы загрузите пример скетча в микроконтроллер. В коде добавлены подробные комментарии для понимания работы программы и даны пояснения.

Скетч таймера обратного отсчета времени

Пояснения к коду:

  1. частоту звукового сигнала можно изменить через команду tone();
  2. для скетча потребуется установить библиотеку 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() или не вышел таймаут)

Источник

Adblock
detector