Шановні друзі!
31 грудня магазин працюватиме до 16 години. 1 та 2 січня магазин працювати не буде.
Вітаємо всіх з Різдвом та Новим Роком!
Мобільна версія Форум Arduino Документація Гарантійні умови 0 0
UA RU
Графік роботи магазину:
Пн-Пт: 8.00 - 19.00
Сб: 10.00 - 17.00
Нд: вихідний
Каталог
Напиши статтю і отримай знижку!

Фитнес-трекер для хомяка v1.0

2020-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 м в минуту!!! Таким образом можно отслеживать спортивные показатели и размышлять над здоровьем питомца.

 

Ссылки:

Видео:

Ваша оцінка статті:

Відмінно
Добре
Задовільно
Погано
Дуже погано

Дякуємо Вам за звернення! Ваш відгук з'явиться після модерації адміністратором.
Поки немає відгуків на цю статтю.
оплата картами Visa і MasterCard