INHOUDSOPGAWE:

Hoe om 'n stappenteller te maak?: 3 stappe (met foto's)
Hoe om 'n stappenteller te maak?: 3 stappe (met foto's)

Video: Hoe om 'n stappenteller te maak?: 3 stappe (met foto's)

Video: Hoe om 'n stappenteller te maak?: 3 stappe (met foto's)
Video: Bizarre iPhone-truc: ‘Deze ken je echt niet’ 2024, Junie
Anonim
Image
Image
Skep 'n Blynk -projek
Skep 'n Blynk -projek

Ek het baie goed presteer by baie sportsoorte: stap, hardloop, fietsry, pluimbal speel, ens.

Ek hou daarvan om te ry om kort voor lank te reis. Kyk, kyk na my buik…

Wel, ek besluit om weer te begin oefen. Watter toerusting moet ek voorberei? Behalwe die sportfasiliteit, ja! Ek het 'n instrument nodig! Ek glo daarmee dat ek die nodige oefening kan behou. Hier word die instrument tot stand. Kom ons begin met 'n video ~

Die instrument kan nie net stappe (en kalorieë) intyds opneem nie, maar ook tyd wys. Wat besonders is, is dat die formaat van die vertoning wyser is ~ so gaaf! Ek hou regtig baie daarvan!

U kan u rekords na die internet oplaai

slegs met een klik. Alle rekords kan vertoon word deur Blynk ('n slimfoonsagteware wat voorheen bekendgestel is). Net soos 'n draagbare slim horlosie, kry die instrument tyd (u hoef dus nie bang te wees vir die krag en tydopdatering nie).

Hardeware in meed:

FireBeetle Board-ESP32

FireBeetle Covers-Proto Board

OLED12864 dispaly skerm

Versnellingsmodule

3.7V battery (aanlyn gekoop, die volume is ongeveer 600mAH)

3 bottels (aanlyn gekoop)

Dit is baie gerieflik om hierdie projek deur Blybk te bou.

Stap 1: Skep 'n Blynk -projek

Voeg twee kontroles by:

Waardevertoning * 1

Intydse klok * 1

Die naam van Value Display moet in stappe gestel word, maar geen instelling vir die eienskappe van Real-time klok nie. Kies V1 as die invoerpen om die uitleg van die kontroles reg te stel, soos hieronder getoon.

Stap 2: Laai programme af na FireBeetle Board-ESP32

Klik hier om die bronkode af te laai na esp32. Die bronkode bestaan uit biblioteeklêers en 3D -druklêers. U moet die biblioteeklêer stoor in lib of arduino. En die 3D -lêers kan korsies direk afdruk.

Hieronder is die hoofprogram

#include #include // Net nodig vir Arduino 1.6.5 en vroeër #include "SSD1306.h" // alias for "#include" SSD1306Wire.h "" #include "OLEDDisplayUi.h" #include "images.h" # sluit in #include #include #include #include #define POWER_KEY 1 #define MENU_KEY 2 #define UPLOAD_KEY 3 boolean upload = false; SSD1306 -skerm (0x3c, 18, 0); OLEDDisplayUi ui (& vertoon); SimpleTimer timer; WidgetRTC rtc; int skermW = 128; int skermH = 64; int clockCenterX = skermW/2; int clockCenterY = ((skermH-16)/2) +16; // die boonste geel deel is 16 px hoogte int clockRadius = 23; #define TOESTEL (0x53) // ADXL345 -toesteladres #define TO_READ (6) // aantal grepe wat ons elke keer gaan lees (twee grepe vir elke as) byte buff [TO_READ]; // 6 grepe buffer vir die stoor van data gelees vanaf die apparaat char str [100]; // string buffer om data te transformeer voordat dit na die seriële poort int regAddress = 0x32 gestuur word; // eerste as-versnellingsdataregister op die ADXL345 int xx, yy, zz; // drie -as versnellingsdata staties int currentValue = 0; statiese ongetekende lang stappeSum = 0; char auth = "YourAuthToken"; // U WiFi -geloofsbriewe. // Stel wagwoord op "" vir oop netwerke. char ssid = "Jou netwerknaam"; 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, 0x07, 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, 0x00, 0x0, 0x0, 0x00, 0xE8, 0x0F, 0x00, 0xE8, 0x00, 0xF0, 0x09, 0x00, 0x60, 0x01, 0xF0, 0x04, 0x00, 0x00, 0x00,}; // nutfunksie vir digitale horlosie: druk voorste 0 string twee digte (int syfers) {if (syfers <10) {string i = '0'+string (syfers); terugkeer i; } anders {return String (syfers); }} 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); // uur merk vir (int z = 0; z drawLine (x2 + x, y2 + y, x3 + x, y3 + y);} // vertoon tweedehandse vlotterhoek = tweede () * 6; hoek = (hoek / 57.29577951); // Skakel grade om na radiale int x3 = (clockCenterX + (sin (hoek) * (clockRadius - (clockRadius / 5))))); int y3 = (clockCenterY - (cos (hoek) * (clockRadius - (clockRadius / 5))))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // vertoon minuutwyserhoek = minuut () * 6; hoek = (hoek / 57.29577951); // Skakel grade om na radiale x3 = (clockCenterX + (sin (hoek) * (clockRadius - (clockRadius / 4))))); y3 = (clockCenterY - (cos (hoek) * (clockRadius - (clockRadius / 4))))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // vertoon uurwyserhoek = uur () * 30 + int ((minuut () / 12) * 6); hoek = (hoek / 57.29577951); // Skakel grade om na radiale x3 = (clockCenterX + (sin (hoek) * (clockRadius - (clockRadius / 2))))); y3 = (clockCenterY - (cos (hoek) * (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 (hour ())+":"+twoDigits (minute ())+":"+twoDigits (second ()); display-> setTextAlignment (TEXT_ALIGN_CENTER); display-> setFont (ArialMT_Plain_24); display-> drawString (clockCenterX + x, 20, tydsnauw); display-> setFont (ArialMT_Plain_16); display-> drawString (60, 45, datum); } void writeTo (int device, byte address, byte val) {Wire.beginTransmission (device); // begin oordrag na Wire.write -toestel (adres); // stuur registeradres Wire.write (val); // stuur waarde om Wire.endTransmission () te skryf; // einde transmissie} // lees getalle grepe vanaf adresregister op toestel in na buff array leeg leesFrom (int toestel, byte adres, int num, byte buff ) {Wire.beginTransmission (toestel); // begin oordrag na Wire.write -toestel (adres); // stuur adres om te lees vanaf Wire.endTransmission (); // beëindig transmissie Wire.beginTransmission (toestel); // begin oordrag na toestel Wire.requestFrom (toestel, num); // versoek 6 grepe van die toestel int i = 0; terwyl (Wire.available ()) // toestel minder as versoek (abnormaal) {buff = Wire.read () kan stuur; // ontvang 'n greep 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, "laai data op …"); } // Hierdie skikking hou funksieaanwysings na alle rame // rame is die enkele aansigte wat in FrameCallback -rame gly = {analogClockFrame, digitalClockFrame, runningFrame, uploadFrame}; // hoeveel rame is daar? int frameCount = 4; // Oorleggings word staties bo -op 'n raam geteken, bv. 'n klok OverlayCallback overlays = {clockOverlay}; int overlaysCount = 1; void uploadToBlynk (void) {if (upload == true) {Blynk.virtualWrite (V0, stepsSum); 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 (rame, frameCount); ui.setOverlays (overlays, overlaysCount); ui.disableAutoTransition (); ui.switchToFrame (2); ui.init (); display.flipScreenVertically (); } void adxl345Init (void) {writeTo (DEVICE, 0x2D, 0); writeTo (TOESTEL, 0x2D, 16); writeTo (TOESTEL, 0x2D, 8); } void updateAdxl345 (void) {readFrom (DEVICE, regAddress, TO_READ, buff); // lees die versnellingsdata van die ADXL345 xx = (((int) buff [1]) << 8) | buff [0]; jj = (((int) buff [3]) << 8) | buff [2]; zz = (((int) buff [5]) << 8) | buff [4]; if (xx 80) {if (xx <currentValue) {stepsSum ++; } huidige waarde = xx; } sprintf (str, "%d", stepsSum); } int getKeys (void) {if (digitalRead (D2) == LOW) {delay (5); if (digitalRead (D2) == LOW) {terwyl (digitalRead (D2) == LOW); stuur POWER_KEY terug; }} if (digitalRead (D3) == LOW) {vertraging (5); if (digitalRead (D3) == LOW) {terwyl (digitalRead (D3) == LOW); terugkeer MENU_KEY; }} if (digitalRead (D4) == LOW) {vertraging (5); if (digitalRead (D4) == LOW) {terwyl (digitalRead (D4) == LOW); stuur UPLOAD_KEY terug; }} gee 0 terug; } void doKeysFunction (void) {static int uiFrameIndex = 2; int sleutels = getKeys (); as (sleutels == POWER_KEY) {statiese karakter i = 0; as (i) {ui.init (); display.flipScreenVertically (); display.displayOn (); } anders {display.displayOff (); } i = ~ i; } if (sleutels == MENU_KEY) {if (oplaai == vals) {uiFrameIndex ++; as (uiFrameIndex == 3) uiFrameIndex = 0; ui.switchToFrame (uiFrameIndex); } anders {ui.switchToFrame (3); }} if (sleutels == UPLOAD_KEY) {if (oplaai == waar) {oplaai = vals; ui.switchToFrame (uiFrameIndex); } anders {oplaai = waar; ui.switchToFrame (3); }}} ongeldige opstelling () {pinMode (D2, INPUT); pinMode (D3, INVOER); pinMode (D4, INVOER); Blynk.begin (auth, ssid, pass); rtc.begin (); uiInit (); adxl345Init (); timer.setInterval (30, updateAdxl345); timer.setInterval (100, uploadToBlynk); } leemte -lus () {int stayingTimeBudget = ui.update (); static int testSum = 0; if ((testSum 0) {delay (stayingTimeBudget);} doKeysFunction (); timer.run ();}

Let op: U moet die Wi-Fi-instelling, paspoort en AUTHTOKENS vir u self verander.

char auth = "YourAuthToken"; // U WiFi -geloofsbriewe. // Stel wagwoord op "" vir oop netwerke. char ssid = "Jou netwerknaam"; char pass = "YourPassword";

Stap 3: Hardewareverbinding

Hardewareverbinding
Hardewareverbinding
Hardewareverbinding
Hardewareverbinding
Hardewareverbinding
Hardewareverbinding

Koppel OLED12864 en versnellingsmodule aan I2C, onderkant na D2, D3, D4. Voeg voorts 51k optrekweerstands by die onderkant om 3.3V te bereik, soos hieronder getoon.

Let op: dit is verkeerd om optrekweerstands aan AREF te koppel, die regte een op 3.3V

Die hardeware soldeerbeeld, soos hieronder getoon:

Na die soldeer, monteer die hardeware -module na die kors, soos hieronder getoon:

Omvattende effekbeeld ~

Aanbeveel: