Turinys:

Kaip padaryti žingsnių skaitiklį?: 3 žingsniai (su nuotraukomis)
Kaip padaryti žingsnių skaitiklį?: 3 žingsniai (su nuotraukomis)

Video: Kaip padaryti žingsnių skaitiklį?: 3 žingsniai (su nuotraukomis)

Video: Kaip padaryti žingsnių skaitiklį?: 3 žingsniai (su nuotraukomis)
Video: DM Matematika: Trupmenų sudėtis atimtis 2024, Birželis
Anonim
Image
Image
Sukurkite „Blynk“projektą
Sukurkite „Blynk“projektą

Aš gerai pasirodžiau daugelyje sporto šakų: vaikščiojau, bėgau, važinėjau dviračiu, žaidžiau badmintoną ir pan.

Man patinka važiuoti, kad galėčiau keliauti. Na, pažiūrėk į mano pilvuką …

Na, bet kokiu atveju nusprendžiu pradėti sportuoti iš naujo. Kokią įrangą turėčiau paruošti? Be sporto įrangos, taip! Man reikia instrumento! Aš tikiu, kad su juo galiu tinkamai sportuoti. Čia atsiranda instrumentas. Pradėkime nuo vaizdo įrašo ~

Prietaisas gali ne tik įrašyti žingsnius (ir kalorijas) realiu laiku, bet ir parodyti laiką. Ypatinga tai, kad rodymo formatas yra rodyklė - taip šaunu! Man labai, labai patinka!

Įrašus galite įkelti į internetą

tik vienu paspaudimu. Visus įrašus gali rodyti „Blynk“(anksčiau įdiegta išmaniųjų telefonų programinė įranga). Prietaisas, kaip ir nešiojamas išmanusis laikrodis, turi laiko prisijungti (todėl nereikia bijoti galios ir laiko atnaujinimo).

Techninė įranga:

„FireBeetle Board“-ESP32

„FireBeetle“dangtelių proto lenta

Displėjaus ekranas OLED12864

Pagreičio modulis

3,7 V baterija (pirkta internetu, jos tūris yra apie 600 mAh)

3 buteliai (pirkti internetu)

Labai patogu statyti šį „Blybk“projektą.

1 žingsnis: sukurkite „Blynk“projektą

Pridėkite du valdiklius:

Vertės rodymas * 1

Laikrodis realiuoju laiku * 1

Reikšmės rodymo pavadinimas turėtų būti nustatytas kaip veiksmas, bet ne realaus laiko laikrodžio ypatybių nustatymas. Pasirinkite V1 kaip įvesties kaištį, kad sureguliuotumėte valdiklių išdėstymą, kaip parodyta žemiau.

2 veiksmas: atsisiųskite programas į „FireBeetle Board-ESP32“

Spustelėkite čia, jei norite atsisiųsti šaltinio kodą į esp32. Šaltinio kodą sudaro bibliotekos failai ir 3D spausdinimo failai. Bibliotekos failą turėtumėte išsaugoti „lib of arduino“. 3D failai gali tiesiogiai spausdinti plutą.

Žemiau yra pagrindinė programa

#include #include // Reikalingas tik „Arduino 1.6.5“ir ankstesnėms versijoms #include „SSD1306.h“// slapyvardis „#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 ekranas (0x3c, 18, 0); OLEDDisplayUi ui (& ekranas); „SimpleTimer“laikmatis; ValdiklisRTC rtc; int ekranasW = 128; int ekranasH = 64; int clockCenterX = ekranasW/2; int clockCenterY = ((ekranasH-16)/2) +16; // viršutinė geltona dalis yra 16 px aukščio int clockRadius = 23; #define DEVICE (0x53) // ADXL345 įrenginio adresas #define TO_READ (6) // baitų, kuriuos ketiname skaityti kiekvieną kartą (du baitai kiekvienai ašiai), baitų bufetas [TO_READ]; // 6 baitų buferis, skirtas išsaugoti duomenis, nuskaitytus iš įrenginio char str [100]; // eilutės buferis duomenims transformuoti prieš siunčiant juos į nuoseklųjį prievadą int regAddress = 0x32; // pirmosios ašies pagreičio duomenų registras ADXL345 int xx, yy, zz; // trijų ašių pagreičio duomenys static int currentValue = 0; statiniai nepasirašyti ilgi žingsniaiSum = 0; char auth = "YourAuthToken"; // Jūsų „WiFi“prisijungimo duomenys. // Atviriems tinklams nustatykite slaptažodį į „“. char ssid = "Jūsų tinklo pavadinimas"; char pass = "Jūsų slaptažodis"; 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 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, 0x00 0xFE, 0x03, 0x00, 0x00, 0x00, 0xF9, 0x03, 0x00, 0x00, 0x00, 0xFA, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0xF0, 0x00, 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, 0x0, 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,}; // naudingoji skaitmeninio laikrodžio rodymo funkcija: spausdina pirmaujančią 0 Eilutė twoDigits (int skaitmenys) {if (skaitmenys <10) {String i = '0'+String (skaitmenys); grąžinti i; } else {return String (skaitmenys); }} void clockOverlay (OLEDDisplay * ekranas, OLEDDisplayUiState * būsena) {if ((hour () == 0) && (minute () == 0) && (second () == 0)) stepsSum = 0; } void analogClockFrame (OLEDDisplay * ekranas, OLEDDisplayUiState * būsena, int16_t x, int16_t y) {display-> drawCircle (clockCenterX + x, clockCenterY + y, 2); // valandos erkės, skirtos (int z = 0; z drawLine (x2 + x, y2 + y, x3 + x, y3 + y);} // rodyti naudoto plūdės kampą = second () * 6; angle = (kampas / 57.29577951); // Konvertuoti laipsnius į radianus int x3 = (clockCenterX + (sin (kampas) * (clockRadius - (clockRadius / 5))))); int y3 = (clockCenterY - (cos (kampas) * * (clockRadius - (clockRadius / 5)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // rodyti minutės rankos kampą = minutė () * 6; kampas = (kampas / 57.29577951); // Konvertuoti laipsnius į radianus x3 = (clockCenterX + (sin (kampas) * (clockRadius - (clockRadius / 4))))); y3 = (clockCenterY - (cos (kampas) * (clockRadius - (clockRadius / 4)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // rodyti valandos rodyklės kampą = hour () * 30 + int ((minute () / 12) * 6); kampas = (kampas / 57.29577951); // Konvertuoti laipsnius į radianus x3 = (clockCenterX + (sin (kampas) * (clockRadius - (clockRadius / 2))))); y3 = (clockCenterY - (cos (kampas)) * (clockRadius - (clockRa dius / 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 ()); Eilutės laikas = eilutė (valanda ())+":"+du skaitmenys (minutė ())+":"+du skaitmenys (antras ()); display-> setTextAlignment (TEXT_ALIGN_CENTER); ekranas-> setFont (ArialMT_Plain_24); ekranas-> drawString (clockCenterX + x, 20, timenow); ekranas-> setFont (ArialMT_Plain_16); display-> drawString (60, 45, data); } void writeTo (int įrenginys, baitų adresas, baitų val) {Wire.beginTransmission (įrenginys); // pradėti perdavimą į įrenginį Wire.write (adresas); // siųsti registro adresą Wire.write (val); // siųsti reikšmę įrašyti Wire.endTransmission (); // baigti perdavimą} // skaito skaičių baitus, pradedant nuo įrenginio adresų registro iki buferio masyvo void readFrom (int įrenginys, baitų adresas, int num, baitų bufetas ) {Wire.beginTransmission (įrenginys); // pradėti perdavimą į įrenginį Wire.write (adresas); // siunčia adresą skaityti iš Wire.endTransmission (); // pabaigos transmisija Wire.beginTransmission (device); // pradėti perdavimą į įrenginį Wire.requestFrom (įrenginys, num); // prašyti 6 baitų iš įrenginio int i = 0; while (Wire.available ()) // įrenginys gali siųsti mažiau nei prašoma (nenormalu) {buff = Wire.read (); // gauti baitą i ++; } Wire.endTransmission (); // pabaigos perdavimas} void runningFrame (OLEDDisplay*ekranas, OLEDDisplayUiState*būsena, int16_t x, int16_t y) {float calValue = stepsSum*0.4487; display-> setTextAlignment (TEXT_ALIGN_CENTER); ekranas-> setFont (ArialMT_Plain_24); ekranas-> drawString (clockCenterX, clockCenterY, str); sprintf (str, "%.2fcal", calValue); display-> setTextAlignment (TEXT_ALIGN_CENTER); ekranas-> setFont (ArialMT_Plain_10); ekranas-> drawString (100, 20, str); ekranas-> drawXbm (10, 14, 34, 50, running_Logo_bits); } void uploadFrame (OLEDDisplay * ekranas, OLEDDisplayUiState * būsena, int16_t x, int16_t y) {display-> setFont (ArialMT_Plain_16); display-> drawString (60, 45, "įkelti duomenis …"); } // Šis masyvas saugo funkcijų rodykles į visus kadrus // kadrai yra pavieniai rodiniai, kurie slenka FrameCallback kadruose = {analogClockFrame, digitalClockFrame, runningFrame, uploadFrame}; // kiek kadrų yra? int frameCount = 4; // Perdangos statiškai nupieštos ant rėmo, pvz. laikrodis „OverlayCallback“perdangos = {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 (kadrai, frameCount); ui.setOverlays (perdangos, overlaysCount); ui.disableAutoTransition (); ui.switchToFrame (2); ui.init (); display.flipScreenVertically (); } void adxl345Init (void) {writeTo (ĮRENGINIS, 0x2D, 0); writeTo (ĮRENGINIS, 0x2D, 16); writeTo (ĮRENGINIS, 0x2D, 8); } void updateAdxl345 (void) {readFrom (DEVICE, regAddress, TO_READ, buff); // skaityti pagreičio duomenis iš ADXL345 xx = (((int) buff [1]) << 8) | buff [0]; yy = (((int) buff [3]) << 8) | buff [2]; zz = (((int) buff [5]) << 8) | bufetas [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); grąžinti POWER_KEY; }} if (digitalRead (D3) == LOW) {delay (5); if (digitalRead (D3) == LOW) {while (digitalRead (D3) == LOW); grįžti MENU_KEY; }} if (digitalRead (D4) == LOW) {delay (5); if (digitalRead (D4) == LOW) {while (digitalRead (D4) == LOW); grąžinti UPLOAD_KEY; }} grįžti 0; } void doKeysFunction (void) {static int uiFrameIndex = 2; int raktai = getKeys (); if (raktai == POWER_KEY) {static char i = 0; jei (i) {ui.init (); display.flipScreenVertically (); display.displayOn (); } else {display.displayOff (); } i = ~ i; } if (klavišai == MENU_KEY) {if (įkelti == klaidinga) {uiFrameIndex ++; jei (uiFrameIndex == 3) uiFrameIndex = 0; ui.switchToFrame (uiFrameIndex); } else {ui.switchToFrame (3); }} jei (raktai == UPLOAD_KEY) {jei (įkelti == tiesa) {įkelti = klaidinga; 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 likusio laikoBudget = ui.update (); static int testSum = 0; if ((testSum 0) {delay (waitingTimeBudget);} doKeysFunction (); timer.run ();}

Įspėjimas: „Wi-Fi“nustatymą, pasą ir AUTHTOKENS turėtumėte pakeisti patys.

char auth = "YourAuthToken"; // Jūsų „WiFi“prisijungimo duomenys. // Atviriems tinklams nustatykite slaptažodį į „“. char ssid = "Jūsų tinklo pavadinimas"; char pass = "Jūsų slaptažodis";

3 žingsnis: aparatinės įrangos prijungimas

Techninės įrangos ryšys
Techninės įrangos ryšys
Techninės įrangos ryšys
Techninės įrangos ryšys
Techninės įrangos ryšys
Techninės įrangos ryšys

Prijunkite OLED12864 ir pagreičio modulį prie I2C, apačios - prie D2, D3, D4. Be to, prie dugno pridėkite 51k ištraukiamųjų rezistorių, kad pasiektų 3,3 V, kaip parodyta žemiau.

Įspėjimas: neteisinga prijungti traukiamus rezistorius prie AREF, teisingas yra 3.3V

Techninės įrangos litavimo vaizdas, parodytas taip:

Po lydmetalio, surinkdami aparatūros modulį prie plutos, parodyta taip:

Išsamus efekto vaizdas ~

Rekomenduojamas: