Секундомер ардуино: делаем своими руками на основе uno

Секундомер ардуино: делаем своими руками на основе uno

РАБОТАЕМ ПО ТАЙМЕРУ В 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() или не вышел таймаут)

ОБОРУДОВАНИЕ
ТЕХНОЛОГИИ
РАЗРАБОТКИ

Блог технической поддержки моих разработок

Урок 22. Работа со временем в Ардуино. Проект спортивного секундомера.

Рассмотрим функции работы со временем. Разработаем спортивный секундомер на базе платы Ардуино.

Для работы со временем в системе Ардуино существуют 4 стандартные функции:

Рассмотрим эти функции подробно.

void delay(unsigned long time)

Функция приостанавливает работу программы на время time, заданное в мс.

delay(500); // пауза на 0,5 сек

Мы уже использовали эту функцию в предыдущих уроках. Использовали в отладочных программах. В практических программах функция применяется редко.

Дело в том, что она останавливает работу программы. Программа ничего не делает в течение заданного отрезка времени. Не позволительная роскошь, допустимая только в отладочных режимах.

Кроме того, функция не позволяет создавать циклы с заданным временем. Например, время следующего цикла не будет точно равно 100 мс.

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

Для организации циклов с заданным временем лучше использовать прерывание по таймеру (урок 10). Надо только понимать, что такой способ обеспечивает стабильное время цикла, но оно может несколько отличаться от заданного. Например, библиотека MsTimer2 задает время в мс. Реальное время может отличаться на 1-2 мкс. В некоторых приложениях, например в часах, ошибка будет накапливаться и приведет к недопустимой погрешности.

void delayMicroseconds(int time)

Функция приостанавливает работу программы на время time, заданное в мкс.

delayMicroseconds(50); // пауза на 50 мкс

Аналог функции delay(), только обеспечивает более короткие остановки программы. Вполне допустима для использования в практических программах по двум причинам.

  • Короткие отрезки времени сложно реализовать другими методами.
  • Остановка программы даже на несколько десятков микросекунд не вызовет катастрофических последствий.

unsigned long millis(void)

Функция возвращает время в мс, с момента запуска текущей программы. Значение времени переполняется через 1193 часов, приблизительно 50 суток.

tm = millis(); // чтение времени в tm

По сути это функция чтения системного времени Ардуино. Время считается в параллельном процессе и не зависит от алгоритмов выполнения программы, остановок, в том числе и функцией delay(), и т.п. Для измерения интервалов времени необходимо считать системное время в начале и конце интервала и выполнить разность этих значений. Ниже будет пример программы для работы с временными интервалами.

Запрещение прерываний функцией noInterrupts() на длительное время может нарушить работу системных часов.

Точность работы функции millis().

Точность отсчета времени функцией millis() определяется точностью и стабильностью частоты кварцевого резонатора платы Ардуино. Даже для дешевых резонаторов погрешность частоты не превышает 30 ppm. Вместе с температурной нестабильностью, в нормальных условиях, это 50 ppm, что соответствует ± 0,00005 %. Таким образом, суммарная абсолютная ошибка системного времени Ардуино составит:

  • 0,18 сек для 1 часа;
  • 4,32 сек для суток;
  • 129,6 сек для месяца;
  • 26 минут для года.

Наверное, вполне допустимая точность для создания секундомеров и даже часов.

unsigned long micros(void)

Функция возвращает время в мкс, с момента запуска текущей программы. Значение переполняется приблизительно через 70 минут.

tm = micros(); // чтение времени в tm

На платах Ардуино с частотой тактирования 16 мГц разрешение значения функции micros() составляет 4 мкс. Для плат с частотой 8 мГц – 8 мкс.

Спортивный секундомер на базе платы Ардуино.

Реализуем достаточно простой проект – секундомер. Наверное, практическое применение такого устройства ограничено. Секундомер с питанием от сети имеет право на существование только в стационарных устройствах. В табло для спортивных соревнований, в системах для интеллектуальных игр, и т.п. Но разобравшись в программе, Вы легко сможете подкорректировать секундомер под свои задачи или создать совершенно другое устройство.

Управление секундомером осуществляется двумя кнопками:

После нажатия на кнопку ПУСК/СТОП секундомер начинает отсчитывать время. Повторное нажатие на эту кнопку останавливает счет. Следующее нажатие продолжает отсчет времени с остановленного значения. Таким образом, секундомер может быть использован для отсчета ”чистого ” времени спортивных соревнований.

Для сброса значения времени необходимо нажать кнопку СБРОС.

Время отображается на четырех разрядном семисегментном индикаторе в следующих форматах.

Значение времени Разряд 3 Разряд 2 Разряд 1 Разряд 0
0 … 59 сек секунды сотые доли секунды
1 … 10 минут минуты секунды десятые доли секунды
10 … 99 минут минуты секунды
Больше 99 минут

Формат вывода данных меняется автоматически в зависимости от значения времени. Минуты, секунды и дробная часть отделяются на индикаторе децимальными точками. Нажатия на кнопки сопровождаются звуковыми сигналами.

Схема спортивного секундомера на базе платы Arduino UNO R3.

По уже хорошо известным нам схемам подключаем к плате Ардуино:

  • 4х разрядный семисегментный светодиодный индикатор GNQ-3641BUE;
  • две кнопки;
  • звуковой пьезоизлучатель.

Все эти компоненты могут быть другими. Если Вы разрабатываете секундомер для спортивного табло, то индикаторы должны быть большими. Можете их собрать даже из отдельных светодиодов. Как подключить индикаторы к плате можно посмотреть в уроке 19.

Если кнопки управления секундомером физически расположены на значительном расстоянии от платы, то лучше их подключить по схеме из охранной сигнализации, урок 17. Или хотя бы соединить входы кнопок с питанием + 5 В через резисторы 1 кОм.

Но для отладки и проверки программы достаточно приведенной схемы. Я собрал ее на макетной плате.

Программа для спортивного секундомера на Ардуино.

Скетч программы можно загрузить по этой ссылке загрузить . Не забудьте установить библиотеки из предыдущих уроков: MsTimer2.h (урок 10), Led4Digits.h (урок 20) и Button.h (урок 9).

Скетч программы для секундомера выглядит так.

#define SOUND_PIN 18 // звуковой излучатель, вывод 18 (A4)

// тип индикатора 1; выводы разрядов 5,4,3,2; выводы сегментов 6,7,8,9,10,11,12,13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

Button buttonReset(16, 10); // кнопка СБРОС, вывод 16 (A2)
Button buttonStartStop(17, 10); // кнопка ПУСК/СТОП, вывод 17 (A3)

byte mode= 0; // режим, 0 – СТОП, 1 – ПУ СК
unsigned long msTime=0; // время интервала, милисекунды
byte minTime=0; // время интервала, минуты
byte decMinTime=0; // время интервала, десятки минуты
unsigned long prevTime; // предыдущее значение времени
unsigned long curentTime; // текущее значение времени
byte soundCount=0; // счетчик времени звука

void setup() <
MsTimer2::set(2, timerInterrupt); // прерывания по таймеру 2 мс
MsTimer2::start(); // разрешение прерывания
pinMode(SOUND_PIN, OUTPUT); // вывод звукового излучателя
>

// ———————– переключение режима СТАРТ/СТОП
if ( buttonStartStop.flagClick == true ) <
buttonStartStop.flagClick= false; // сброс признака
// инверсия режима
if ( mode == 0) <
mode= 1; // СТАРТ
soundCount= 250; // звук на старт 250*2 мс
>
else < // СТОП
mode= 0;
soundCount= 50; // звук на стоп 50*2 мс
>
>

// ———————– кнопка СБРОС
if ( buttonReset.flagClick == true ) <
buttonReset.flagClick= false; // сброс признака
msTime=0;
minTime=0;
decMinTime=0;
soundCount= 50; // звук на сброс 50*2 мс
>

// ———————– отсчет времени
if ( mode == 0 ) <
// СТОП
prevTime= millis();
>
else <
// ПУСК
curentTime= millis(); // чтение текущего времени
msTime += curentTime – prevTime; // прибавление времени к милисекундам
if ( msTime > 59999 ) <
// милисекунды переполнились, больше минуты
msTime -= 60000;
minTime ++; // +1 к единицам минут
if ( minTime > 9 ) <
// единицы минут переполнились
minTime -= 10;
decMinTime ++; // +1 к десяткам минут
>
>
prevTime= curentTime; // перегрузка предыдущего времени
>

// ——————— отображение времени
if ( (minTime == 0) && (decMinTime == 0)) <
// меньше минуты
disp.print(msTime / 10, 4, 0); // вывод четырех разрядов милисекунд
// точки
disp.digit[0] &= 0x7f; // погасить
disp.digit[1] &= 0x7f; // погасить
disp.digit[2] |= 0x80; // зажечь
disp.digit[3] &= 0x7f; // погасить
>
else if ( decMinTime == 0 ) <
// меньше 10 минут
disp.print(msTime / 100, 3, 0); // вывод трех разрядов милисекунд
disp.tetradToSegCod(3, minTime); // в старший разряд вывод единиц минут
// точки
disp.digit[0] &= 0x7f; // погасить
disp.digit[1] |= 0x80; // зажечь
disp.digit[2] &= 0x7f; // погасить
disp.digit[3] |= 0x80; // зажечь
>
else if ( decMinTime
// меньше 100 минут
disp.print(msTime / 1000, 2, 0); // вывод двух разрядов милисекунд
disp.tetradToSegCod(3, decMinTime); // в старший разряд вывод десятков минут
disp.tetradToSegCod(2, minTime); // в 3 разряд вывод единиц минут
// точки
disp.digit[0] &= 0x7f; // погасить
disp.digit[1] &= 0x7f; // погасить
disp.digit[2] |= 0x80; // зажечь
disp.digit[3] &= 0x7f; // погасить
>
else <
// больше 100 минут
// —-
disp.digit[0]= 0x40;
disp.digit[1]= 0x40;
disp.digit[2]= 0x40;
disp.digit[3]= 0x40;
>
>

// ———– обработчик прерывания 2 мс
void timerInterrupt() <
disp.regen(); // регенерация индикатора
buttonReset.filterAvarage(); // сканирование кнопки, метода фильтрации по среднему
buttonStartStop.filterAvarage(); // сканирование кнопки, метода фильтрации по среднему

Большая часть программы разработана по принципам, подробно описанным в предыдущих уроках.

  • Реализовано прерывание по таймеру с периодом 2 мс.
  • В обработчике прерывания вызываются:
    • метод регенерации индикатора;
    • методы сканирования сигналов кнопок;
    • блок формирования звукового сигнала.
  • По признакам нажатия кнопок происходит:
    • переключение режима (СТАРТ/СТОП);
    • сброс показаний времени.
  • В зависимости от значения времени в блоке отображения меняется формат вывода данных на индикатор.

Подробно хочется остановиться на программном блоке “отсчет времени”. Счет времени можно реализовать разными способами. Например, можно считать время в миллисекундах, а в блоке отображения делать перевод в нужный формат. Я решил, что намного проще считать время в формате:

В этом случае не приходится выполнять двоично-десятичные преобразования для отображения минут. Конечно, если бы у нас была задача измерения одного интервала времени, то достаточно было бы считать время функцией millis() в начале и конце интервала, а затем вычислить разность. Но нам необходимо накопление времени, поэтому алгоритм несколько усложняется.

В программе достаточно комментариев. Думаю, Вы без труда разберетесь в ней и сможете создать устройство под свои задачи, будь это спортивный секундомер, система для интеллектуальных игр ”Что? Где? Когда?” или ”Брейн ринг” и многое другое. Мы вернемся к секундомеру и работе со временем при разработке спортивных табло на базе светодиодных модулей. Надеюсь, уже этим летом.

Watchdog на arduino для майнига . Делаем watchdog своими руками на ардуино UNO —

Предлагаю вариант устройства автоматически перезагружающее компьютер при зависании.

В основе лежит известная плата Arduino с минимальным количеством внешних электронных компонентов. Транзистор подключаем к плате согласно рисунку ниже. Коллектор транзистора подключаем вместо кнопки «Reset» компьютера на материнскую плату, на тот контакт который НЕ соединен с GND.

Вот и вся схема :

Функционирует устройство следующим образом: на компьютере запускается скрипт, который периодически шлет в порт компьютера данные. Ардуино подключается к USB и слушает этот порт. Если в течении 30 секунд данных нет Ардуино открывает транзистор, который соединяет Reset c землей, тем самым имитируя нажатия кнопки сброса.
После сброса ардуино делает паузу в 2 минуты дожидаясь загрузки всех программ и вновь начинает слушать порт.

Скрипт и майнеры должны быть добавлены в автозагрузку, а биос настроен на автоматическое включение компьютера.

Изготвление устройства требует минимальных навыков работы с паяльником и програмирования ардуино.

Так же можно использовать любой Н канальный транзистор с похожими характеристиками . Но смотрите что бы совпадала цоколевка . Например я использовал 9013 , там перевернутое подключение

Компонентты для сборки я покупал на Алиэкспресс :

Провода для макетной сборки http://ali.pub/22k78b

Ардуино УНО (точно подходит ) http://ali.pub/22k7dd

Arduino uno с кабелем http://ali.pub/22k7go

Скрипт отправляющий в порт данные:

(Get-Date).ToString(‘dd.MM.yyyy HH:mm’) | Out-File c:UsersminerDesktopreboot.txt -append

Сразу после запуска скрипт записывает в файл reboot.txt текущую дату и время. По этому файлу можно судить о количество и времени перезагрузок. Путь к файлу и номер порта необходимо отредактриовать в соответствии с вашими данными системы. Код пишется в обычном блокноте и сохраняется с расширением *ps1.

Т.к. в Windows политикой безопасности отключено выполнение скриптов по двойному клику и из автозагрузки делаем финт ушами и запускаем шелл из батника следущего содержания:

start PowerShell.exe -ExecutionPolicy ByPass -File «c:путь к вашему файлуваш файл.ps1»

Файл сохраняем с расширением *.bat и ставим его в автозагрузку.

Радуемся , теперь у нас все автоматизированно . Устройство испытано на своем ПК и польностью работает .

Подписывайтесь на Bitnovosti в telegram!

Делитесь вашим мнением об этой новости в комментариях под статьёй.

Микросхема простого электронного таймера времени на Ардуино своими руками

Всем привет! Собрав таймер на Ардуино из этой инструкции, вы сможете контролировать включение и выключение ваших устройств в нужное вам время. Это могут быть ночные фонари, система орошения сада и т.д. Мы воспользуемся Ардуино, дисплеем и RTC 1307, отображающим и управляющим временем. Вы можете задать часы «ВКЛ» и «ВЫКЛ» при помощи 4 кнопок, что позволит вам изменять настройки микросхемы таймера.

Также вы научитесь создавать часы, базирующиеся на Ардуино. Я приложил схему из fritzing и видео, так что вы без проблем соберёте данное устройство.

Сначала посмотрите видео, чтобы понять, о чем идет речь, используйте его как руководство.

Шаг 1: Материалы

  • Arduino Uno
  • Модуль RTC 1307
  • Дисплей 16X2
  • Модуль реле 5V
  • Подстроечный потенциометр 10K
  • Резистор 1K
  • Резисторы 10K x 4 штуки
  • Кнопки x 4 штуки
  • Макетная плата, джамперы.

Шаг 2: Устанавливаем часы

Следуйте схеме из Fritzing.

Соедините 5V и GND с Ардуино с соответствующими контактами (Красный – 5V, синий – земля)

Дисплей к Ардуино:

  1. VSS к GND
  2. VDD к 5V
  3. VO к центру потенциометра
  4. RS к пину 2
  5. RW к GND
  6. EN или E к пину 3
  7. D0 NC
  8. D1 NC
  9. D2 NC
  10. D3 NC
  11. D4 к пину 4
  12. D5 к пину 5
  13. D6 к пину 6
  14. D7 к пину 7
  15. A к 5V
  16. K к GND через резистор 1K
  17. Остальные контакты потенциометра на 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. Надеюсь, эта инструкция как собрать простой таймер своими руками была для вас полезна!

Рассказываю как сделать какую-либо вещь с пошаговыми фото и видео инструкциями.

Источники:

http://mypractic.ru/urok-22-rabota-so-vremenem-v-arduino-proekt-sportivnogo-sekundomera.html

http://btcdesk.ru/watchdog-na-arduino-dlya-majniga-delaem-watchdog-svoimi-rukami-na-arduino-uno.html

http://masterclub.online/topic/15153-taimer-na-arduino

http://altenergiya.ru/sun/kak-sdelat-solnechnoe-zaryadnoe-ustrojstvo-dlya-smartfona-svoimi-rukami.html

Ссылка на основную публикацию