Indholdsfortegnelse:

Sådan laver du en trintæller?: 3 trin (med billeder)
Sådan laver du en trintæller?: 3 trin (med billeder)

Video: Sådan laver du en trintæller?: 3 trin (med billeder)

Video: Sådan laver du en trintæller?: 3 trin (med billeder)
Video: LW31 AGPTEK Smart Watch IP68: Things To Know Before Buy // For Android and iPhone 2024, November
Anonim
Image
Image
Opret et Blynk -projekt
Opret et Blynk -projekt

Jeg plejede at præstere godt i mange sportsgrene: gåture, løb, cykle, spille badminton osv.

Jeg elsker at ride for at rejse rundt inden længe. Tja, se på min mave ….

Nå, alligevel beslutter jeg mig for at genstarte for at træne. Hvilket udstyr skal jeg forberede? Udover sportsanlæg, ja! Jeg har brug for et instrument! Jeg tror med det, at jeg kan beholde passende mængde motion. Her bliver instrumentet til. Lad os begynde med en video ~

Instrumentet kan ikke bare registrere trin (og kalorier) i realtid, men vise tid. Det særlige er, at visningsformatet er markør ~ så sejt! Jeg kan virkelig godt lide det!

Du kan uploade dine optegnelser til Internettet

kun med ét klik. Alle poster kan vises af Blynk (en smart-telefonsoftware introduceret før). Det samme som bærbart smartur, instrumentet får tid på nettet (Så du behøver ikke være bange for strøm og tidopdatering).

Hardware i meed:

FireBeetle Board-ESP32

FireBeetle Covers-Proto Board

OLED12864 dispaly skærm

Accelerationsmodul

3,7V batteri (købt online, volumen er omkring 600mAH)

3 flasker (købt online)

Det er meget bekvemt at bygge dette projekt af Blybk.

Trin 1: Opret et Blynk -projekt

Tilføj to kontroller:

Værdi Display * 1

Realtidsur * 1

Navnet på Value Display bør indstilles til trin, men ingen indstilling for egenskaberne for realtidsur. Vælg V1 som input -pin for at justere layoutet af kontroller, vist som nedenfor.

Trin 2: Download programmer til FireBeetle Board-ESP32

Klik her for at downloade kildekoden til esp32. Kildekoden består af biblioteksfiler og 3D -udskrivningsfiler. Du skal gemme biblioteksfilen til lib of arduino. Og 3D -filerne kan udskrive skorper direkte.

Nedenfor er hovedprogrammet

#include #include // Kun nødvendig for Arduino 1.6.5 og tidligere #include "SSD1306.h" // alias for "#include" SSD1306Wire.h "" #include "OLEDDisplayUi.h" #include "images.h" # inkludere #include #include #include #include #define POWER_KEY 1 #define MENU_KEY 2 #define UPLOAD_KEY 3 boolean upload = false; SSD1306 -skærm (0x3c, 18, 0); OLEDDisplayUi ui (& display); SimpleTimer timer; WidgetRTC rtc; int screenW = 128; int screenH = 64; int clockCenterX = screenW/2; int clockCenterY = ((screenH-16)/2) +16; // øverste gule del er 16 px højde int clockRadius = 23; #define DEVICE (0x53) // ADXL345 enhedsadresse #define TO_READ (6) // antal bytes, vi skal læse hver gang (to bytes for hver akse) byte buff [TO_READ]; // 6 bytes buffer til lagring af data læst fra enhedens char str [100]; // strengbuffer for at transformere data, før de sendes til den serielle port int regAddress = 0x32; // første akse-accelerationsdataregister på ADXL345 int xx, yy, zz; // accelerationsdata med tre akser statisk int currentValue = 0; statisk usigneret lange trinSum = 0; char auth = "YourAuthToken"; // Dine WiFi -legitimationsoplysninger. // Indstil adgangskode til "" for åbne netværk. char ssid = "DitNetværksnavn"; char pass = "YourPassword"; 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, 0x00, 0x00 0xF8, 0x17, 0x00, 0x00, 0xC0, 0xF8, 0x0F, 0x00, 0x00, 0xE0, 0xFB, 0x17, 0x00, 0x00, 0xC0, 0xFF, 0x13, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x0, 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, 0x00, 0x00, 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, 0x0, 0x0, 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, 0x0, 0x0, 0x0, 0x0, 0x00, 0xE8, 0x0F, 0x00, 0xE8, 0x00, 0xF0, 0x09, 0x00, 0x60, 0x01, 0xF0, 0x04, 0x00, 0x00, 0x00,}; // hjælpefunktion til digital urvisning: udskriver førende 0 streng toDigits (int cifre) {if (cifre <10) {String i = '0'+streng (cifre); returnere 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); // timevink for (int z = 0; z drawLine (x2 + x, y2 + y, x3 + x, y3 + y);} // vis brugte flydevinkel = sekund () * 6; vinkel = (vinkel / 57.29577951); // Konverter grader til radianer int x3 = (clockCenterX + (sin (vinkel) * (clockRadius - (clockRadius / 5))))); int y3 = (clockCenterY - (cos (vinkel) * (clockRadius - (clockRadius / 5))))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // display minutviservinkel = minut () * 6; vinkel = (vinkel / 57.29577951); // Konverter grader til radianer x3 = (clockCenterX + (sin (vinkel) * (clockRadius - (clockRadius / 4)))); y3 = (clockCenterY - (cos (vinkel) * (clockRadius - (clockRadius / 4))))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // visning af timevinkel = time () * 30 + int ((minut () / 12) * 6); vinkel = (vinkel / 57.29577951); // Konverter grader til radianer x3 = (clockCenterX + (sin (vinkel) * (clockRadius - (clockRadius / 2)))); y3 = (clockCenterY - (cos (vinkel) * (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 ()); String timenow = String (time ())+":"+twoDigits (minut ())+":"+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, dato); } void writeTo (int enhed, byte adresse, byte val) {Wire.beginTransmission (enhed); // start transmission til enhed Wire.write (adresse); // send registeradresse Wire.write (val); // send værdi for at skrive Wire.endTransmission (); // afslut transmission} // læser num bytes fra adresseregister på enhed i til buff array void readFrom (int enhed, byte adresse, int num, byte buff ) {Wire.beginTransmission (enhed); // start transmission til enhed Wire.write (adresse); // sender adresse for at læse fra Wire.endTransmission (); // afslut transmission Wire.beginTransmission (enhed); // start transmission til enhed Wire.requestFrom (enhed, num); // anmode om 6 bytes fra enhed int i = 0; mens (Wire.available ()) // enhed kan sende mindre end ønsket (unormalt) {buff = Wire.read (); // modtage en byte i ++; } Wire.endTransmission (); // end transmission} void runningFrame (OLEDDisplay*display, OLEDDisplayUiState*state, 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 * display, OLEDDisplayUiState * state, int16_t x, int16_t y) {display-> setFont (ArialMT_Plain_16); display-> drawString (60, 45, "upload data …"); } // Denne matrix holder funktionspegere til alle rammer // rammer er de enkelte visninger, der glider i FrameCallback -rammer = {analogClockFrame, digitalClockFrame, runningFrame, uploadFrame}; // hvor mange rammer er der? int frameCount = 4; // Overlejringer tegnes statisk oven på en ramme f.eks. et ur OverlayCallback overlays = {clockOverlay}; int overlaysCount = 1; void uploadToBlynk (void) {if (upload == true) {Blynk.virtualWrite (V0, stepsSum); Blynk.virtualWrite (V1, trinSum); }} 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 (rammer, frameCount); ui.setOverlays (overlays, overlaysCount); ui.disableAutoTransition (); ui.switchToFrame (2); ui.init (); display.flipScreenVertically (); } void adxl345Init (void) {writeTo (DEVICE, 0x2D, 0); writeTo (ENHED, 0x2D, 16); writeTo (ENHED, 0x2D, 8); } void updateAdxl345 (void) {readFrom (DEVICE, regAddress, TO_READ, buff); // læs accelerationsdata fra ADXL345 xx = (((int) buff [1]) << 8) | buff [0]; åå = (((int) buff [3]) << 8) | buff [2]; zz = (((int) buff [5]) << 8) | buff [4]; hvis (xx 80) {if (xx <currentValue) {stepsSum ++; } nuværende værdi = xx; } sprintf (str, "%d", stepsSum); } int getKeys (void) {if (digitalRead (D2) == LOW) {delay (5); hvis (digitalRead (D2) == LOW) {while (digitalRead (D2) == LOW); returner POWER_KEY; }} if (digitalRead (D3) == LOW) {forsinkelse (5); hvis (digitalRead (D3) == LOW) {while (digitalRead (D3) == LOW); vende tilbage MENU_KEY; }} if (digitalRead (D4) == LOW) {forsinkelse (5); hvis (digitalRead (D4) == LOW) {while (digitalRead (D4) == LOW); returner UPLOAD_KEY; }} returner 0; } void doKeysFunction (void) {static int uiFrameIndex = 2; int nøgler = getKeys (); hvis (nøgler == POWER_KEY) {statisk tegn i = 0; hvis (i) {ui.init (); display.flipScreenVertically (); display.displayOn (); } andet {display.displayOff (); } i = ~ i; } hvis (nøgler == MENU_KEY) {hvis (upload == false) {uiFrameIndex ++; hvis (uiFrameIndex == 3) uiFrameIndex = 0; ui.switchToFrame (uiFrameIndex); } andet {ui.switchToFrame (3); }} hvis (nøgler == UPLOAD_KEY) {hvis (upload == true) {upload = false; ui.switchToFrame (uiFrameIndex); } ellers {upload = true; ui.switchToFrame (3); }}} ugyldig opsætning () {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 stayingTimeBudget = ui.update (); statisk int testSum = 0; if ((testSum 0) {delay (stayingTimeBudget);} doKeysFunction (); timer.run ();}

Forsigtig: Du bør ændre Wi-Fi-indstilling, pas og AUTHTOKENS til dig selv.

char auth = "YourAuthToken"; // Dine WiFi -legitimationsoplysninger. // Indstil adgangskode til "" for åbne netværk. char ssid = "DitNetværksnavn"; char pass = "YourPassword";

Trin 3: Hardwareforbindelse

Hardwareforbindelse
Hardwareforbindelse
Hardwareforbindelse
Hardwareforbindelse
Hardwareforbindelse
Hardwareforbindelse

Tilslut OLED12864 og accelerationsmodul til I2C, bund til D2, D3, D4. Tilføj desuden 51k pull-up modstande til bundene for at nå 3,3V, vist som nedenfor.

Forsigtig: Det er forkert at tilslutte pull-up modstande til AREF, den rigtige er til 3,3V

Hardware -loddebilledet, vist som nedenfor:

Efter loddet, montering af hardwaremodul til skorpe, vist som nedenfor:

Omfattende effektbillede ~

Anbefalede: