Съдържание:

Как да направите брояч на стъпки?: 3 стъпки (със снимки)
Как да направите брояч на стъпки?: 3 стъпки (със снимки)

Видео: Как да направите брояч на стъпки?: 3 стъпки (със снимки)

Видео: Как да направите брояч на стъпки?: 3 стъпки (със снимки)
Видео: ТОП 3 ПРОГРАМИ ЗА ОБРАБОТКА НА СНИМКИ 2024, Септември
Anonim
Image
Image
Създайте Blynk проект
Създайте Blynk проект

Представях се добре в много спортове: ходене, бягане, каране на колело, игра на бадминтон и др.

Обичам да яздя, за да пътувам преди малко. Ами виж дебелото ми коремче …….

Е, все пак решавам да рестартирам, за да тренирам. Какво оборудване трябва да подготвя? Освен спортно съоръжение, да! Имам нужда от инструмент! Вярвам, че с него мога да поддържам подходящо количество упражнения. Тук инструментът възниква. Нека започнем с видео ~

Инструментът не само може да записва стъпки (и калории) в реално време, но и да показва време. Особеното е, че форматът на показване е показалец ~ толкова готин! Наистина, много ми харесва!

Можете да качите вашите записи в Интернет

само с едно щракване. Всички записи могат да бъдат показани от Blynk (софтуер за смарт телефон, представен по-рано). Подобно на носения интелигентен часовник, инструментът получава време на линия (така че не е нужно да се страхувате от мощността и времето за актуализиране).

Хардуер в Meed:

FireBeetle Board-ESP32

FireBeetle обхваща-Proto Board

OLED12864 дисплей дисплей

Модул за ускорение

3.7V батерия (закупена онлайн, обемът е около 600mAH)

3 бутона (закупени онлайн)

Много е удобно да се изгради този проект от Blybk.

Стъпка 1: Създайте Blynk проект

Добавете две контроли:

Показване на стойност * 1

Часовник в реално време * 1

Името на Value Display трябва да бъде зададено на стъпки, но без настройка за свойствата на часовника в реално време. Изберете 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 логическо качване = false; SSD1306 дисплей (0x3c, 18, 0); OLEDDisplayUi ui (& дисплей); Таймер SimpleTimer; WidgetRTC rtc; int екранW = 128; int екранH = 64; int clockCenterX = screenW/2; int clockCenterY = ((screenH-16)/2) +16; // горната жълта част е 16 px височина int clockRadius = 23; #define DEVICE (0x53) // ADXL345 адрес на устройството #define TO_READ (6) // брой байтове, които ще четем всеки път (два байта за всяка ос) байтов буф [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, 0x00 0xF8, 0x01, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x00, 0x00, 0xFC, 0x05, 0x00, 0x00, 0x00, 0xFC, 0x01, 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, 0x00, 0x60 0xF8, 0x17, 0x00, 0x00, 0xC0, 0xF8, 0x0F, 0x00, 0x00, 0xE0, 0xFB, 0x17, 0x00, 0x00, 0xC0, 0xFF, 0x13, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0xFF, 0x03, 0xFE, 0x03, 0x00, 0x00, 0x00, 0xF9, 0x03, 0x00, 0x00, 0x00, 0xFA, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0xF0, 0x07, 0x00 0xF4, 0x07, 0x00, 0x00, 0x00, 0xF4, 0x0F, 0x00, 0x00, 0x00, 0xF9, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x80, 0xFE, 0x1F, 0x1, 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, 0xE0, 0x00, 0x00, 0xE0, 0x00, 0xC0, 0x01, 0xF0, 0x03, 0x00, 0xC0, 0x03, 0xE8, 0x07, 0x00, 0xC0, 0x03, 0x88, 0x6F, 0x00, 0x80, 0x03, 0x40, 0x1E, 0x00, 0xA0, 0xA0 0x00, 0x80, 0x03, 0x00, 0xF8, 0x01, 0x00, 0x07, 0x00, 0xF4, 0x00, 0x00, 0x07, 0x00, 0xE8, 0x00, 0x80, 0x0F, 0x00, 0xE8, 0x00, 0x90, 0x0, 0x00, 0x00, 0x00 0x00, 0xE8, 0x0F, 0x00, 0xE8, 0x00, 0xF0, 0x09, 0x00, 0x60, 0x01, 0xF0, 0x04, 0x00, 0x00, 0x00,}; // помощна функция за показване на цифров часовник: отпечатва водещи 0 String twoDigits (int цифри) {if (цифри <10) {String i = '0'+String (цифри); връщам i; } else {връщане на низ (цифри); }} void clockOverlay (OLEDDisplay * дисплей, OLEDDisplayUiState * състояние) {if ((час () == 0) && (минута () == 0) && (втора () == 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 ъгъл = секунда () * 6; ъгъл = (ъгъл / 57.29577951); // Конвертиране на градуси в радиани int x3 = (clockCenterX + (sin (ъгъл) * (clockRadius - (clockRadius / 5))))); int y3 = (clockCenterY - (cos (ъгъл) * * (clockRadius - - clockRadius / 5)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // показване на минута стрелка ъгъл = минута () * 6; ъгъл = (ъгъл / 57.29577951); // Конвертиране на градуси в радиани x3 = (clockCenterX + (sin (ъгъл) * (clockRadius - (clockRadius / 4)))); y3 = (clockCenterY - (cos (ъгъл) * (clockRadius - (clockRadius / 4)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // показване на часовия ъгъл на стрелката = час () * 30 + int ((минута () / 12) * 6); angle = (angle / 57.29577951); // Конвертираме градуси в радиани x3 = (clockCenterX + (sin (ъгъл) * (clockRadius - (clockRadius / 2)))); y3 = (clockCenterY - (cos (ъгъл) * (clockRadius - (clockRa dius / 2)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); } void digitalClockFrame (OLEDDisplay * дисплей, OLEDDisplayUiState * състояние, int16_t x, int16_t y) {String date = String (година ())+"/"+две цифри (месец ())+"/"+две цифри (ден ()); Низ timenow = String (час ())+":"+две цифри (минута ())+":"+две цифри (втора ()); display-> setTextAlignment (TEXT_ALIGN_CENTER); display-> setFont (ArialMT_Plain_24); display-> drawString (clockCenterX + x, 20, timenow); display-> setFont (ArialMT_Plain_16); display-> drawString (60, 45, дата); } void writeTo (int устройство, байт адрес, байт val) {Wire.beginTransmission (устройство); // стартиране на предаването към устройството Wire.write (адрес); // изпращане на регистър адрес Wire.write (val); // изпращане на стойност за запис Wire.endTransmission (); // край на предаването} // чете num байта, започвайки от регистъра на адреса на устройството, в масив за буфиране void readFrom (int устройство, адрес на байт, int num, байт buff ) {Wire.beginTransmission (устройство); // стартиране на предаването към устройството Wire.write (адрес); // изпраща адрес за четене от Wire.endTransmission (); // край на предаването Wire.beginTransmission (устройство); // стартиране на предаването към устройство Wire.requestFrom (устройство, номер); // искане на 6 байта от устройство int i = 0; while (Wire.available ()) // устройството може да изпрати по -малко от заявеното (ненормално) {buff = Wire.read (); // получавам байт i ++; } Wire.endTransmission (); // край на предаването} void runningFrame (OLEDDisplay*дисплей, OLEDDisplayUiState*състояние, int16_t x, int16_t y) {float calValue = stepsSum*0.4487; display-> setTextAlignment (TEXT_ALIGN_CENTER); display-> setFont (ArialMT_Plain_24); display-> drawString (clockCenterX, clockCenterY, str); sprintf (str, "%.2fcal", calValue); display-> setTextAlignment (TEXT_ALIGN_CENTER); display-> 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 кадрите = {analogClockFrame, digitalClockFrame, runningFrame, uploadFrame}; // колко рамки има? int frameCount = 4; // Наслагванията се изтеглят статично върху рамката, напр. наслагване на часовника OverlayCallback = {clockOverlay}; int наслагванияCount = 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 (ТОП); 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 (DEVICE, 0x2D, 0); writeTo (DEVICE, 0x2D, 16); writeTo (DEVICE, 0x2D, 8); } void updateAdxl345 (void) {readFrom (DEVICE, regAddress, TO_READ, buff); // прочетете данните за ускорението от ADXL345 xx = (((int) buff [1]) << 8) | buff [0]; yy = (((int) buff [3]) << 8) | buff [2]; zz = (((int) buff [5]) << 8) | баф [4]; if (xx 80) {if (xx <currentValue) {stepsSum ++; } currentValue = xx; } sprintf (str, "%d", stepsSum); } int getKeys (void) {if (digitalRead (D2) == LOW) {delay (5); if (digitalRead (D2) == LOW) {while (digitalRead (D2) == LOW); връщане POWER_KEY; }} if (digitalRead (D3) == LOW) {забавяне (5); if (digitalRead (D3) == LOW) {while (digitalRead (D3) == LOW); връщане MENU_KEY; }} if (digitalRead (D4) == LOW) {забавяне (5); if (digitalRead (D4) == LOW) {while (digitalRead (D4) == LOW); връщане UPLOAD_KEY; }} връщане 0; } void doKeysFunction (void) {static int uiFrameIndex = 2; int ключове = getKeys (); if (ключове == POWER_KEY) {статичен char i = 0; if (i) {ui.init (); display.flipScreenVertical (); display.displayOn (); } else {display.displayOff (); } i = ~ i; } if (keys == MENU_KEY) {if (upload == false) {uiFrameIndex ++; if (uiFrameIndex == 3) uiFrameIndex = 0; ui.switchToFrame (uiFrameIndex); } else {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, INPUT); pinMode (D4, INPUT); Blynk.begin (auth, ssid, pass); rtc.begin (); uiInit (); adxl345Init (); timer.setInterval (30, updateAdxl345); timer.setInterval (100, uploadToBlynk); } void loop () {int оставенTimeBudget = ui.update (); static int testSum = 0; if ((testSum 0) {забавяне (останалTimeBudget);} doKeysFunction (); timer.run ();}

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

char auth = "YourAuthToken"; // Вашите идентификационни данни за WiFi. // Задайте парола на "" за отворени мрежи. char ssid = "YourNetworkName"; char pass = "Вашата парола";

Стъпка 3: Хардуерна връзка

Хардуерна връзка
Хардуерна връзка
Хардуерна връзка
Хардуерна връзка
Хардуерна връзка
Хардуерна връзка

Свържете OLED12864 и модула за ускорение към I2C, отдолу към D2, D3, D4. Освен това добавете 51k издърпващи се резистори към дъното, за да достигнете 3.3V, както е показано по-долу.

Внимание: Неправилно е свързването на издърпващи се резистори към AREF, правилното е към 3.3V

Изображението на хардуерното запояване, показано по -долу:

След запояване, сглобяване на хардуерен модул към кора, показано по -долу:

Изчерпателен ефект на изображението ~

Препоръчано: