Arduino

и не только...

Instagram TikTok VK

Счетчик подтягиваний

Введение

Итак, функционал должен быть максимально простой:

  • не должен требовать никаких настроек от пользователя
  • подсчет количества подтягиваний: за день (каждый день в 0:00 сбрасывается) и общее за все время
  • подсветка экрана выключена и включается, когда подходишь к турнику
  • отображения даты и времени
  • при выключении электричества после его включения время и счетчики должны восстанавливаться

Используемые компоненты:

  • arduino nano
  • модуль часов реального времени DS1307
  • ультразвуковой датчик расстояния HC-SR04
  • экран LCD 1602 с I2C драйвером
  • спикер

На все компоненты оставил ссылки справа от статьи.

Корпус печатается на 3D-принтере либо изготавливается из любой подходящей по размерам коробки.

Сборка

Schema

Соединяем все по схеме. Питание: 7-16В, либо можно питать от usb разъема Arduino - как удобнее.

Да, и 4 кнопки на схеме - их можно не подключать, если не хотите расширять функционал. У меня была идея сделать возможность настройки разных параметров (дальше по коду будет видно, каких), но по сути повесил устройство, 1 раз настроил - и все, поэтому я отказался от этого, но кнопки все равно оставил на случай, если придет в голову что-то улучшить.

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

Debug stand

Корпус

Fusion 360

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

Распечатал:

3d printing

И собрал все компоненты:

Pull ups counter - back Pull ups counter - front

Крышку спроектировал с креплением под 30 градусов, так как турник висит на мансарде.

Прикладываю файлы для печати.

Прошивка

Прошивка доступна на github.

В файле src/hardware/Config.h содержатся настройки, основное, что может понадобится изменить для корректной работы: EMPTY_DISTANCE - дистанция в сантиметрах, при которой включается подсветка и LIFTING_DISTANCE - дистанция в сантиметрах, при обнаружении объекта на которой и ближе будет увеличен счетчик.

Еще возможно потребуется исправить LCD_ADDR, если адрес вашего экранного модуля отличается.

Логика работы: при обнаружении объекта в зоне LIFTING_DISTANCE и ближе в течении некоторого короткого времени инкрементируется счетчик. Далее алгоритм ждет, пока объект исчезнет. Обнаружение фиксируется несколько раз, так как иначе будут ложные срабатывание - с этим модулем такое бывает.

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

При первом запуске нужно будет установить текущее время, для этого добавить в файл main.ino например со строки 61 блок кода:

tmElements_t tm;

tm.Year = 52;
tm.Month = 2;
tm.Day = 15;
tm.Hour = 16;
tm.Minute = 46;

RTC.write(tm);

заменив в нем значения на текущую дату. В год записывается разница текущего года и 1970 (для 2022 это 52).

Далее - прошить Arduino, запустить, удалить блок кода из программы и снова прошить.

Установка

Модуль должен висеть выше перекладины, примерно по середине вашей головы, когда вы подтянулись и находитесь в верхней точке (примерно 10 см над перекладиной).

Work