Работа по таймеру в Arduino. GyverTimer [12.11.19]
Я думаю все знают классический алгоритм создания таймера на 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() всегда, когда требуется счёт времени.
Таймер на LCD дисплее с обратным отсчётом
Таймер обратного отсчета на Arduino с кнопками или энкодером и дисплеем 1602 I2C — интересный и полезный проект. Рассмотрим сразу два варианта таймера обратного отсчета на Arduino Uno, который можно использовать на кухне для включения света и звуковой индикации или автоматического включения реле от платы Arduino. Вы сможете сами выбрать наиболее подходящий вариант секундомера для вашего проекта.
Необходимые компоненты:
- Arduino Uno / Arduino Nano / Arduino Mega
- тактовые кнопки / encoder ky-040
- экран lcd 1602 с модулем i2c
- светодиоды и резисторы
- макетная плата
- коннекторы
- библиотека LiquidCrystal_I2C.h и RotaryEncoder.h
Первый вариант представляет собой таймер Arduino с кнопочным управлением. Нажимая на первую и вторую кнопки, можно увеличивать и уменьшать временной интервал в минутах. Нажатие на третью кнопку, подключенную к пину 4, запускает обратный отсчет. По окончании обратного отсчета загорается светодиод и включается зуммер. Четвертая кнопка, подключенная к цифровому пину 5 платы, используется для сброса таймера.
Таймер Arduino с обратным отсчётом на LCD с кнопкой
LCD 1602 i2c Arduino Uno Arduino Nano Arduino Mega GND GND GND GND VCC 5V 5V 5V SDA A4 A4 20 SCL A5 A5 21 Секундомер с обратным отсчетом можно остановить в любой момент, нажав третью кнопку, подключенную к пину 4. После сборки электрической схемы, как на показано на изображении выше, загрузите в микроконтроллер Arduino следующий пример программы. Обратите внимание, что для работы таймера на дисплее LCD 1602 с модулем I2C необходимо сначала установить библиотеку популярную LiquidCrystal_I2C.
Скетч для таймера на Ардуино с кнопкой и дисплеем
Таймер Arduino с обратным отсчётом на LCD с энкодером

Теперь мы рассмотрим, как сделать таймер на Arduino с энкодером KY-040 и выводом информации на дисплей. Принцип управления аналогичен предыдущему. Вращая ручку энкодера, вы можете установить необходимый интервал минут секундомера, а нажимая на кнопку, вы можете запускать и останавливать обратный отсчет. На схеме выше показана схема сборки проекта на Arduino Uno, но проект может быть собран и на Arduino Nano.
Скетч для таймера на Ардуино с энкодером и дисплеем
Заключение. В данном обзоре представлены два варианта сборки часов с таймером на Ардуино для кухни или аквариума своими руками. Частоту зуммера можно изменить с помощью команды tone, а для скетча необходимо установить библиотеку RotaryEncoder и LiquidCrystal_I2C. В комментариях вы можете оставить вопросы по данному проекту или предложить свой вариант таймера обратного отсчета с кнопкой или энкодером.
Руководство по таймерам Arduino для начинающих
Платформа Arduino была первоначально спроектирована в 2005 году и первоначально предназначалась для того, чтобы люди, мало знакомые с электроникой и программированием, могли конструировать разнообразные электронные устройства. Но со временем она получила широкое распространение не только в кругах начинающих знакомиться с электроникой, но и среди профессионалов в сфере электроники.

В отличие от языков программирования для микроконтроллеров AVR, ARM, PIC, STM, в которых нужно хорошо представлять структуру этих микроконтроллеров, язык программирования для платформы Arduino исключительно простой и понятный. Достаточно легко понять, к примеру, как работают функции digitalWrite(), AnalogWrite(), Delay() и др. не вникая в суть машинного языка, который спрятан внутри них. Также не нужно вникать в суть различных регистров микроконтроллера, которые используются для управления этими процессами.
Но тем не менее, для лучшего понимания всех этих процессов, желательно все таки немного погрузиться внутрь этих процессов. К примеру, функция delay() используется для установки таймеров и битов регистров счета микроконтроллера AVR ATmega, являющегося основой платы Arduino.
В этой статье мы рассмотрим как без использования функции delay() управлять задержками в программе, непосредственно имея дело с регистрами микроконтроллера. Для этого мы будем использовать программную среду Arduino IDE. Мы будем устанавливать соответствующие биты регистра таймера и использовать прерывание переполнения таймера (Timer Overflow Interrupt) чтобы переключать (включать/выключать) состояние светодиода каждый раз когда происходит прерывание. Для контроля длительности задержки в схеме будут использоваться кнопки, с помощью которых можно будет изменять заранее загружаемое значение в биты таймера.
Что такое таймеры
Что же представляют собой таймеры в современной электронике? Фактически это определенный вид прерываний. Это простые часы, которые могут измерять длительность какого-нибудь события. Каждый микроконтроллер имеет встроенные часы (осциллятор), в плате Arduino Uno его роль выполняет кварцевый генератор, расположенный на плате, который работает на частоте 16 МГц. Частота влияет на скорость работы микроконтроллера. Чем выше частота, тем выше скорость работы. Таймер использует счетчик, который считает с определенной скоростью, зависящей от частоты осциллятора (кварцевого генератора). В плате Arduino Uno состояние счетчика увеличивается на 1 каждые 62 нано секунды (1/16000000 секунды). Фактически, это время за которое плата Arduino Uno переходит от одной инструкции к другой (то есть выполняет одну инструкцию).
Таймеры в Arduino Uno
В плате Arduino Uno используется три таймера:
Timer0: 8-битный таймер, используемый в таких функциях как delay(), millis().
Timer1: 16-битный таймер, используемый в библиотеке для управления серводвигателями.
Timer2: 8-битный таймер, используемый в функции tone().Регистры таймеров в Arduino Uno
Для изменения конфигурации таймеров в плате Arduino Uno используются следующие регистры:
1. Timer/Counter Control Registers (TCCRnA/B) – управляющие регистры таймера/счетчика
Эти регистры содержат основные управляющие биты таймера и используются для управления предварительными делителями частоты (предделителями) таймера. Они также позволяют управлять режимом работы таймера с помощью битов WGM.
Формат этих регистров:

Предделитель (Prescaler)
Биты CS12, CS11, CS10 в регистре TCCR1B устанавливают коэффициент деления предделителя, то есть скорость часов таймера. В плате Arduino Uno можно установить коэффициент деления предделителя равный 1, 8, 64, 256, 1024.

2. Timer/Counter Register (TCNTn) – регистры таймера/счетчика
Эти регистры используются для управления счетчиками и для установки заранее загружаемого значения.
Формула для расчета заранее загружаемого значения (preloader value) для необходимого интервала времени (Time) в секундах выглядит следующим образом:
TCNTn = 65535 – (16×10 6 xTime in sec / Prescaler Value)
Откуда берется величина 16х10 6 ? Здесь все просто — это переведенная в Герцы частота кварцевого генератора 16 МГц.
Чтобы для таймера 1 (timer1) задать время равное 2 секундам, при коэффициент деления предделителя (Prescaler Value) равном 1024, получим:
TCNT1 = 65535 – (16×10 6 x2 / 1024) = 34285
Прерывания таймеров в Arduino
Прерывания таймеров являются видом программных прерываний. В Arduino присутствуют следующие виды прерываний таймеров.
Прерывания переполнения таймера (Timer Overflow Interrupt)
Это прерывание происходит всегда, когда значение счетчика достигает его максимального значения, например, для 16-битного счетчика это 65535. Соответственно, процедура обработки (обслуживания) прерывания (ISR) вызывается когда бит прерывания переполнения таймера установлен (enabled) в TOIEx присутствующем в регистре масок прерываний TIMSKx.
ISR Format:
Output Compare Register (OCRnA/B) – регистр сравнения выхода
Процедура обработки прерывания сравнения выхода (Output Compare Match Interrupt) вызывается при вызове функции TIMERx_COMPy_vect если установлен бит/флаг OCFxy в регистре TIFRx. Эта процедура обработки прерывания (ISR) становится доступной при помощи установки бита OCIExy, присутствующем в регистре маски прерываний TIMSKx.
Захват входа таймера (Timer Input Capture)
Процедура обработки этого прерывания вызывается если установлен бит/флаг ICFx в регистре флагов прерываний таймера (TIFRx — Timer Interrupt Flag Register). Эта процедура обработки прерываний становится доступной при установке бита ICIEx в регистре маски прерываний TIMSKx.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- ЖК дисплей 16х2 (купить на AliExpress).
- Резисторы 10 кОм (2 шт.) и 2,2 кОм (купить на AliExpress).
- Светодиод (любого цвета) (купить на AliExpress).
- Кнопка (2 шт.).
- Источник питания с напряжением 5 В.
Работа схемы
Схема устройства представлена на следующем рисунке.

Необходимые соединения между платой Arduino Uno и ЖК дисплеем 16х2 представлены в следующей таблице:
ЖК дисплей 16х2 Arduino UNO VSS GND VDD +5V V0 к среднему контакту потенциометра для контроля контрастности ЖК дисплея RS 8 RW GND E 9 D4 10 D5 11 D6 12 D7 13 A +5V K GND Две кнопки через подтягивающие резисторы 10 кОм подключены к контактам 2 и 4 платы Arduino Uno, а светодиод подключен к контакту 7 Arduino через резистор 2,2 кОм.
Собранная схема устройства будет выглядеть примерно следующим образом:

Программирование таймеров в плате Arduino UNO
В этом проекте мы будем использовать прерывание переполнения таймера (Timer Overflow Interrupt) и использовать его для включения и выключения светодиода на определенные интервалы времени при помощи установки заранее определяемого значения (preloader value) регистра TCNT1 с помощью кнопок. Полный код программы будет приведен в конце статьи, здесь же рассмотрим его основные части.
Для отображения заранее определяемого значения используется ЖК дисплей, поэтому необходимо подключить библиотеку для работы с ним.
Анод светодиода подключен к контакту 7 платы Arduino, поэтому определим (инициализируем) его как ledPin.
#define ledPin 7
Затем сообщим плате Arduino к каким ее контактам подключен ЖК дисплей.
Установим заранее определенное значение (preloader value) равное 3035 – это будет соответствовать интервалу времени в 4 секунды. Формула для расчета этого значения приведена выше в статье.
float value = 3035;
Затем в функции void setup() установим режим работы ЖК дисплея 16х2 и высветим приветственное сообщение на нем на несколько секунд.
lcd.begin(16,2);
lcd.setCursor(0,0);
lcd.print(«ARDUINO TIMERS»);
delay(2000);
lcd.clear();Затем контакт, к которому подключен светодиод, установим в режим вывода данных, а контакты, к которым подключены кнопки – в режим ввода данных.
pinMode(ledPin, OUTPUT);
pinMode(2,INPUT);
pinMode(4,INPUT);После этого отключим все прерывания.
Далее инициализируем Timer1.
TCCR1A = 0;
TCCR1B = 0;Загрузим заранее определенное значение (3035) в TCNT1.
Затем установим коэффициент деления предделителя равный 1024 при помощи конфигурирования битов CS в регистре TCCR1B.
Разрешим вызов процедуры обработки прерывания переполнения счетчика с помощью установки соответствующего бита в регистре маски прерываний.
TIMSK1 |= (1 << TOIE1);
Теперь разрешим все прерывания.
Теперь процедура обработки прерывания переполнения счетчика будет отвечать за включение и выключение светодиода с помощью функции digitalWrite . Состояние светодиода будет меняться каждый раз когда будет происходить прерывание переполнения счетчика.
ISR(TIMER1_OVF_vect)
<
TCNT1 = value;
digitalWrite(ledPin, digitalRead(ledPin) ^ 1);
>В функции void loop() предварительно загружаемое значение увеличивается и уменьшается на 10 (инкрементируется и декрементируется) при помощи кнопок в схеме. Также это значение отображается на экране ЖК дисплея 16х2.
if(digitalRead(2) == HIGH)
<
value = value+10; //увеличиваем preload value
>
if(digitalRead(4)== HIGH)
<
value = value-10; //уменьшаем preload value
>
lcd.setCursor(0,0);
lcd.print(value);
>Исходный код программы
Далее приведен полный текст программы. Работа нашего проекта продемонстрирована на видео, приведенном в конце статьи.
Таймер на Ардуино с обратным отсчётом

Таймер на Ардуино с обратным отсчетом с кнопками или энкодером и дисплеем 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.
Заключение. В этом обзоре представлено лишь два варианта изготовления часов с таймером для аквариума или кухни своими руками. В комментариях вы можете оставить вопросы по данному проекту (если они есть) или предложить свой вариант проекта с обратным отсчетом времени, который можно добавить к этому обзору.
