Введение
Итак, функционал должен быть максимально простой:
- не должен требовать никаких настроек от пользователя
- подсчет количества подтягиваний: за день (каждый день в 0:00 сбрасывается) и общее за все время
- подсветка экрана выключена и включается, когда подходишь к турнику
- отображения даты и времени
- при выключении электричества после его включения время и счетчики должны восстанавливаться
Используемые компоненты:
- arduino nano
- модуль часов реального времени DS1307
- ультразвуковой датчик расстояния HC-SR04
- экран LCD 1602 с I2C драйвером
- спикер
На все компоненты оставил ссылки справа от статьи.
Корпус печатается на 3D-принтере либо изготавливается из любой подходящей по размерам коробки.
Сборка
Соединяем все по схеме. Питание: 7-16В, либо можно питать от usb разъема Arduino - как удобнее.
Да, и 4 кнопки на схеме - их можно не подключать, если не хотите расширять функционал. У меня была идея сделать возможность настройки разных параметров (дальше по коду будет видно, каких), но по сути повесил устройство, 1 раз настроил - и все, поэтому я отказался от этого, но кнопки все равно оставил на случай, если придет в голову что-то улучшить.
Первоначально я собрал стенд и протестировал функционал на нем, и только добившись хорошего результата, спроектировал и напечатал корпус.
Корпус
Корпус спроектировал в программе Fusion360. Сначала создал с ней объекты всех модулей с точными размерами, после чего расположил их и создал корпус.
Распечатал:
И собрал все компоненты:
Крышку спроектировал с креплением под 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 см над перекладиной).