Arduino секундомер библиотека

Секундомер на Arduino

Секундомер выполнен на основе Arduino Nano (Uno), показания секундомера выводятся на индикатор 1602. На индикатор выводятся показания часов (до 24), минут, секунд и десятые доли секунды.

Секундомер содержит два секундомера управляемые одной кнопкой, алгоритм работы секундомера следующий:

  • При первом нажатии на кнопку происходит запуск первого секундомера (1 строка индикатора)
  • Второе нажатие на кнопку переводит остановившиеся показания первого секундомера на вторую строку индикатора, при этом отсчет времени в первой строке продолжается, отображая время второго секундомера.
  • Третье нажатие на кнопку останавливает работу второго секундомера.
  • При четвертом нажатии происходит сброс показаний всех секундомеров.

Отсчет времени секундомера выполняется при помощи функции millis(). Функция возвращает время в мс, с момента запуска текущей программы. Время считается в параллельном процессе и не зависит от алгоритмов выполнения программы, остановок, в том числе и функцией delay(), и т.п. Точность отсчета времени функцией millis() определяется точностью и стабильностью частоты кварцевого резонатора платы Arduino.

Соберите схему показанную на рисунке:

Загрузите в микроконтроллер следующий скетч:

Обновлено: 15.01.2022 в 12:36 | Просмотров: 17 526

Осциллограф на Arduino (LCD TFT 2.4″)
На базе Arduino UNO или NANO можно сделать простой осциллограф с минимальными функциями. В осциллографе применен дисплей LCD TFT 2,4 (SPFD5408). Максимальная частота сигнала которую можно фиксировать осциллографом 20000 Гц. Длительной развертки осциллографа можно менять от 0,1 до 20 мс. Максимальное напряжение подаваемое на вход осциллографа 5 В. Разрешение дисплея 320х240 точек. Осциллограф имеет четыре режима работы: Основной режим (доступен после включения осциллографа) — в основном.

FM приемник на TEA5767 (Arduino)
ИМС TEA5767 производимая компанией NXP применяется для конструирования низковольтных FM-радио тюнеров. В составеTEA5767 имеются внутренние цепи выделения промежуточной частоты и демодуляции принимаемого сигнала, что позволяет обходиться минимальным набором внешних компонентов. Технические параметры TEA5767: Напряжение питания от 2,5 до 5 В Потребляемый ток при Uпит = 5 В 12,8 мА Чувствительность 2 мкВ Отношение сигнал/шум 54 дБ Разделение между стереоканалами 24 дБ .

Радио на TEA5767 + PT2257 (Arduino)
Используя готовый радио модуль на ИМС TEA5767 и электронный регулятор громкости на ИМС PT2257 на базе Arduino Nano можно сделать простое радио, но функционально FM-радио. Индикаторы уровня громкости и уровня сигнала, частота выбранного канала выводится на дисплей LCD1602 на базе контроллера HD44780. Управление FM — радио осуществляется при помощи 4-х кнопок: Канал + Канал — Громкость + Громкость — Технические параметры радио модуля TEA5767 (описание): Напряжение.

Темброблок на TDA8425 (Arduino)
ИМС TDA8425 представляет собой двухканальный (стереофонический) регулятор громкости и тембра с микропроцессорным управлением. Технические характеристики: Производитель: Philips Напряжение питания минимальное 7 В Напряжение питания максимальное 13,2 В Частотный диапазон 35. 20000 Гц Коэффициент гармоник 0,05% Выходное напряжение максимальное 1 В Регулировка громкости 48 уровней от -88 дБ до +6 дБ с шагом 2 дБ Регулировка тембра НЧ от -12 дБ до +15 дБ с шагом 3 дБ .

LCD1602_I2C Atmega8 (Arduino IDE)
Микроконтроллер Atmega8, может стать отличной заменой сильно подорожавших плат Arduino Nano. Большое кол-во проектов создаваемых на платах Arduino Nano часто используют небольшое объем памяти и применять Arduino Nano в данных проектах нецелесообразно. В Atmega8 имеет 8 кБ программируемой Flash памяти, 1кБ SRAM памяти и 512 байта EEPROM. Микроконтроллер Atmega8 поддерживается средой программирования Arduino IDE, так же большинство библиотек совместимы с этими контроллерами. На этой.

Источник

Простой секундомер — таймер на Arduino Uno

В этой статье описан простой секундомер/таймер на базе недорогой платы Arduino Uno. таймер можно использовать для измерения промежутков времени при разработке таких устройств, как реле времени, автоматические выключатели и т.д. Кроме того, этот таймер можно использовать для лабораторных / промышленных целей. Таймер измеряет промежуток времени между нажатием кнопки SART и нажатием кнопки STOP. «Нажимать» кнопки может и какое-либо внешнее устройство, если использовать контакты реле или MOSFET ключей, подключенных к соответствующим к выводам кнопок. Должны быть использованы только «беспотенциальные» переключатели или ключи (на их выводах не должно присутствовать дополнительное напряжение)

Схема устройства

Принципиальная схема показана на рис. 1, помимо платы Arduino Uno вам потребуется несколько дополнительных компонентов. Запуск и остановка таймера осуществляется двумя кнопками. Кнопки могут быть нормально-разомкнутыми или нормально-замкнутыми.

Перед измерением времени нажмите кнопку RESET. На дисплее появится сообщение «Timing test kit» в первой строке и «Time(s): 0.000» во второй.

Теперь нажмите кнопку START, чтобы начать отсчет. Подсчитанное значение будет отображаться на дисплее. Вы можете остановить счет в любой момент, нажав кнопку STOP. Время счета отображается в секундах с левой стороны и в долях секунд (в миллисекундах) с правой стороны дисплея.

Если вы хотите управлять таймером от внешнего устройства, то целесообразно использовать разъемы, подключенные к контактам кнопок START и STOP. Устройство можно поместить в подходящего размера коробку-корпус. На переднюю панель нужно вывести дисплей и три кнопки.

Устройство тестировалось на «беспаечной» макетной плате типа breadboard.

ниже приводится текст «прошивки» устройства (скетч Arduino):

Если у вас пока что нет платы Arduino Uno или вам лень возиться с железом, вы можете проверить работу проекта в симуляторе Proteus 8 (проект для Proteus вы можете скачать по ссылке в конце статьи).

Если у вас пока что нет платы Arduino Uno или вам лень возиться с железом, вы можете проверить работу проекта в симуляторе Proteus 8 (проект для Proteus вы можете скачать по ссылке в конце статьи).

Здесь вы можете посмотреть короткое видео, демонстрирующее симуляцию проекта в Proteus 8 professional:

В архиве файл прошивки (скетч) для Arduino, и проект для симуляции в Proteus 8. В папке Proteus вы также найдете откомпилированный *.hex файл прошивки для использования в Proteus.

Модель Arduino UNO для Proteus можно скачать на этой странице…
(в проекте использована вторя по тексту страницы модель Arduino Uno — Arduino Uno Library AtMega328 )

Источник

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

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

Урок 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() в начале и конце интервала, а затем вычислить разность. Но нам необходимо накопление времени, поэтому алгоритм несколько усложняется.

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

Источник

Adblock
detector