Каталог
|
Фитнес-трекер для хомяка v1.02020-07-06 Все статьи →Наверняка многие, кто имеют хомяка, знают: что питомцу необходимо беговое колесо, чтобы держать себя в хорошей форме. Меня всегда интересовало: а сколько же он пробегает за ночь? Поэтому было принято решение – сделать фитнес-трекер для хомяка. Для его создания нам понадобится: 1. Плата Arduino Uno: https://arduino.ua/prod2610-arduino-uno-r3-ch340
2. LCD Keypad Shield: https://arduino.ua/prod235-lcd-keypad-shield
3. Датчик Холла цифровой. У меня как на первой картинке, но тот что с подстроечным резистором еще лучше. Можно будет настроить порог срабатывания по своему вкусу. https://arduino.ua/prod3638-modyl-datchika-holla-a3144-cifrovoi https://arduino.ua/prod1210-modyl-datchika-holla-a3144
Сборка устройстваПлата Arduino Uno и LCD Keypad Shield созданы друг для друга , поэтому соединяются в слоеный пирог.
В отверстия под нераспаянные коннекторы на плате LCD Keypad Shield впаиваем коннекторы. https://arduino.ua/prod332-Konnektor_40_pin_papa Подключаем датчик Холла. Питание +5В, Земля или GND, а цифровой выход подключаем к цифровому пину 2 платы Arduino Uno.
Вот собственно и все подключение. На колесо хомяка нужно будет приклеить 1 или 2 магнита. Я клеил прямоугольные неодимовые 5х10х25 мм. Для балансировки колеса желательно клеить 2 магнита симметрично. https://arduino.ua/prod959-neodimovii-magnit-20x10h4
Датчик Холла нужно разместить поближе к магнитам. Закрепить можно термоклеем. А если клетка из прутьев, то с помощью скрепки или винта с гайкой.
Настройка программыВ файле Hamster_Fitness_Tracker_LCD_61.ino нужно указать ваши данные: const unsigned int NUMBER_MAGNETS = 2; // количество магнитов на колесе const unsigned int SCALE_KOEF_HALL = 2; // коэффициент датчика холла (сколько тиков за один проход магнита) const float DIAM_WHEEL = 130*0.001; // diam wheel in metres , диаметр колеса в метрах Прокомментирую лишь коэффициент датчика холла. Как оказалось, при прохождении магнита через датчик Холла, генерировалось два тика. Вы это легко проверите экспериментально, когда соберете действующую модель.
Функционал программыКлавиши: Select - pause, остановить выбранный экран Left - ON/OFF подсветку LCD экрана UP - Load Data Down - Next Screen Right - Save Data 1. Переход на следующий день. Нажать во время автозагрузки, после рестарта (надпись data loaded) клавишу NextScreen (down). Эта функция нужна т.к. в устройстве нет часов реального времени. И если вы, например, отключите его, чтобы убрать у хомяка, то после включения устройство начнет тот же день и новый отсчет 24 часов. Поэтому можно перевести на новый день вручную. 2. Стереть все данные. Нажимать клавишу Load Data указанное в COUNT_TO_ERASE_DATA количество раз, в течение времени указанного в TIME_TO_ERASE_DATA. До появления надписи Data Erased.
Единицы измерения, units: Скорость - Speed - в метрах в минуту Расстояние - Dist - Distation - в км Обороты - rpm - в оборотах в минуту
Суффиксы: Td - Today, Сегодня Yd - Yesterday, Вчера Al - All Time, За всё время
Сокращения, reductions: DayNumber - Текущий день RotALL - Rotate Wheel Counter for All Time - количество оборотов колеса за все время RotMax - Rotate Wheel Maximum Counter per day - максимальное количество оборотов колеса за один день(рекорд) RtT, Rot - Rotate Wheel Today - количество оборотов колеса за текущий день RtY - Rotate Wheel Yesterday - количество оборотов колеса за вчерашний день Dist - Distation - расстояние Dist Today, DstTd, Dst - Distation Today - пройденное расстояние за текущий день DistYd - Distation Yesterday - пройденное расстояние за вчерашний день DstAll - Distation All Time - пройденное расстояние за все время DstMax - Distation Maximum per day - максимальное расстояние пройденное за один день (рекорд) SpdNow, Sp - Speed Now - мгновенная скорость в метрах в минуту SpdMaxTd - Speed Max Day - максимальная скорость за текущий день SpdMaxYd - Speed Max Yesterday - максимальная скорость за вчерашний день SpdMaxAll - Speed Max All Time - максимальная скорость за все время rpm Now, rpm - Rotate Per Minite Now - мгновенная скорость в оборотах в минуту Tk - Ticks Hall Sensor - количество тиков датчика Холла TkAl -Ticks Hall Sensor All Time - количество тиков датчика Холла за все время TkTd -Ticks Hall Sensor Today - количество тиков датчика Холла за текущий день
ВнутренностиВначале, я начал делать проект процедурным методом. Но потом сам начал путаться, что из чего вызывается. Стало ясно, что нужно делать класс, отвечающий за хранение и вывод информации. Класс называется LCDScreen. У класса есть методы, описанные в LCDScreen.h Данные статистики тренировок хомяка хранятся в виде структуры: typedef struct T_data { float distance_alltime = 0; float distance_max_alltime = 0; float distance_today = 0; float distance_yesterday = 0; unsigned long speed_current = 0; unsigned long speed_max_today = 0; unsigned long speed_max_yesterday = 0; unsigned long speed_max_alltime = 0; unsigned long rpm = 0; unsigned long rotate_today = 0; unsigned long rotate_yesterday = 0; unsigned long rotate_alltime = 0; unsigned long rotate_max_alltime = 0; unsigned long day_number = 0; unsigned long tickRotateWheelCounter_alltime = 0; unsigned long tickRotateWheelCounter_today = 0; }; // struct
Сохранение данных вынесено в отдельный файл EEPROM_SL.ino. Когда данные находятся в виде структуры, то сохранение в EEPROM выглядит очень компактно. Например, сохранение: #define EEPROM_ADRESS 100 // адрес в энергонезависимой памяти, куда сохраняются данные EEPROM.put (address, lcd.data); // Записать значение в ячейку с адресом address Чтение: EEPROM.get (address, lcd.data); // Прочитать значение по адресу address
Анализ нажатия клавиш находится в файле Key_press.ino. Происходит при помощи функции keyPressed, которая реализована как для аналоговых пинов, так и для цифровых и сенсорных панелей: // разновидность функции для опроса аналоговых пинов int keyPressed (const byte AnalogPin, const int PinNumber) { // возращает: значение аналогового пина, если прошло заданное время с прошлого нажатия // разновидность функции для опроса цифровых пинов и сенсорной панели bool keyPressed (const byte Sensor_Pin, const byte Key, const bool Stat = LOW) { // возращает: true - клавиша/пин нажат/сигнал и выдержан период антиповтора
Обработчик нажатия клавиш находится в файле Key_Analog_Press_Switch.ino. Основная логика находится в Hamster_Fitness_Tracker_LCD_61.ino. Обработку сигналов от датчика Холла ведем по прерыванию, чтобы ничего не пропустить, в Setup подключаем его: //interrupt zero (0) is on pin two(2) attachInterrupt (0, rpm_fan, RISING); // CHANGE FALLING RISING LOW
Делаем максимально компактную функцию обработчик прерывания: void rpm_fan() { /* this code will be executed every time the interrupt 0 (pin2) gets low. */ tickRotateWheelCounter++; } // rpm_fan
Переменную обязательно объявляем как volatile, чтобы она всегда вызывалась из ОЗУ, иначе будут проблемы, т.к. у нас она изменяется по прерыванию. volatile unsigned long tickRotateWheelCounter = 0; // счетчик тиков вращения колеса от датчика Холла, висит на прерывании. Расчеты выполняются по таймеру реализованному на millis, по умолчанию, раз в 2 секунды. Задается константой TIME_PERIOD_CALC. const unsigned long CurrentTime = millis(); static unsigned long lastmillis_TIME_PERIOD_CALC; if (((unsigned long)(CurrentTime - lastmillis_TIME_PERIOD_CALC)) > TIME_PERIOD_CALC) { // время делать расчеты // наш код lastmillis_TIME_PERIOD_CALC = CurrentTime; } // if TIME_PERIOD_CALC
На таймерах подобной конструкции реализованы и все остальные функции. Обновление LCD экрана, по умолчанию, происходит также раз в 2 секунды. Задается константой TIME_LCD_UPDATE. Среда разработки Arduino IDE 1.8.12.
ВыводыОказалось, что хомяк, у меня, например, маленькой - джунгарской породы, бегает от 1 до 2 км за ночь, и совершает по 2-3 тысячи оборотов колеса, развивая при этом скорость до 80 м в минуту!!! Таким образом можно отслеживать спортивные показатели и размышлять над здоровьем питомца.
Ссылки: Видео:
Благодарим Вас за обращение! Ваш отзыв появится после модерации администратором.
Пока нет отзывов на эту статью.
|