Innholdsfortegnelse:

Hvordan lage en trinnteller?: 3 trinn (med bilder)
Hvordan lage en trinnteller?: 3 trinn (med bilder)

Video: Hvordan lage en trinnteller?: 3 trinn (med bilder)

Video: Hvordan lage en trinnteller?: 3 trinn (med bilder)
Video: Garmin Forerunner 955 (Solar) полный обзор 2024, Juni
Anonim
Image
Image
Lag et Blynk -prosjekt
Lag et Blynk -prosjekt

Jeg pleide å prestere godt på mange idretter: gå, løpe, sykle, spille badminton etc.

Jeg elsker å ri for å reise rundt før lenge. Vel, se på magen min …

Vel, uansett, bestemmer jeg meg for å starte på nytt for å trene. Hvilket utstyr skal jeg forberede? I tillegg til idrettsanlegg, ja! Jeg trenger et instrument! Jeg tror med det, jeg kan beholde passende mengde trening. Her blir instrumentet til. La oss begynne med en video ~

Instrumentet kan ikke bare registrere trinn (og kalorier) i sanntid, men vise tid. Det som er spesielt er at visningsformatet er peker ~ så kult! Jeg liker det veldig, veldig godt!

Du kan laste opp postene dine til Internett

bare med ett klikk. Alle postene kan vises av Blynk (en smarttelefonprogramvare introdusert før). Det samme som bærbar smartklokke, instrumentet får tid på nettet (Så du trenger ikke være redd for strøm og tidoppdatering).

Maskinvare i meed:

FireBeetle Board-ESP32

FireBeetle Covers-Proto Board

OLED12864 dispaly -skjerm

Akselerasjonsmodul

3,7V batteri (kjøpt online, volumet er rundt 600mAH)

3 flasker (kjøpt online)

Det er veldig praktisk å bygge dette prosjektet av Blybk.

Trinn 1: Opprett et Blynk -prosjekt

Legg til to kontroller:

Verdi Display * 1

Sanntidsklokke * 1

Navnet på Value Display bør settes til trinn, men ingen innstilling for egenskapene til sanntidsklokke. Velg V1 som inngangspinne for å justere utformingen av kontrollene, vist som nedenfor.

Trinn 2: Last ned programmer til FireBeetle Board-ESP32

Klikk her for å laste ned kildekoden til esp32. Kildekoden består av biblioteksfiler og 3D -utskriftsfiler. Du bør lagre biblioteksfilen til lib of arduino. Og 3D -filene kan skrive ut skorper direkte.

Nedenfor er hovedprogrammet

#include #include // Bare 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 -skjerm (0x3c, 18, 0); OLEDDisplayUi ui (& display); SimpleTimer -timer; WidgetRTC rtc; int skjermW = 128; int skjermH = 64; int clockCenterX = screenW/2; int clockCenterY = ((screenH-16)/2) +16; // øverste gule del er 16 px høyde int clockRadius = 23; #define DEVICE (0x53) // ADXL345 enhetsadresse #define TO_READ (6) // antall byte vi skal lese hver gang (to byte for hver akse) byte buff [TO_READ]; // 6 bytes buffer for lagring av data som er lest fra enhetens char str [100]; // strengbuffer for å transformere data før du sender dem til serieporten int regAddress = 0x32; // første akse-akselerasjonsdataregister på ADXL345 int xx, yy, zz; // tre akser akselerasjonsdata statisk int currentValue = 0; statisk usignerte lange trinnSum = 0; char auth = "YourAuthToken"; // WiFi -legitimasjonen din. // Sett passordet til "" for åpne nettverk. char ssid = "Ditt nettverksnavn"; 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, 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, 0x00, 0x00, 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, 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,}; // verktøyfunksjon for digital klokkevisning: skriver ut ledende 0 streng toDigits (int sifre) {if (sifre <10) {String i = '0'+streng (sifre); returnere i; } annet {returstreng (sifre); }} 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); // time merker for (int z = 0; z drawLine (x2 + x, y2 + y, x3 + x, y3 + y);} // vise annenhånds flytevinkel = 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); // vise minuttviservinkel = minutt () * 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); // vis timevinkelen = time () * 30 + int ((minutt () / 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 (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, dato); } void writeTo (int enhet, byte adresse, byte val) {Wire.beginTransmission (enhet); // starte overføringen til enheten Wire.write (adresse); // send registeradresse Wire.write (val); // send verdi for å skrive Wire.endTransmission (); // avslutte overføring} // leser antall byte fra adresseregisteret på enheten til buff -bufferen void readFrom (int -enhet, byte -adresse, int num, byte -buff ) {Wire.beginTransmission (enhet); // start overføring til enhet Wire.write (adresse); // sender adresse for å lese fra Wire.endTransmission (); // avslutte overføring Wire.beginTransmission (enhet); // start overføring til enhet Wire.requestFrom (enhet, num); // be om 6 byte fra enhet int i = 0; mens (Wire.available ()) // enheten kan sende mindre enn ønsket (unormalt) {buff = Wire.read (); // motta en byte i ++; } Wire.endTransmission (); // endeoverføring} 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, "last opp data …"); } // Denne matrisen beholder funksjonspekere til alle rammer // rammer er enkeltvisninger som skyves i FrameCallback -rammer = {analogClockFrame, digitalClockFrame, runningFrame, uploadFrame}; // hvor mange rammer er det? int frameCount = 4; // Overlegg tegnes statisk på toppen av en ramme, f.eks. a clock OverlayCallback overlays = {clockOverlay}; int overlaysCount = 1; void uploadToBlynk (void) {if (upload == true) {Blynk.virtualWrite (V0, stepSum); Blynk.virtualWrite (V1, stepSum); }} 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 (overlegg, overleggCount); ui.disableAutoTransition (); ui.switchToFrame (2); ui.init (); display.flipScreenVertically (); } void adxl345Init (void) {writeTo (DEVICE, 0x2D, 0); writeTo (ENHET, 0x2D, 16); writeTo (ENHET, 0x2D, 8); } void updateAdxl345 (void) {readFrom (DEVICE, regAddress, TO_READ, buff); // les akselerasjonsdataene fra ADXL345 xx = (((int) buff [1]) << 8) | buff [0]; åå = (((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) {delay (5); if (digitalRead (D2) == LOW) {while (digitalRead (D2) == LOW); returner POWER_KEY; }} if (digitalRead (D3) == LOW) {forsinkelse (5); if (digitalRead (D3) == LOW) {while (digitalRead (D3) == LOW); gå tilbake MENU_KEY; }} if (digitalRead (D4) == LOW) {forsinkelse (5); if (digitalRead (D4) == LOW) {while (digitalRead (D4) == LOW); returner UPLOAD_KEY; }} returner 0; } void doKeysFunction (void) {static int uiFrameIndex = 2; int nøkler = getKeys (); if (keys == POWER_KEY) {statisk tegn i = 0; hvis (i) {ui.init (); display.flipScreenVertically (); display.displayOn (); } annet {display.displayOff (); } i = ~ i; } if (keys == MENU_KEY) {if (upload == false) {uiFrameIndex ++; hvis (uiFrameIndex == 3) uiFrameIndex = 0; ui.switchToFrame (uiFrameIndex); } annet {ui.switchToFrame (3); }} if (keys == UPLOAD_KEY) {if (upload == true) {upload = false; ui.switchToFrame (uiFrameIndex); } annet {upload = true; ui.switchToFrame (3); }}} ugyldig oppsett () {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 ();}

Forsiktig: Du bør endre Wi-Fi-innstilling, pass og AUTHTOKENS for deg selv.

char auth = "YourAuthToken"; // WiFi -legitimasjonen din. // Sett passordet til "" for åpne nettverk. char ssid = "Ditt nettverksnavn"; char pass = "YourPassword";

Trinn 3: Maskinvaretilkobling

Maskinvaretilkobling
Maskinvaretilkobling
Maskinvaretilkobling
Maskinvaretilkobling
Maskinvaretilkobling
Maskinvaretilkobling

Koble OLED12864 og akselerasjonsmodul til I2C, bunn til D2, D3, D4. Videre legger du til 51k pull-up-motstander i bunnene for å nå 3,3V, vist som nedenfor.

Forsiktig: Det er feil å koble opptrekkbare motstander til AREF, den riktige er til 3,3V

Maskinvarelodding, vist som nedenfor:

Etter loddetinn, montering av maskinvaremodul til skorpe, vist som nedenfor:

Omfattende effektbilde ~

Anbefalt: