No Image

Таймер на ардуино с обратным отсчетом

СОДЕРЖАНИЕ
0 просмотров
10 марта 2020

РАБОТАЕМ ПО ТАЙМЕРУ В ARDUINO

Я думаю все знают классический алгоритм создания таймера на millis() – счётчике аптайма:

Классический таймер на millis()

Несколько таймеров

Данный алгоритм позволяет спокойно переходить через переполнение millis() без потери периода, но имеет один большой минус – время считается с момента последнего вызова таймера, и при наличии задержек в коде таймер будет накапливать погрешность, отклоняясь от “ритма”. Недавно я придумал более точный алгоритм таймера на миллис, который соблюдает свой период даже после пропуска хода!

Улучшенный таймер

Данный таймер имеет механику классического таймера с хранением переменной таймера, а его период всегда кратен PERIOD и не сбивается. Эту конструкцию можно упростить до

В этом случае алгоритм получается короче, кратность периодов сохраняется, но теряется защита от пропуска вызова и переполнения millis().

В этой библиотеке реализован полноценный таймер на счётчике аптайма, позволяющий даже “приостановить” счёт (не приостанавливая сам аптайм).

Примечание: таких таймеров можно создать сколько душе угодно (пока хватит памяти), что позволяет создавать сложные программы с кучей подзадач, но для функционирования данного таймера нужен “чистый” loop с минимальным количеством задержек, или вообще без них. Всё таки таймер “опрашивается” в ручном режиме. Таймер, который не боится задержек, делается на прерывании таймера, смотрите вот эту библиотеку.

БИБЛИОТЕКА GYVERTIMER

GyverTimer v3.2

GTimer – полноценный таймер на базе системных millis() / micros(), обеспечивающий удобную мультизадачность и работу с временем, используя всего одно родное прерывание таймера (Timer 0)

  • Миллисекундный и микросекундный таймер
  • Два режима работы:
  • Режим интервала: таймер “срабатывает” каждый заданный интервал времени
  • Режим таймаута: таймер “срабатывает” один раз по истечении времени (до следующего перезапуска)
  • Служебные функции:
    • Старт
    • Стоп
    • Сброс
    • Продолжить
    • Поддерживаемые платформы: все Arduino (используются стандартные Wiring-функции)

      ДОКУМЕНТАЦИЯ

      Документация

      Конструктор

      Класс GTimer позволяет работать как с миллисекундным, так и с микросекундным таймером. В общем виде пример выглядит так:

      Где type это MS (,мс, миллисекундный таймер) или US (мкс, микросекундный), period – период в мс или мкс соответственно.

      Читайте также:  Почему не могу отправить смс с айфона

      Настройки по умолчанию

      • При создании таймера можно ничего не указывать : GTimer myTimer; , тогда таймер будет сконфигурирован как миллисекундный и не запустится
      • Если указать только тип таймера (MS/US) GTimer myTimer(MS); , таймер настроится на выбранный режим (мс/мкс) и не запустится
      • Если указать тип таймера и интервал GTimer myTimer(US, 5000); , таймер настроится на выбранный режим (мс/мкс) и запустится в режиме интервала

      Режимы работы

      Таймер может работать в режиме интервалов и в режиме таймаута:

      • Интервалы. Запуск – метод setInterval(время) с указанием времени. В режиме интервалов таймер срабатывает (метод isReady() возвращает true) каждый раз при достижении указанного периода и автоматически перезапускается. Удобно для периодических действий
      • Таймаут. Запуск – метод setTimeout(время) с указанием времени. В режиме таймаута таймер срабатывает (метод isReady() возвращает true) только один раз при достижении указанного периода и автоматически отключается. Для повторного запуска нужно вызвать .setTimeout() с указанием периода, или просто .start() – запустит таймер на новый круг с прежним периодом

      Управление таймером

      Для управления состоянием таймера есть следующие методы:

      • start() – запускает (перезапускает) таймер с последним установленным временем
      • stop() – останавливает таймер
      • resume() – продолжает отсчёт таймера с момента остановки
      • reset() – сбрасывает таймер (отсчёт периода/таймаута начинается заново)
      • isEnabled() – возвращает true, если таймер работает (если он не stop() или не вышел таймаут)

      РАБОТАЕМ ПО ТАЙМЕРУ В ARDUINO

      Я думаю все знают классический алгоритм создания таймера на millis() – счётчике аптайма:

      Классический таймер на millis()

      Несколько таймеров

      Данный алгоритм позволяет спокойно переходить через переполнение millis() без потери периода, но имеет один большой минус – время считается с момента последнего вызова таймера, и при наличии задержек в коде таймер будет накапливать погрешность, отклоняясь от “ритма”. Недавно я придумал более точный алгоритм таймера на миллис, который соблюдает свой период даже после пропуска хода!

      Читайте также:  Как отследить посылку по номеру заказа джум

      Улучшенный таймер

      Данный таймер имеет механику классического таймера с хранением переменной таймера, а его период всегда кратен PERIOD и не сбивается. Эту конструкцию можно упростить до

      В этом случае алгоритм получается короче, кратность периодов сохраняется, но теряется защита от пропуска вызова и переполнения millis().

      В этой библиотеке реализован полноценный таймер на счётчике аптайма, позволяющий даже “приостановить” счёт (не приостанавливая сам аптайм).

      Примечание: таких таймеров можно создать сколько душе угодно (пока хватит памяти), что позволяет создавать сложные программы с кучей подзадач, но для функционирования данного таймера нужен “чистый” loop с минимальным количеством задержек, или вообще без них. Всё таки таймер “опрашивается” в ручном режиме. Таймер, который не боится задержек, делается на прерывании таймера, смотрите вот эту библиотеку.

      БИБЛИОТЕКА GYVERTIMER

      GyverTimer v3.2

      GTimer – полноценный таймер на базе системных millis() / micros(), обеспечивающий удобную мультизадачность и работу с временем, используя всего одно родное прерывание таймера (Timer 0)

      • Миллисекундный и микросекундный таймер
      • Два режима работы:
      • Режим интервала: таймер “срабатывает” каждый заданный интервал времени
      • Режим таймаута: таймер “срабатывает” один раз по истечении времени (до следующего перезапуска)
    • Служебные функции:
      • Старт
      • Стоп
      • Сброс
      • Продолжить
      • Поддерживаемые платформы: все Arduino (используются стандартные Wiring-функции)

        ДОКУМЕНТАЦИЯ

        Документация

        Конструктор

        Класс GTimer позволяет работать как с миллисекундным, так и с микросекундным таймером. В общем виде пример выглядит так:

        Где type это MS (,мс, миллисекундный таймер) или US (мкс, микросекундный), period – период в мс или мкс соответственно.

        Настройки по умолчанию

        • При создании таймера можно ничего не указывать : GTimer myTimer; , тогда таймер будет сконфигурирован как миллисекундный и не запустится
        • Если указать только тип таймера (MS/US) GTimer myTimer(MS); , таймер настроится на выбранный режим (мс/мкс) и не запустится
        • Если указать тип таймера и интервал GTimer myTimer(US, 5000); , таймер настроится на выбранный режим (мс/мкс) и запустится в режиме интервала
        Читайте также:  Echolife hg8245h технические характеристики

        Режимы работы

        Таймер может работать в режиме интервалов и в режиме таймаута:

        • Интервалы. Запуск – метод setInterval(время) с указанием времени. В режиме интервалов таймер срабатывает (метод isReady() возвращает true) каждый раз при достижении указанного периода и автоматически перезапускается. Удобно для периодических действий
        • Таймаут. Запуск – метод setTimeout(время) с указанием времени. В режиме таймаута таймер срабатывает (метод isReady() возвращает true) только один раз при достижении указанного периода и автоматически отключается. Для повторного запуска нужно вызвать .setTimeout() с указанием периода, или просто .start() – запустит таймер на новый круг с прежним периодом

        Управление таймером

        Для управления состоянием таймера есть следующие методы:

        • start() – запускает (перезапускает) таймер с последним установленным временем
        • stop() – останавливает таймер
        • resume() – продолжает отсчёт таймера с момента остановки
        • reset() – сбрасывает таймер (отсчёт периода/таймаута начинается заново)
        • isEnabled() – возвращает true, если таймер работает (если он не stop() или не вышел таймаут)

        Таймер с обратным отсчетом на Arduino.

        Ссылки на компоненты:

        Часы реального времени Ds3231 — http://ali.pub/enqbc

        Модуль расширителя интерфейса (I2C)- http://ali.pub/dwj5n

        ЖК-дисплей LCD1602 (синий экран)- http://ali.pub/alnru

        Таймер с обратным отсчетом на Arduino

        Оставьте комментарий:

        Юный Технарь:

        Помощь проекту:

        Деньги можно перечислить на карту Сбербанка России:

        4276 5400 2194 5088

        Поиск

        Последние статьи

        ESPUI — Ссылки, стили букв в тексте

        Контроллер для сауны.

        Контроллер для сауны

        Контроллер для сауны.

        Мой канал на YouTube

        Подпишитесь!

        2015, Arduinoprom.ru — блог Чилингаряна Грачика. Все авторские права на тексты принадлежат ему.

        При размещении текстов и видеоматериалов на сторонних ресурсах активная гиперссылка ОБЯЗАТЕЛЬНА.

        Все логотипы и товарные знаки, размещенные на сайте, принадлежат только их законным владельцам (правообладателям).

        Комментировать
        0 просмотров
        Комментариев нет, будьте первым кто его оставит

        Это интересно
        Adblock detector