Оглавление:

Как сделать счетчик шагов ?: 3 шага (с картинками)
Как сделать счетчик шагов ?: 3 шага (с картинками)

Видео: Как сделать счетчик шагов ?: 3 шага (с картинками)

Видео: Как сделать счетчик шагов ?: 3 шага (с картинками)
Видео: Как смартфон считает шаги и верны ли данные 2024, Июнь
Anonim
Image
Image
Создать проект Blynk
Создать проект Blynk

Я хорошо выступал во многих видах спорта: ходьба, бег, езда на велосипеде, игра в бадминтон и т. Д.

Я люблю кататься, чтобы быстро путешествовать. Что ж, посмотри на мой толстый живот …

Ну, в любом случае, решаю перезапустить тренировку. Какое оборудование мне подготовить? Да, помимо спортивного сооружения! Мне нужен инструмент! Я верю, что с его помощью я смогу поддерживать необходимое количество упражнений. Вот и рождается инструмент. Начнем с видео ~

Инструмент может не только записывать шаги (и калории) в реальном времени, но и показывать время. Что особенного, так это то, что формат отображения - указатель ~ так здорово! Мне это очень, очень нравится!

Вы можете загружать свои записи в Интернет

только одним щелчком мыши. Все записи могут отображаться с помощью Blynk (программное обеспечение для смартфонов, представленное ранее). Так же, как и носимые смарт-часы, прибор получает время в сети (поэтому вам не нужно бояться обновления мощности и времени).

Оборудование в мид:

Доска FireBeetle-ESP32

Обложки FireBeetle-Proto Board

Экран дисплея OLED12864

Модуль ускорения

Аккумулятор 3,7 В (покупается в Интернете, объем около 600 мАч)

3 бутылки (покупаются в Интернете)

Строить этот проект Blybk очень удобно.

Шаг 1. Создайте проект Blynk

Добавьте два элемента управления:

Отображение значений * 1

Часы реального времени * 1

Имя параметра «Отображение значений» должно быть указано в виде шагов, но не должно указываться в свойствах часов реального времени. Выберите V1 в качестве входного контакта, чтобы настроить расположение элементов управления, как показано ниже.

Шаг 2: Загрузите программы на FireBeetle Board-ESP32

Щелкните здесь, чтобы загрузить исходный код на esp32. Исходный код состоит из файлов библиотеки и файлов 3D-печати. Вы должны сохранить файл библиотеки в lib arduino. А из 3D-файлов можно напрямую печатать корки.

Ниже основная программа

#include #include // Требуется только для Arduino 1.6.5 и более ранних версий #include "SSD1306.h" // псевдоним для `#include" SSD1306Wire.h "` #include "OLEDDisplayUi.h" #include "images.h" # include #include #include #include #include #define POWER_KEY 1 #define MENU_KEY 2 #define UPLOAD_KEY 3 boolean upload = false; Дисплей SSD1306 (0x3c, 18, 0); OLEDDisplayUi ui (& дисплей); Таймер SimpleTimer; WidgetRTC rtc; int screenW = 128; int screenH = 64; int clockCenterX = screenW / 2; int clockCenterY = ((экранH-16) / 2) +16; // верхняя желтая часть имеет высоту 16 пикселей int clockRadius = 23; #define DEVICE (0x53) // адрес устройства ADXL345 #define TO_READ (6) // количество байтов, которое мы будем читать каждый раз (два байта для каждой оси) byte buff [TO_READ]; // 6-байтовый буфер для сохранения данных, считанных с устройства char str [100]; // строковый буфер для преобразования данных перед их отправкой в последовательный порт int regAddress = 0x32; // первый регистр данных ускорения оси на ADXL345 int xx, yy, zz; // данные трехосного ускорения static int currentValue = 0; статические длинные шаги без знакаSum = 0; char auth = "YourAuthToken"; // Ваши учетные данные WiFi. // Установите пароль на "" для открытых сетей. char ssid = "YourNetworkName"; char pass = "Ваш пароль"; const char running_Logo_bits PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x03, 0x00, 0x 0xF8, 0x01, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x00, 0x00, 0xFC, 0x05, 0x00, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x00, 0x00 0xFC, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x60, 0xF1, 0x07, 0x00, 0x 0xF8, 0x17, 0x00, 0x00, 0xC0, 0xF8, 0x0F, 0x00, 0x00, 0xE0, 0xFB, 0x17, 0x00, 0x00, 0xC0, 0xFF, 0x13, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x03 0xFE, 0x03, 0x00, 0x00, 0x00, 0xF9, 0x03, 0x00, 0x00, 0x00, 0xFA, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0xF0, 0x00x07, 0x00x07 0xF4, 0x07, 0x00, 0x00, 0x00, 0xF4, 0x0F, 0x00, 0x00, 0x00, 0xF9, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x80, 0xFE, 0x00, 0x1F, 0xFF, 0x1F, 0x00, 0x00, 0xA0, 0xFF, 0x5F, 0x00, 0x00, 0xC0, 0x3F, 0x3F, 0x00, 0x0 0, 0xE8, 0x1F, 0x3F, 0x00, 0x00, 0xE8, 0xA7, 0x3E, 0x00, 0x00, 0xF0, 0x03, 0x7C, 0x00, 0x00, 0xE0, 0x05, 0x7C, 0x00, 0x00, 0x0x01, 0xE0 0x00, 0xC0, 0x01, 0xF0, 0x03, 0x00, 0xC0, 0x03, 0xE8, 0x07, 0x00, 0xC0, 0x03, 0x88, 0x6F, 0x00, 0x80, 0x03, 0x40, 0x1E3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 0x00, 0x80, 0x03, 0x00, 0xF8, 0x01, 0x00, 0x07, 0x00, 0xF4, 0x00, 0x00, 0x07, 0x00, 0xE8, 0x00, 0x80, 0x0F, 0x00, 0xE8, 0x00, 0x0F, 0x0F, 0x0F 0x00, 0xE8, 0x0F, 0x00, 0xE8, 0x00, 0xF0, 0x09, 0x00, 0x60, 0x01, 0xF0, 0x04, 0x00, 0x00, 0x00,}; // служебная функция для отображения цифровых часов: печатает в начале 0 String twoDigits (int digits) {if (digits <10) {String i = '0' + String (digits); вернуть я; } else {return String (цифры); }} void clockOverlay (OLEDDisplay * display, OLEDDisplayUiState * state) {if ((hour () == 0) && (minute () == 0) && (second () == 0)) stepsSum = 0; } void analogClockFrame (OLEDDisplay * дисплей, OLEDDisplayUiState * состояние, int16_t x, int16_t y) {display-> drawCircle (clockCenterX + x, clockCenterY + y, 2); // часовые тики для (int z = 0; z drawLine (x2 + x, y2 + y, x3 + x, y3 + y);} // отображение секундной стрелки float angle = second () * 6; angle = (angle / 57.29577951); // Преобразование градусов в радианы int x3 = (clockCenterX + (sin (angle) * (clockRadius - (clockRadius / 5)))); int y3 = (clockCenterY - (cos (angle) * (clockRadius - (clockRadius / 5)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // отображение минутной стрелки angle = minute () * 6; angle = (angle / 57.29577951); // Преобразуем градусы в радианы x3 = (clockCenterX + (sin (angle) * (clockRadius - (clockRadius / 4)))); y3 = (clockCenterY - (cos (angle) * (clockRadius - (clockRadius / 4)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // отображение угла часовой стрелки = hour () * 30 + int ((minute () / 12) * 6); angle = (angle / 57.29577951); // Преобразование градусов в радианы x3 = (clockCenterX + (sin (angle) * (clockRadius - (clockRadius / 2)))); y3 = (clockCenterY - (cos (angle) * (clockRadius - (clockRa диус / 2)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); } void digitalClockFrame (OLEDDisplay * display, OLEDDisplayUiState * state, int16_t x, int16_t y) {String date = String (year ()) + "/" + twoDigits (month ()) + "/" + twoDigits (day ()); Строка timenow = Строка (час ()) + ":" + две цифры (минута ()) + ":" + две цифры (секунда ()); дисплей-> setTextAlignment (TEXT_ALIGN_CENTER); display-> setFont (ArialMT_Plain_24); дисплей-> drawString (clockCenterX + x, 20, timenow); дисплей-> setFont (ArialMT_Plain_16); display-> drawString (60, 45, дата); } void writeTo (int устройство, адрес байта, значение байта) {Wire.beginTransmission (устройство); // начать передачу на устройство Wire.write (адрес); // отправляем адрес регистра Wire.write (val); // отправляем значение в запись Wire.endTransmission (); // завершение передачи} // считывает количество байтов, начиная с регистра адреса на устройстве, в массив буферов void readFrom (int device, byte address, int num, byte buff ) {Wire.beginTransmission (device); // начать передачу на устройство Wire.write (адрес); // отправляет адрес для чтения из Wire.endTransmission (); // завершаем передачу Wire.beginTransmission (device); // начать передачу на устройство Wire.requestFrom (device, num); // запрашиваем 6 байт с устройства int i = 0; while (Wire.available ()) // устройство может отправить меньше запрошенного (ненормально) {buff = Wire.read (); // получаем байт i ++; } Wire.endTransmission (); // завершение передачи} void runningFrame (OLEDDisplay * display, OLEDDisplayUiState * state, int16_t x, int16_t y) {float calValue = stepsSum * 0.4487; дисплей-> setTextAlignment (TEXT_ALIGN_CENTER); дисплей-> setFont (ArialMT_Plain_24); display-> drawString (clockCenterX, clockCenterY, str); sprintf (str, "%.2fcal", calValue); дисплей-> setTextAlignment (TEXT_ALIGN_CENTER); дисплей-> setFont (ArialMT_Plain_10); display-> drawString (100, 20, str); display-> drawXbm (10, 14, 34, 50, running_Logo_bits); } void uploadFrame (OLEDDisplay * дисплей, OLEDDisplayUiState * состояние, int16_t x, int16_t y) {display-> setFont (ArialMT_Plain_16); display-> drawString (60, 45, «загрузить данные…»); } // В этом массиве хранятся указатели функций на все кадры // кадры - это отдельные представления, которые скользят в FrameCallback frames = {analogClockFrame, digitalClockFrame, runningFrame, uploadFrame}; // сколько там кадров? int frameCount = 4; // Наложения статически рисуются поверх кадра, например. оверлеи OverlayCallback с часами = {clockOverlay}; int overlaysCount = 1; void uploadToBlynk (void) {if (upload == true) {Blynk.virtualWrite (V0, stepsSum); Blynk.virtualWrite (V1, stepsSum); }} void uiInit (void) {ui.setTargetFPS (30); //ui.setActiveSymbol(activeSymbol); //ui.setInactiveSymbol(inactiveSymbol); ui.setIndicatorPosition (TOP); ui.setIndicatorDirection (LEFT_RIGHT); ui.setFrameAnimation (SLIDE_LEFT); ui.setFrames (кадры, frameCount); ui.setOverlays (оверлеи, overlaysCount); ui.disableAutoTransition (); ui.switchToFrame (2); ui.init (); display.flipScreenVertical (); } void adxl345Init (void) {writeTo (УСТРОЙСТВО, 0x2D, 0); writeTo (УСТРОЙСТВО, 0x2D, 16); writeTo (УСТРОЙСТВО, 0x2D, 8); } void updateAdxl345 (void) {readFrom (УСТРОЙСТВО, regAddress, TO_READ, бафф); // считываем данные ускорения из ADXL345 xx = (((int) buff [1]) << 8) | бафф [0]; yy = (((int) buff [3]) << 8) | бафф [2]; zz = (((int) buff [5]) << 8) | бафф [4]; если (хх 80) {если (хх <текущее значение) {шагиСумма ++; } currentValue = xx; } sprintf (str, "% d", stepsSum); } int getKeys (void) {если (digitalRead (D2) == LOW) {задержка (5); если (digitalRead (D2) == LOW) {while (digitalRead (D2) == LOW); вернуть POWER_KEY; }} если (digitalRead (D3) == LOW) {задержка (5); если (digitalRead (D3) == LOW) {while (digitalRead (D3) == LOW); вернуть MENU_KEY; }} если (digitalRead (D4) == LOW) {задержка (5); если (digitalRead (D4) == LOW) {while (digitalRead (D4) == LOW); вернуть UPLOAD_KEY; }} return 0; } void doKeysFunction (void) {static int uiFrameIndex = 2; int keys = getKeys (); если (ключи == POWER_KEY) {статический символ я = 0; если (i) {ui.init (); display.flipScreenVertical (); display.displayOn (); } еще {display.displayOff (); } я = ~ я; } if (keys == MENU_KEY) {if (upload == false) {uiFrameIndex ++; если (uiFrameIndex == 3) uiFrameIndex = 0; ui.switchToFrame (uiFrameIndex); } еще {ui.switchToFrame (3); }} if (keys == UPLOAD_KEY) {if (upload == true) {upload = false; ui.switchToFrame (uiFrameIndex); } else {upload = true; ui.switchToFrame (3); }}} void setup () {pinMode (D2, INPUT); pinMode (D3, ВХОД); pinMode (D4, ВХОД); Blynk.begin (auth, ssid, pass); rtc.begin (); uiInit (); adxl345Init (); timer.setInterval (30, updateAdxl345); timer.setInterval (100, uploadToBlynk); } void loop () {int ОстающийсяTimeBudget = ui.update (); статический int testSum = 0; if ((testSum 0) {delay (ОстающийсяБюджет времени);} doKeysFunction (); timer.run ();}

Внимание: вы должны изменить настройки Wi-Fi, паспорт и AUTHTOKENS для себя.

char auth = "YourAuthToken"; // Ваши учетные данные WiFi. // Установите пароль на "" для открытых сетей. char ssid = "YourNetworkName"; char pass = "Ваш пароль";

Шаг 3: Подключение оборудования

Подключение оборудования
Подключение оборудования
Подключение оборудования
Подключение оборудования
Подключение оборудования
Подключение оборудования

Подключите OLED12864 и модуль ускорения к I2C, низы к D2, D3, D4. Кроме того, добавьте подтягивающие резисторы 51 кОм к нижнему краю, чтобы достичь напряжения 3,3 В, как показано ниже.

Внимание: подтягивающие резисторы неправильно подключать к AREF, правильнее - к 3,3 В.

Изображение аппаратной пайки, показанное ниже:

После пайки, сборка аппаратного модуля до корки, как показано ниже:

Комплексное изображение эффекта ~

Рекомендуемые: