Tartalomjegyzék:

Hogyan készítsünk lépésszámlálót?: 3 lépés (képekkel)
Hogyan készítsünk lépésszámlálót?: 3 lépés (képekkel)

Videó: Hogyan készítsünk lépésszámlálót?: 3 lépés (képekkel)

Videó: Hogyan készítsünk lépésszámlálót?: 3 lépés (képekkel)
Videó: A legjobb ár/érték arányú "okos" karkötő - Alaposan leteszteltem a Xiaomi Smart Band 8-at 2024, Június
Anonim
Image
Image
Hozzon létre egy Blynk projektet
Hozzon létre egy Blynk projektet

Korábban sok sportágban teljesítettem jól: gyalog, futás, kerékpározás, tollaslabda stb.

Szeretek lovagolni, hogy hamarosan körbeutazzam. Nos, nézd a portékás hasamat ……

Mindenesetre úgy döntök, hogy újrakezdem a gyakorlást. Milyen felszerelést kell előkészítenem? A sportlétesítmény mellett igen! Kell egy hangszer! Hiszek benne, hogy meg tudom tartani a megfelelő mennyiségű gyakorlatot. Itt jön létre a hangszer. Kezdjük egy videóval ~

A műszer nemcsak lépéseket (és kalóriákat) rögzít valós időben, hanem megjeleníti az időt. Különlegessége, hogy a megjelenítés formátuma pointer ~ annyira klassz! Nagyon -nagyon szeretem!

Feltöltheti rekordjait az internetre

csak egy kattintással. A Blynk (korábban bemutatott okostelefon-szoftver) minden rekordot megjeleníthet. A hordható intelligens órához hasonlóan a műszer időt kap az interneten (így nem kell félnie a teljesítmény és az idő frissítésétől).

Hardver a meedben:

FireBeetle Board-ESP32

A FireBeetle fedőlapjai-Proto Board

OLED12864 kijelző

Gyorsító modul

3,7 V -os akkumulátor (online vásárolt, a hangerő 600 mAh körül van)

3 üveg (online vásárolt)

Nagyon kényelmes építeni ezt a projektet Blybk által.

1. lépés: Hozzon létre egy Blynk projektet

Adjon hozzá két vezérlőt:

Értékkijelző * 1

Valós idejű óra * 1

Az Értékkijelző nevét lépésre kell állítani, de a valós idejű óra tulajdonságaihoz nem kell beállítani. Válassza ki a V1 bemeneti tűt a vezérlők elrendezésének beállításához, az alábbiak szerint.

2. lépés: Programok letöltése a FireBeetle Board-ESP32-re

Kattintson ide a forráskód letöltéséhez az esp32 -re. A forráskód könyvtári fájlokból és 3D nyomtatási fájlokból áll. Mentse el a könyvtárfájlt az arduino lib -be. A 3D fájlok pedig közvetlenül nyomtathatnak kéregeket.

Az alábbiakban a fő program látható

#include #include // Csak az Arduino 1.6.5 és korábbi verziói esetén szükséges include #include #include #include #include #define POWER_KEY 1 #define MENU_KEY 2 #define UPLOAD_KEY 3 boolean upload = false; SSD1306 kijelző (0x3c, 18, 0); OLEDDisplayUi ui (& kijelző); SimpleTimer időzítő; WidgetRTC rtc; int képernyőW = 128; int képernyőH = 64; int clockCenterX = képernyőW/2; int clockCenterY = ((képernyőH-16)/2) +16; // a felső sárga rész 16 px magasság int clockRadius = 23; #define DEVICE (0x53) // ADXL345 eszköz címe #define TO_READ (6) // bájtok száma, amelyeket minden alkalommal ki fogunk olvasni (két bájt tengelyenként) bájt buff [TO_READ]; // 6 bájtos puffer az eszközről olvasott adatok mentésére char str [100]; // karakterlánc puffer az adatok átalakításához, mielőtt elküldi azokat a soros portra int regAddress = 0x32; // első tengely-gyorsulás-adat regiszter az ADXL345-en int xx, yy, zz; // háromtengelyes gyorsulási adatok statikus int currentValue = 0; statikus előjel nélküli hosszú lépésekSum = 0; char auth = "YourAuthToken"; // WiFi hitelesítő adatai. // Állítsa be a jelszót "" a nyitott hálózatokhoz. char ssid = "SajátNetworkName"; char pass = "Saját jelszó"; 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, 0x00, 0x00, 0x00, 0x00 0xF8, 0x01, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x00, 0x00, 0xFC, 0x05, 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 0xF8, 0x17, 0x00, 0x00, 0xC0, 0xF8, 0x0F, 0x00, 0x00, 0xE0, 0xFB, 0x17, 0x00, 0x00, 0xC0, 0xFF, 0x13, 0x00, 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, 0x00, 0x00 0xF4, 0x07, 0x00, 0x00, 0x00, 0xF4, 0x0F, 0x00, 0x00, 0x00, 0xF9, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x80, 0xFE, 0x00, 0x00 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, 0x0 0x00, 0xC0, 0x01, 0xF0, 0x03, 0x00, 0xC0, 0x03, 0xE8, 0x07, 0x00, 0xC0, 0x03, 0x88, 0x6F, 0x00, 0x80, 0x03, 0x40, 0x1E, 0x0, 0x0, 0x0 0x00, 0x80, 0x03, 0x00, 0xF8, 0x01, 0x00, 0x07, 0x00, 0xF4, 0x00, 0x00, 0x07, 0x00, 0xE8, 0x00, 0x80, 0x0F, 0x00, 0xE8, 0x00, 0x0, 0x0, 0x0 0x00, 0xE8, 0x0F, 0x00, 0xE8, 0x00, 0xF0, 0x09, 0x00, 0x60, 0x01, 0xF0, 0x04, 0x00, 0x00, 0x00,}; // segédfunkció digitális óra kijelzéshez: a kezdő 0 karakterlánc kinyomtatása Két számjegy (int számjegy) {if (számjegy <10) {String i = '0'+String (számjegy); vissza i; } else {return String (számjegy); }} void clockOverlay (OLEDDisplay * kijelző, OLEDDisplayUiState * állapot) {if ((hour () == 0) && (minute () == 0) && (second () == 0)) stepsSum = 0; } void analogClockFrame (OLEDDisplay * kijelző, OLEDDisplayUiState * állapot, int16_t x, int16_t y) {display-> drawCircle (clockCenterX + x, clockCenterY + y, 2); // óra pipálja a következőt: (int z = 0; z drawLine (x2 + x, y2 + y, x3 + x, y3 + y);} // a használt lebegési szög = másodperc () * 6; szög = (szög) megjelenítése / 57.29577951); // Fokok konvertálása radiánokká int x3 = (clockCenterX + (sin (szög) * (clockRadius - (clockRadius / 5))))); int y3 = (clockCenterY - (cos (szög) * * (clockRadius - (clockRadius / 5)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // kijelző percmutató szöge = perc () * 6; szög = (szög / 57.29577951); // Fokok konvertálása radiánba x3 = (clockCenterX + (sin (szög) * (clockRadius - (clockRadius / 4)))); y3 = (clockCenterY - (cos (szög) * (clockRadius - (clockRadius / 4)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // az óra mutatószögének megjelenítése = óra () * 30 + int ((perc () / 12) * 6); szög = (szög / 57.29577951); // Fokok radiánokká alakítása x3 = (clockCenterX + (sin (szög) * (clockRadius - (clockRadius / 2))))); y3 = (clockCenterY - (cos (szög) * * (clockRadius - (clockRa dius / 2)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); } void digitalClockFrame (OLEDDisplay * kijelző, OLEDDisplayUiState * állapot, int16_t x, int16_t y) {String date = String (year ())+"/"+twoDigits (month ())+"/"+twoDigits (day ()); String timenow = Karakterlánc (óra ())+":"+twoDigits (perc ())+":"+twoDigits (second ()); 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, dátum); } void writeTo (int eszköz, bájtcím, bájt val) {Wire.beginTransmission (eszköz); // indítsa el az átvitelt az eszközre Wire.write (cím); // regisztrációs cím küldése Wire.write (val); // érték küldése írni Wire.endTransmission (); // az átvitel befejezése} // számbájtokat olvas az eszköz címregiszterétől kezdve a buff tömb void readFrom (int eszköz, bájtcím, int szám, bájt buff ) {Wire.beginTransmission (eszköz); // indítsa el az átvitelt az eszközre Wire.write (cím); // elküldendő címet küld a Wire.endTransmission () -ből; // vége átvitel Wire.beginTransmission (eszköz); // indítsa el az átvitelt az eszközre Wire.requestFrom (eszköz, szám); // 6 bájt kérése az eszköztől int i = 0; while (Wire.available ()) // az eszköz kevesebbet küldhet a kértnél (abnormális) {buff = Wire.read (); // bájt fogadása i ++; } Wire.endTransmission (); // vége átvitel} void runningFrame (OLEDDisplay*kijelző, OLEDDisplayUiState*állapot, 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 * kijelző, OLEDDisplayUiState * állapot, int16_t x, int16_t y) {display-> setFont (ArialMT_Plain_16); display-> drawString (60, 45, "adatok feltöltése …"); } // Ez a tömb függvénymutatókat tart minden képkockára // A keretek az egyetlen nézetek, amelyek a FrameCallback frame -ekben csúsznak = {analogClockFrame, digitalClockFrame, runningFrame, uploadFrame}; // hány képkocka van? int frameCount = 4; // A fedvények statikusan rajzolódnak a keret tetejére, pl. egy óra OverlayCallback overlays = {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 (keretek, frameCount); ui.setOverlays (overlays, overlaysCount); ui.disableAutoTransition (); ui.switchToFrame (2); ui.init (); display.flipScreenVertically (); } void adxl345Init (void) {writeTo (DEVICE, 0x2D, 0); writeTo (DEVICE, 0x2D, 16); writeTo (DEVICE, 0x2D, 8); } void updateAdxl345 (void) {readFrom (DEVICE, regAddress, TO_READ, buff); // a gyorsulási adatok olvasása az ADXL345 -ből 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 <aktuálisérték) {stepsSum ++; } currentValue = xx; } sprintf (str, "%d", stepsSum); } int getKeys (void) {if (digitalRead (D2) == LOW) {delay (5); if (digitalRead (D2) == LOW) {while (digitalRead (D2) == LOW); return POWER_KEY; }} if (digitalRead (D3) == LOW) {delay (5); if (digitalRead (D3) == LOW) {while (digitalRead (D3) == LOW); return MENU_KEY; }} if (digitalRead (D4) == LOW) {delay (5); if (digitalRead (D4) == LOW) {while (digitalRead (D4) == LOW); vissza UPLOAD_KEY; }} return 0; } void doKeysFunction (void) {static int uiFrameIndex = 2; int kulcsok = getKeys (); if (kulcsok == POWER_KEY) {static char i = 0; ha (i) {ui.init (); display.flipScreenVertically (); display.displayOn (); } else {display.displayOff (); } i = ~ i; } if (kulcsok == MENU_KEY) {if (feltöltés == hamis) {uiFrameIndex ++; ha (uiFrameIndex == 3) uiFrameIndex = 0; ui.switchToFrame (uiFrameIndex); } else {ui.switchToFrame (3); }} if (kulcsok == UPLOAD_KEY) {if (feltöltés == igaz) {feltöltés = hamis; ui.switchToFrame (uiFrameIndex); } else {feltöltés = igaz; ui.switchToFrame (3); }}} void setup () {pinMode (D2, INPUT); pinMode (D3, BEMENET); pinMode (D4, BEMENET); Blynk.begin (auth, ssid, pass); rtc.begin (); uiInit (); adxl345Init (); timer.setInterval (30, updateAdxl345); timer.setInterval (100, uploadToBlynk); } void loop () {int maradékidőBudget = ui.update (); static int testSum = 0; if ((testSum 0) {delay (maradékTimeBudget);} doKeysFunction (); timer.run ();}

Vigyázat: A Wi-Fi beállításokat, az útlevelet és az AUTHTOKENS-t saját maga módosítsa.

char auth = "YourAuthToken"; // WiFi hitelesítő adatai. // Állítsa be a jelszót "" a nyitott hálózatokhoz. char ssid = "SajátNetworkName"; char pass = "Saját jelszó";

3. lépés: Hardvercsatlakozás

Hardver kapcsolat
Hardver kapcsolat
Hardver kapcsolat
Hardver kapcsolat
Hardver kapcsolat
Hardver kapcsolat

Csatlakoztassa az OLED12864 -et és a gyorsítómodult az I2C -hez, alját a D2, D3, D4 -hez. Ezenkívül adjon hozzá 51k felhúzó ellenállást az aljához, hogy elérje a 3.3 V-ot, az alábbiak szerint.

Vigyázat: Helytelen a felhúzó ellenállásokat az AREF-hez csatlakoztatni, a megfelelő az 3.3V-hoz

A hardver forrasztási képe, az alábbiak szerint:

A forrasztás után a hardvermodul összeállítása a kéreghez, az alábbiak szerint:

Átfogó hatású kép ~

Ajánlott: