Cuprins:

Cum să faci un contor de pași ?: 3 pași (cu imagini)
Cum să faci un contor de pași ?: 3 pași (cu imagini)

Video: Cum să faci un contor de pași ?: 3 pași (cu imagini)

Video: Cum să faci un contor de pași ?: 3 pași (cu imagini)
Video: Fii client ENGIE în 3 pași online! 2024, Iunie
Anonim
Image
Image
Creați un proiect Blynk
Creați un proiect Blynk

Obișnuiam să performez bine la multe sporturi: mersul pe jos, alergatul, mersul cu bicicleta, jocul de badminton etc.

Îmi place să călăresc să călătoresc în preajmă. Păi, uită-te la burtica mea …

Ei bine, oricum, decid să reîncep să fac mișcare. Ce echipament ar trebui să pregătesc? În afară de facilitățile sportive, da! Am nevoie de un instrument! Cred că, cu el, pot păstra o cantitate adecvată de exercițiu. Aici apare instrumentul. Să începem cu un videoclip ~

Instrumentul nu numai că poate înregistra pași (și calorii) în timp real, dar poate afișa timpul. Ceea ce este special este că formatul de afișare este pointer ~ atât de cool! Îmi place foarte mult!

Puteți încărca înregistrările dvs. pe Internet

doar cu un singur clic. Toate înregistrările pot fi afișate de Blynk (un software pentru telefoane inteligente introdus anterior). La fel ca și ceasul inteligent purtabil, instrumentul primește timp pe linie (deci nu trebuie să vă temeți de actualizarea puterii și a timpului).

Hardware în meed:

FireBeetle Board-ESP32

FireBeetle Covers-Proto Board

Ecranul OLED12864 dispaly

Modul de accelerare

Baterie de 3,7 V (cumpărată online, volumul este de aproximativ 600mAH)

3 sticle (cumpărate online)

Este foarte convenabil să construiești acest proiect de către Blybk.

Pasul 1: Creați un proiect Blynk

Adăugați două controale:

Afișare valoare * 1

Ceas în timp real * 1

Numele Afișării valorii ar trebui setat la pași, dar nu trebuie setată proprietățile ceasului în timp real. Alegeți V1 ca pin de intrare pentru a regla aspectul comenzilor, prezentat mai jos.

Pasul 2: Descărcați programe pe FireBeetle Board-ESP32

Faceți clic aici pentru a descărca codul sursă în esp32. Codul sursă conține fișiere de bibliotecă și fișiere de imprimare 3D. Ar trebui să salvați fișierul bibliotecii în lib de arduino. Și fișierele 3D pot imprima direct cruste.

Mai jos este programul principal

#include #include // Este necesar doar pentru Arduino 1.6.5 și versiunile anterioare #include "SSD1306.h" // alias pentru `#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; Afișaj SSD1306 (0x3c, 18, 0); OLEDDisplayUi ui (& display); Cronometru SimpleTimer; WidgetRTC rtc; int ecranW = 128; ecran int H = 64; int clockCenterX = ecranW / 2; int clockCenterY = ((ecranH-16) / 2) +16; // partea galbenă de sus are 16 px înălțime int clockRadius = 23; #define DEVICE (0x53) // Adresa dispozitivului ADXL345 #define TO_READ (6) // număr de octeți pe care îl vom citi de fiecare dată (doi octeți pentru fiecare axă) octet buff [TO_READ]; // tampon de 6 octeți pentru salvarea datelor citite de pe dispozitivul char str [100]; // buffer șir pentru a transforma datele înainte de a le trimite la portul serial int regAddress = 0x32; // primul registru de date de accelerare a axelor pe ADXL345 int xx, yy, zz; // date de accelerare pe trei axe static int currentValue = 0; pași lungi nesemnați statici Sumă = 0; char auth = "YourAuthToken"; // Acreditările dvs. WiFi. // Setați parola la „” pentru rețelele deschise. char ssid = "NumeleRetei Dvs."; char pass = "Parola ta"; 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, 0x0x, 0x00 0xF8, 0x17, 0x00, 0x00, 0xC0, 0xF8, 0x0F, 0x00, 0x00, 0xE0, 0xFB, 0x17, 0x00, 0x00, 0xC0, 0xFF, 0x13, 0x00, 0x00, 0x00, 0xFF, 0x0x, 0xFE, 0x03, 0x00, 0x00, 0x00, 0xF9, 0x03, 0x00, 0x00, 0x00, 0xFA, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00 0xF4, 0x07, 0x00, 0x00, 0x00, 0xF4, 0x0F, 0x00, 0x00, 0x00, 0xF9, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x80, 0xFE, 0x00x, 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, 0x00 0x00, 0x80, 0x03, 0x00, 0xF8, 0x01, 0x00, 0x07, 0x00, 0xF4, 0x00, 0x00, 0x07, 0x00, 0xE8, 0x00, 0x80, 0x0F, 0x00, 0xE8, 0x00, 0x0, 0x0, 0x0, 0x0, 0x0 0x00, 0xE8, 0x0F, 0x00, 0xE8, 0x00, 0xF0, 0x09, 0x00, 0x60, 0x01, 0xF0, 0x04, 0x00, 0x00, 0x00,}; // funcție utilitară pentru afișarea ceasului digital: imprimă 0 șiruri de două cifre (cifre int) {if (cifre <10) {șir i = '0' + șir (cifre); retur i; } else {return String (cifre); }} void clockOverlay (OLEDDisplay * display, OLEDDisplayUiState * state) {if ((hour () == 0) && (minute () == 0) && (second () == 0)) stepsSum = 0; } void analogClockFrame (OLEDDisplay * display, OLEDDisplayUiState * state, int16_t x, int16_t y) {display-> drawCircle (clockCenterX + x, clockCenterY + y, 2); // bifurile orei pentru (int z = 0; z drawLine (x2 + x, y2 + y, x3 + x, y3 + y);} // afișează unghiul plutitor al mâinii a doua = second () * 6; angle = (angle / 57.29577951); // Conversia gradelor în radiani int x3 = (clockCenterX + (sin (angle) * (clockRadius - (clockRadius / 5)))); int y3 = (clockCenterY - (cos (angle) * (clockRadius - (clockRadius / 5)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // afișează unghiul minutului minutului = minute () * 6;; // Conversia grade în radiani x3 = (clockCenterX + (sin (angle) * (clockRadius - (clockRadius / 4)))); y3 = (clockCenterY - (cos (angle) * (clockRadius - (clockRadius / 4)));; angle = (angle / 57.29577951); // Conversie grade în radiani x3 = (clockCenterX + (sin (angle) * (clockRadius - (clockRadius / 2)))); y3 = (clockCenterY - (cos (angle) * { 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) {Data șirului = Șir (an ()) + "/" + twoDigits (month ()) + "/" + twoDigits (day ()); String timenow = String (hour ()) + ":" + twoDigits (minute ()) + ":" + 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, data); } void writeTo (dispozitiv int, adresa octet, octet val) {Wire.beginTransmission (dispozitiv); // începe transmisia către dispozitiv Wire.write (adresa); // trimite adresa de înregistrare Wire.write (val); // trimiteți valoare pentru a scrie Wire.endTransmission (); // terminare transmisie} // citește numărați octeți începând de la registrul de adrese de pe dispozitiv în pentru a matricea buidă readFrom (dispozitiv int, adresă octet, int num, octet buff ) {Wire.beginTransmission (dispozitiv); // începe transmisia către dispozitiv Wire.write (adresa); // trimite adresa de citit din Wire.endTransmission (); // terminare transmisie Wire.beginTransmission (dispozitiv); // începe transmisia către dispozitiv Wire.requestFrom (dispozitiv, num); // solicitați 6 octeți de la dispozitiv int i = 0; while (Wire.available ()) // dispozitivul poate trimite mai puțin decât cerut (anormal) {buff = Wire.read (); // primiți un octet i ++; } Wire.endTransmission (); // terminare transmisie} void runningFrame (afișaj OLEDDisplay *, stare 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 (afișaj OLEDDisplay *, stare OLEDDisplayUiState *, int16_t x, int16_t y) {display-> setFont (ArialMT_Plain_16); display-> drawString (60, 45, „upload data…”); } // Această matrice păstrează indicatoarele funcționale pentru toate cadrele // cadrele sunt vizualizările unice care glisează în cadrele FrameCallback = {analogClockFrame, digitalClockFrame, runningFrame, uploadFrame}; // câte cadre sunt? int FrameCount = 4; // Suprapunerile sunt desenate static deasupra unui cadru, de ex. a clock OverlayCallback overlays = {clockOverlay}; int overlaysCount = 1; void uploadToBlynk (nul) {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 (cadre, 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); // citiți datele de accelerație din ADXL345 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 ++; } Valoare curentă = xx; } sprintf (str, "% d", stepsSum); } int getKeys (void) {if (digitalRead (D2) == LOW) {delay (5); if (digitalRead (D2) == LOW) {while (digitalRead (D2) == LOW); returnează POWER_KEY; }} if (digitalRead (D3) == LOW) {întârziere (5); if (digitalRead (D3) == LOW) {while (digitalRead (D3) == LOW); returnează MENU_KEY; }} if (digitalRead (D4) == LOW) {întârziere (5); if (digitalRead (D4) == LOW) {while (digitalRead (D4) == LOW); returnează UPLOAD_KEY; }} returnează 0; } void doKeysFunction (void) {static int uiFrameIndex = 2; chei int = getKeys (); if (taste == POWER_KEY) {static char i = 0; if (i) {ui.init (); display.flipScreenVertically (); display.displayOn (); } else {display.displayOff (); } i = ~ i; } if (taste == MENU_KEY) {if (upload == false) {uiFrameIndex ++; if (uiFrameIndex == 3) uiFrameIndex = 0; ui.switchToFrame (uiFrameIndex); } else {ui.switchToFrame (3); }} if (taste == 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 restantTimeBudget = ui.update (); static int testSum = 0; if ((testSum 0) {delay (leftTimeBudget);} doKeysFunction (); timer.run ();}

Atenție: ar trebui să modificați setările Wi-Fi, pașaportul și AUTHTOKENS pentru dvs.

char auth = "YourAuthToken"; // Acreditările dvs. WiFi. // Setați parola la „” pentru rețelele deschise. char ssid = "NumeleRetei Dvs."; char pass = "Parola ta";

Pasul 3: Conexiune hardware

Conexiune hardware
Conexiune hardware
Conexiune hardware
Conexiune hardware
Conexiune hardware
Conexiune hardware

Conectați OLED12864 și modulul de accelerație la I2C, fundurile la D2, D3, D4. Mai mult decât atât, adăugați rezistențe de tracțiune de 51 k la fund pentru a ajunge la 3,3 V, prezentat mai jos.

Atenție: este greșit să conectați rezistențele de tracțiune la AREF, cel corect este la 3,3V

Imaginea de lipit hardware, prezentată mai jos:

După lipire, asamblarea modulului hardware la crustă, prezentat după cum urmează:

Imagine cu efect cuprinzător ~

Recomandat: