Mündəricat:

Bir addım sayğacı necə etmək olar ?: 3 addım (şəkillərlə)
Bir addım sayğacı necə etmək olar ?: 3 addım (şəkillərlə)

Video: Bir addım sayğacı necə etmək olar ?: 3 addım (şəkillərlə)

Video: Bir addım sayğacı necə etmək olar ?: 3 addım (şəkillərlə)
Video: Gündə 10 min addım həqiqətən də faydalıdırmı? 2024, Iyun
Anonim
Image
Image
Blynk Layihəsi yaradın
Blynk Layihəsi yaradın

Bir çox idman növlərində yaxşı çıxış edirdim: gəzmək, qaçmaq, velosiped sürmək, badminton oynamaq və s.

Çox keçmədən gəzməyi sevirəm. Yaxşı, qarın qarnına baxın …….

Yaxşı, hər halda, məşq etmək üçün yenidən başlamağa qərar verdim. Hansı avadanlıqları hazırlamalıyam? İdman qurğusundan başqa, bəli! Alətə ehtiyacım var! İnanıram ki, lazımi miqdarda məşq edə bilərəm. Burada alət yaranır. Bir video ilə başlayaq ~

Cihaz yalnız addımları (və kaloriləri) real vaxtda yaza bilməz, həm də vaxtı göstərə bilər. Xüsusi olan göstərmə formatının göstərici olması ~ çox sərin! Həqiqətən, çox bəyəndim!

Qeydlərinizi İnternetə yükləyə bilərsiniz

yalnız bir kliklə. Bütün qeydlər Blynk (əvvəllər təqdim edilmiş ağıllı telefon proqramı) tərəfindən göstərilə bilər. Geyinilə bilən ağıllı saatla eyni, cihaz vaxtında işləyir (buna görə gücdən və vaxtın yenilənməsindən qorxmamalısınız).

Məişət texnikası:

FireBeetle Board-ESP32

FireBeetle Covers-Proto Board

OLED12864 dispaly ekranı

Sürətləndirmə modulu

3.7V batareya (internetdən alınıb, həcmi 600mAH civarındadır)

3 şüşə (internetdən alınıb.

Bu layihəni Blybk tərəfindən qurmaq çox rahatdır.

Addım 1: Blynk Layihəsi yaradın

İki nəzarət əlavə edin:

Dəyərin göstərilməsi * 1

Real vaxt saatı * 1

Dəyər Göstəricisinin adı addımlara təyin edilməlidir, lakin Real-time saatın xüsusiyyətləri üçün heç bir parametr yoxdur. Aşağıda göstərildiyi kimi idarəetmə elementlərinin düzülüşünü tənzimləmək üçün giriş pimi olaraq V1 seçin.

Addım 2: Proqramları FireBeetle Board-ESP32-ə yükləyin

Mənbə kodunu esp32 -ə yükləmək üçün bura vurun. Mənbə kodu kitabxana sənədlərindən və 3D çap sənədlərindən ibarətdir. Kitabxana faylını arduino lib -də saxlamalısınız. Və 3D faylları qabıqları birbaşa çap edə bilər.

Aşağıda əsas proqramdır

#include #include // Yalnız Arduino 1.6.5 və daha əvvəlki versiyalar üçün lazımdır #include "SSD1306.h" // alias for `#include" SSD1306Wire.h "" #include "OLEDDisplayUi.h" #include "images.h" # daxil edin #daxil edin #daxil edin #daxil edin #daxil edin #GÜÇ_AÇIĞINI təyin edin 1 #MENU_KEY 2 -ni təyin edin #YÜKLƏ_AÇARINI təyin et 3 boolean yükləmə = yalan; SSD1306 ekranı (0x3c, 18, 0); OLEDDisplayUi istifadəçi interfeysi (& göstər); SimpleTimer timer; WidgetRTC rtc; int ekranW = 128; int ekranH = 64; int clockCenterX = ekranW/2; int clockCenterY = ((ekranH-16)/2) +16; // üst sarı hissə 16 piksel yüksəklikdədir int clockRadius = 23; #define DEVICE (0x53) // ADXL345 cihaz ünvanı #define TO_READ (6) // hər dəfə oxuyacağımız baytların sayı (hər ox üçün iki bayt) bayt buff [TO_READ]; // cihazdan oxunan məlumatları saxlamaq üçün 6 bayt tampon char str [100]; // int port regAddress = 0x32 serial portuna göndərməzdən əvvəl məlumatları çevirmək üçün simli tampon; // ADXL345 int xx, yy, zz-də ilk ox-sürətləndirmə-məlumat reyestri; // üç ox sürətləndirmə məlumatı statik int currentValue = 0; statik işarəsiz uzun addımlarSum = 0; char auth = "YourAuthToken"; // WiFi etimadnaməniz. // Açıq şəbəkələr üçün şifrəni "" olaraq təyin edin. char ssid = "Şəbəkə Adınız"; char pass = "Şifrəniz"; const char running_Logo_bits PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00 0xF8, 0x01, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x00, 0x00, 0xFC, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 0xFC, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x60, 0xF1, 0x07, 0x07 0xF8, 0x17, 0x00, 0x00, 0xC0, 0xF8, 0x0F, 0x00, 0x00, 0xE0, 0xFB, 0x17, 0x00, 0x00, 0xC0, 0xFF, 0x13, 0x00, 0x00, 0x00, 0xF, 0x00, 0x00 0xFE, 0x03, 0x00, 0x00, 0x00, 0xF9, 0x03, 0x00, 0x00, 0x00, 0xFA, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07 0xF4, 0x07, 0x00, 0x00, 0x00, 0xF4, 0x0F, 0x00, 0x00, 0x00, 0xF9, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x80, 0x00, 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, 0x00, 0x00 0x00, 0xC0, 0x01, 0xF0, 0x03, 0x00, 0xC0, 0x03, 0xE8, 0x07, 0x00, 0xC0, 0x03, 0x88, 0x6F, 0x00, 0x80, 0x03, 0x40, 0x1, 0x1, 0x00 0x00, 0x80, 0x03, 0x00, 0xF8, 0x01, 0x00, 0x07, 0x00, 0xF4, 0x00, 0x00, 0x07, 0x00, 0xE8, 0x00, 0x80, 0x0F, 0x00, 0xE8, 0x00, 0x90 0x00, 0xE8, 0x0F, 0x00, 0xE8, 0x00, 0xF0, 0x09, 0x00, 0x60, 0x01, 0xF0, 0x04, 0x00, 0x00, 0x00,}; // rəqəmsal saat görüntüsü üçün köməkçi funksiya: 0 String twoDigits (int rəqəmləri) {if (rəqəm <10) {String i = '0'+String (rəqəmlər); qayıt i; } else {return String (rəqəmlər); }} boş saatOverlay (OLEDDisplay * ekranı, OLEDDisplayUiState * vəziyyəti) {if ((saat () == 0) && (dəqiqə () == 0) && (ikinci () == 0)) addımlarSum = 0; } etibarsız analogClockFrame (OLEDDisplay * displeyi, OLEDDisplayUiState * vəziyyəti, int16_t x, int16_t y) {display-> drawCircle (clockCenterX + x, clockCenterY + y, 2); // üçün saat işarələri (int z = 0; z drawLine (x2 + x, y2 + y, x3 + x, y3 + y);} // ikinci əlin üzmə bucağı = ikinci () * 6; bucaq = (bucaq / 57.29577951); // Dərəcələri radianlara çevirmək int x3 = (clockCenterX + (sin (bucaq) * (clockRadius - (clockRadius / 5))))); int y3 = (clockCenterY - (cos (bucaq) * (clockRadius - (clockRadius / 5)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y);; // Dərəcələri radiana çevirin x3 = (clockCenterX + (sin (bucaq) * (clockRadius - (clockRadius / 4))))); y3 = (clockCenterY - (cos (bucaq) * (clockRadius - (clockRadius / 4)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // ekranın saat əli bucağı = saat () * 30 + int ((dəqiqə () / 12) * 6); açı = (bucaq / 57.29577951); // Dərəcələri radiana çevirmək x3 = (clockCenterX + (sin (bucaq) * (clockRadius - (clockRadius / 2))))); y3 = (clockCenterY - (cos (açı) *) clockRadius - (clockRa dius / 2)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); } void digitalClockFrame (OLEDDisplay * displeyi, OLEDDisplayUiState * vəziyyəti, int16_t x, int16_t y) {String tarixi = String (il ())+"/"+iki rəqəm (ay ())+"/"+iki rəqəm (gün ()); String timenow = String (saat ())+":"+iki rəqəm (dəqiqə ())+":"+iki rəqəm (ikinci ()); ekran-> setTextAlignment (TEXT_ALIGN_CENTER); display-> setFont (ArialMT_Plain_24); display-> drawString (clockCenterX + x, 20, timenow); display-> setFont (ArialMT_Plain_16); display-> drawString (60, 45, tarix); } void writeTo (int cihazı, bayt ünvanı, bayt val) {Wire.beginTransmission (cihaz); // Wire.write cihazına ötürülməyə başlayın (ünvan); // qeydiyyat ünvanını göndərin Wire.write (val); // Wire.endTransmission () yazmaq üçün dəyər göndərin; // son ötürmə} // cihazdakı ünvan qeydindən başlayaraq say baytlarını oxuyur. Aradan boşluq oxuyur: int cihaz, bayt ünvanı, int sayı, bayt buff ) {Wire.beginTransmission (cihaz); // Wire.write cihazına ötürülməyə başlayın (ünvan); // ünvanı Wire.endTransmission () -dan oxumaq üçün göndərir; // son ötürmə Wire.beginTransmission (cihaz); // Wire.requestFrom cihazına ötürülməyə başlayın (cihaz, sayı); // int i = 0 cihazından 6 bayt istəyin; while (Wire.available ()) // cihaz tələb olunandan az göndərə bilər (anormal) {buff = Wire.read (); // bir bayt almaq i ++; } Wire.endTransmission (); // son ötürmə} void runningFrame (OLEDDisplay*displeyi, OLEDDisplayUiState*vəziyyəti, int16_t x, int16_t y) {float calValue = stepsSum*0.4487; ekran-> setTextAlignment (TEXT_ALIGN_CENTER); display-> setFont (ArialMT_Plain_24); display-> drawString (clockCenterX, clockCenterY, str); sprintf (str, "%.2fcal", calValue); ekran-> 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 * displeyi, OLEDDisplayUiState * vəziyyəti, int16_t x, int16_t y) {display-> setFont (ArialMT_Plain_16); display-> drawString (60, 45, "məlumat yüklə…"); } // Bu sıra bütün çərçivələrə funksiya göstəricilərini saxlayır // çərçivələr FrameCallback çərçivələrində sürüşən tək görünüşlərdir = {analogClockFrame, digitalClockFrame, runningFrame, uploadFrame}; // neçə çərçivə var? int frameCount = 4; // Bindirmələr statik olaraq çərçivənin üstünə çəkilir. bir saat OverlayCallback bindirmələri = {clockOverlay}; int overlaysCount = 1; void uploadToBlynk (void) {if (upload == true) {Blynk.virtualWrite (V0, stepsSum); Blynk.virtualWrite (V1, stepsSum); }} boş uiInit (boş) {ui.setTargetFPS (30); //ui.setActiveSymbol(aktivSimbol); //ui.setInactiveSymbol(inaktivSimbol); ui.setIndicatorPosition (TOP); ui.setIndicatorDirection (LEFT_RIGHT); ui.setFrameAnimation (SLIDE_LEFT); ui.setFrames (çərçivələr, frameCount); ui.setOverlays (bindirmeler, overlaysCount); ui.disableAutoTransition (); ui.switchToFrame (2); ui.init (); display.flipScreenVertically (); } void adxl345Init (void) {writeTo (DEVICE, 0x2D, 0); writeTo (CİHAZ, 0x2D, 16); writeTo (CİHAZ, 0x2D, 8); } void updateAdxl345 (void) {readFrom (DEVICE, regAddress, TO_READ, buff); // ADXL345 -dən sürətlənmə məlumatlarını oxuyun xx = ((((int) buff [1]) << 8) | buff [0]; yy = ((((int) buff [3]) << 8) | buff [2]; zz = (((int) buff [5]) << 8) | buff [4]; if (xx 80) {if (xx <currentValue) {stepsSum ++; } currentValue = xx; } sprintf (str, "%d", stepsSum); } int getKeys (void) {if (digitalRead (D2) == LOW) {gecikmə (5); if (digitalRead (D2) == LOW) {while (digitalRead (D2) == LOW); geri POWER_KEY; }} if (digitalRead (D3) == LOW) {gecikmə (5); if (digitalRead (D3) == LOW) {while (digitalRead (D3) == LOW); qaytar MENU_KEY; }} if (digitalRead (D4) == LOW) {gecikmə (5); if (digitalRead (D4) == LOW) {while (digitalRead (D4) == LOW); qaytar UPLOAD_KEY; }} qaytar 0; } void doKeysFunction (void) {static int uiFrameIndex = 2; int düymələri = getKeys (); if (düymələr == POWER_KEY) {statik char i = 0; əgər (i) {ui.init (); display.flipScreenVertically (); display.displayOn (); } başqa {display.displayOff (); } i = ~ i; } if (düymələr == MENU_KEY) {if (yükləmə == yanlış) {uiFrameIndex ++; əgər (uiFrameIndex == 3) uiFrameIndex = 0; ui.switchToFrame (uiFrameIndex); } başqa {ui.switchToFrame (3); }} if (düymələr == UPLOAD_KEY) {if (yükləmə == doğru) {yükləmə = yalan; ui.switchToFrame (uiFrameIndex); } başqa {yükləmə = doğru; ui.switchToFrame (3); }}} void setup () {pinMode (D2, INPUT); pinMode (D3, GİRİŞ); pinMode (D4, GİRİŞ); Blynk.begin (auth, ssid, pass); rtc.begin (); uiInit (); adxl345Init (); timer.setInterval (30, updateAdxl345); timer.setInterval (100, uploadToBlynk); } void loop () {int kalanTimeBudget = ui.update (); statik int testSum = 0; if ((testSum 0) {gecikmə (kalanTimeBudget);} doKeysFunction (); timer.run ();}

Diqqət: Wi-Fi ayarını, pasportu və AUTHTOKENS-i özünüzə dəyişdirməlisiniz.

char auth = "YourAuthToken"; // WiFi etimadnaməniz. // Açıq şəbəkələr üçün şifrəni "" olaraq təyin edin. char ssid = "Şəbəkə Adınız"; char pass = "Şifrəniz";

Addım 3: Avadanlıq Bağlantısı

Avadanlıq Bağlantısı
Avadanlıq Bağlantısı
Avadanlıq Bağlantısı
Avadanlıq Bağlantısı
Avadanlıq Bağlantısı
Avadanlıq Bağlantısı

OLED12864 və sürətləndirmə modulunu I2C -yə, altlarını D2, D3, D4 -ə qoşun. Üstəlik, aşağıda göstərildiyi kimi 3.3V-ə çatmaq üçün diblərə 51k çəkmə rezistoru əlavə edin.

Diqqət: çəkmə rezistorlarını AREF-ə bağlamaq səhvdir, ən doğrusu 3.3V-dir

Aparat lehimləmə görüntüsü, aşağıda göstərilmişdir:

Lehimdən sonra hardware modulunu qabığa yığaraq aşağıda göstərilmişdir:

Kompleks effektli görüntü ~

Tövsiyə: