- Микросхема простого электронного таймера времени на Ардуино своими руками
- Шаг 1: Материалы
- Шаг 2: Устанавливаем часы
- Шаг 3: Устанавливаем время
- Шаг 4: Часы
- Шаг 5: Устанавливаем таймер
- Шаг 6: Таймер
- Работа по таймеру в Arduino. GyverTimer [12.11.19]
- ОБНОВЛЕНИЯ
- ТЕОРИЯ
- БИБЛИОТЕКА
- GyverTimer v3.2
- УСТАНОВКА
- ДОКУМЕНТАЦИЯ
- Конструктор
- Режимы работы
- Управление таймером
- Руководство по таймерам Arduino для начинающих
- Что такое таймеры
- Таймеры в Arduino Uno
- Регистры таймеров в Arduino Uno
- 1. Timer/Counter Control Registers (TCCRnA/B) – управляющие регистры таймера/счетчика
- 2. Timer/Counter Register (TCNTn) – регистры таймера/счетчика
- Прерывания таймеров в Arduino
- Прерывания переполнения таймера (Timer Overflow Interrupt)
- Output Compare Register (OCRnA/B) – регистр сравнения выхода
- Захват входа таймера (Timer Input Capture)
- Необходимые компоненты
- Работа схемы
- Программирование таймеров в плате Arduino UNO
- Исходный код программы
Микросхема простого электронного таймера времени на Ардуино своими руками
Всем привет! Собрав таймер на Ардуино из этой инструкции, вы сможете контролировать включение и выключение ваших устройств в нужное вам время. Это могут быть ночные фонари, система орошения сада и т.д. Мы воспользуемся Ардуино, дисплеем и RTC 1307, отображающим и управляющим временем. Вы можете задать часы «ВКЛ» и «ВЫКЛ» при помощи 4 кнопок, что позволит вам изменять настройки микросхемы таймера.
Также вы научитесь создавать часы, базирующиеся на Ардуино. Я приложил схему из fritzing и видео, так что вы без проблем соберёте данное устройство.
Сначала посмотрите видео, чтобы понять, о чем идет речь, используйте его как руководство.
Шаг 1: Материалы
- Arduino Uno
- Модуль RTC 1307
- Дисплей 16X2
- Модуль реле 5V
- Подстроечный потенциометр 10K
- Резистор 1K
- Резисторы 10K x 4 штуки
- Кнопки x 4 штуки
- Макетная плата, джамперы.
Шаг 2: Устанавливаем часы
Следуйте схеме из Fritzing.
Соедините 5V и GND с Ардуино с соответствующими контактами (Красный – 5V, синий – земля)
Дисплей к Ардуино:
- VSS к GND
- VDD к 5V
- VO к центру потенциометра
- RS к пину 2
- RW к GND
- EN или E к пину 3
- D0 NC
- D1 NC
- D2 NC
- D3 NC
- D4 к пину 4
- D5 к пину 5
- D6 к пину 6
- D7 к пину 7
- A к 5V
- K к GND через резистор 1K
- Остальные контакты потенциометра на 5V и GND
- SDA к пину 4
- SCL у пину 5
- GND и 5V
Шаг 3: Устанавливаем время
Пришло время настроить часы. Запустите код «Set time RTC». Этот скетч возьмёт данные о дате и времени из вашего компьютера прямо во время компиляции кода и использует их для программирования RTC. Если у вас на компьютере неправильные установки, то поправьте их перед запуском программы. Затем нажмите кнопку Upload, чтобы немедленно загрузить откомпилированный код.
Внимание: Если вы скомпилируете код, а загрузите его позже, то данные о времени устареют.
Далее откройте окно Serial Monitor, чтобы увидеть, что время было установлено.
Шаг 4: Часы
После того, как установите время, откройте и загрузите скетч «Clock with RTC LCD». Потенциометр в схеме нужен для настройки контрастности дисплея, покрутите его, чтобы чётко видеть символы.
Шаг 5: Устанавливаем таймер
Теперь мы добавим кнопки и реле. Опять же, следуйте схеме Fritzing.
Пины 8,9, 10 и 11 соединены с GND через резисторы 10K. Когда вы нажмете на кнопку, то на контакты пойдёт напряжение 5V.
Реле соединяется с пином 12. С помощью него можно управлять вашими устройствами, но будьте осторожны с максимальной нагрузкой на реле!
Шаг 6: Таймер
Откройте и загрузите код «Timer with on off set point». Нажимайте кнопки, чтобы сместить время назад или вперёд. Если электронный таймер будет в пределах настроенного интервала, то он начнет работать сразу же. Если же он не попадает в нужный интервал, то будет ждать час «ВКЛ».
Этот код имеет интересные функции, которые можно использовать в других проектах. Я постарался отделить каждую функцию, чтобы всё было максимально понятным.
Весь код написан мной, кроме настройки времени на RTC и дата-логгера Adafruit. Надеюсь, эта инструкция как собрать простой таймер своими руками была для вас полезна!
Рассказываю как сделать какую-либо вещь с пошаговыми фото и видео инструкциями.
Источник
Работа по таймеру в 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() или не вышел таймаут)
Источник
Руководство по таймерам 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.
Разрешим вызов процедуры обработки прерывания переполнения счетчика с помощью установки соответствующего бита в регистре маски прерываний.
Теперь разрешим все прерывания.
Теперь процедура обработки прерывания переполнения счетчика будет отвечать за включение и выключение светодиода с помощью функции 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);
>
Исходный код программы
Далее приведен полный текст программы. Работа нашего проекта продемонстрирована на видео, приведенном в конце статьи.
Источник