Съдържание:
- Стъпка 1: Създайте Blynk проект
- Стъпка 2: Изтеглете програми на FireBeetle Board-ESP32
- Стъпка 3: Хардуерна връзка
Видео: Как да направите брояч на стъпки?: 3 стъпки (със снимки)
2024 Автор: John Day | [email protected]. Последно модифициран: 2024-01-30 07:50
Представях се добре в много спортове: ходене, бягане, каране на колело, игра на бадминтон и др.
Обичам да яздя, за да пътувам преди малко. Ами виж дебелото ми коремче …….
Е, все пак решавам да рестартирам, за да тренирам. Какво оборудване трябва да подготвя? Освен спортно съоръжение, да! Имам нужда от инструмент! Вярвам, че с него мога да поддържам подходящо количество упражнения. Тук инструментът възниква. Нека започнем с видео ~
Инструментът не само може да записва стъпки (и калории) в реално време, но и да показва време. Особеното е, че форматът на показване е показалец ~ толкова готин! Наистина, много ми харесва!
Можете да качите вашите записи в Интернет
само с едно щракване. Всички записи могат да бъдат показани от 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
Изображението на хардуерното запояване, показано по -долу:
След запояване, сглобяване на хардуерен модул към кора, показано по -долу:
Изчерпателен ефект на изображението ~
Препоръчано:
Как да направите тон контрол LM358 за усилвател 2.1: 7 стъпки (със снимки)
Как да си направим Tone Control LM358 за усилвател 2.1: Така че в моя канал в Youtube много хора питат как да комбинират два усилвателя в един. Първият усилвател се използва за сателитни високоговорители, а вторият усилвател се използва за високоговорители за субуфер. Тази конфигурация за инсталиране на усилвател може да се нарече усилвател
Как да направите евтина дъска Attiny Arduino: 4 стъпки (със снимки)
Как да си направим евтина дъска Attiny Arduino: Е, през повечето време се притеснявам, когато се нуждая от Arduino в някои проекти, където се нуждая от няколко I/O пина Е, благодарение на платформата Arduino-Tiny, програмата Arduino може да се запише в Avr-tiny Series като Attiny 85/45 Arduino-Tiny е набор с отворен код на ATtiny
Брояч на стъпки - Микро: Бит: 12 стъпки (със снимки)
Стъпков брояч - Микро: Бит: Този проект ще бъде брояч на стъпки. Ще използваме сензора за акселерометър, който е вграден в Micro: Bit за измерване на нашите стъпки. Всеки път, когато Micro: Bit се разклати, ще добавим 2 към броя и ще го покажем на екрана
Как да направите видео на разделен екран с четири стъпки: 4 стъпки (със снимки)
Как да направите видео на разделен екран с четири стъпки: Често виждаме едно и също лице да се показва в сцена два пъти в телевизионна пиеса. А доколкото знаем, актьорът няма брат близнак. Гледахме също, че два пеещи клипа се поставят на един екран, за да се сравнят техните певчески умения. Това е силата на spl
Как да направите снимки на Kirlian: 9 стъпки (със снимки)
Как да правите снимки на Кирлиан: Виждали сте тези невероятни снимки с мълнии, изстреляни от ежедневни предмети. Сега е ваш ред да научите как да направите тези снимки ПРОЧЕТЕТЕ КОЛИЧНАТА ИНСТРУКЦИЯ ПРЕДИ СГРАДАНЕТО