Sisällysluettelo:

Kuinka tehdä askellaskuri?: 3 vaihetta (kuvilla)
Kuinka tehdä askellaskuri?: 3 vaihetta (kuvilla)

Video: Kuinka tehdä askellaskuri?: 3 vaihetta (kuvilla)

Video: Kuinka tehdä askellaskuri?: 3 vaihetta (kuvilla)
Video: Garmin Forerunner 955 (Solar) yksityiskohtainen arvostelu 2024, Marraskuu
Anonim
Image
Image
Luo Blynk -projekti
Luo Blynk -projekti

Toimin hyvin monissa urheilulajeissa: kävely, juoksu, pyöräily, sulkapallo jne.

Rakastan ratsastaa ja matkustaa ympäri ennen pitkää. Katsokaa minun vatsaani …….

No, joka tapauksessa, päätän aloittaa harjoituksen uudelleen. Mitä laitteita minun pitäisi valmistaa? Urheilutilojen lisäksi kyllä! Tarvitsen soittimen! Uskon sen avulla, että voin pitää riittävästi liikuntaa. Tässä instrumentti syntyy. Aloitetaan videolla ~

Laite ei voi vain tallentaa askeleita (ja kaloreita) reaaliajassa, vaan näyttää ajan. Erityistä on, että esitysmuoto on osoitin ~ niin siistiä! Pidän todella, todella!

Voit ladata tietueet Internetiin

vain yhdellä napsautuksella. Kaikki tietueet voidaan näyttää Blynkillä (aiemmin esitellyt älypuhelinohjelmisto). Sama kuin puettava älykello, laite saa aikaa verkossa (joten sinun ei tarvitse pelätä tehon ja ajan päivitystä).

Laitteisto meedissä:

FireBeetle Board-ESP32

FireBeetlen kannet-Proto-lauta

OLED12864 -näyttö

Kiihdytysmoduuli

3,7 V akku (ostettu verkosta, äänenvoimakkuus on noin 600 mAh)

3 pulloa (ostettu verkosta)

On erittäin kätevää rakentaa tämä projekti Blybkin toimesta.

Vaihe 1: Luo Blynk -projekti

Lisää kaksi ohjainta:

Arvonäyttö * 1

Reaaliaikainen kello * 1

Arvonäytön nimi on asetettava askeleisiin, mutta ei asetusta reaaliaikaisen kellon ominaisuuksiin. Säädä säätimien asettelua valitsemalla tulonapiksi V1, kuten alla on esitetty.

Vaihe 2: Lataa ohjelmat FireBeetle Board-ESP32: een

Lataa lähdekoodi esp32 -tiedostoon napsauttamalla tätä. Lähdekoodi koostuu kirjastotiedostoista ja 3D -tulostustiedostoista. Tallenna kirjastotiedosto arduinon lib -tiedostoon. Ja 3D -tiedostot voivat tulostaa kuoret suoraan.

Alla pääohjelma

#include #include // Tarvitaan vain Arduino 1.6.5: lle ja sitä vanhemmille #include "SSD1306.h" // alias kohteelle "#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 -näyttö (0x3c, 18, 0); OLEDDisplayUi ui (& näyttö); SimpleTimer -ajastin; WidgetRTC rtc; int -näyttöW = 128; int -näyttö H = 64; int clockCenterX = näyttöW/2; int clockCenterY = ((näyttöH-16)/2) +16; // ylin keltainen osa on 16 px korkeus int clockRadius = 23; #define DEVICE (0x53) // ADXL345 -laiteosoite #define TO_READ (6) // tavujen lukumäärä, jonka aiomme lukea joka kerta (kaksi tavua kullekin akselille), tavupuskuri [TO_READ]; // 6 tavun puskuri laitteesta luetun datan tallentamiseen char str [100]; // merkkijonopuskuri tietojen muuttamiseksi ennen niiden lähettämistä sarjaporttiin int regAddress = 0x32; // ensimmäisen akselin kiihdytystietorekisteri ADXL345: ssä int xx, yy, zz; // kolmen akselin kiihdytystiedot staattinen int currentValue = 0; staattiset allekirjoittamattomat pitkät askeleetSum = 0; char auth = "YourAuthToken"; // WiFi -kirjautumistietosi. // Aseta salasana "" avoimille verkoille. char ssid = "Oma verkkosiNimi"; char pass = "Oma salasana"; const char running_Logo_bits OHJELMA = {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, 0x03 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, 0x80 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,}; // digitaalisen kellon näytön apuohjelma: tulostaa alun 0 -merkkijono kaksiDigits (int -numerot) {if (numerot <10) {String i = '0'+String (numerot); palauta i; } else {return Merkkijono (numeroa); }} void clockOverlay (OLEDDisplay * -näyttö, OLEDDisplayUiState * -tila) {if ((hour () == 0) && (minute () == 0) && (second () == 0)) stepsSum = 0; } void analogClockFrame (OLEDDisplay * -näyttö, OLEDDisplayUiState * -tila, int16_t x, int16_t y) {display-> drawCircle (clockCenterX + x, clockCenterY + y, 2); // tunti rasti (int z = 0; z drawLine (x2 + x, y2 + y, x3 + x, y3 + y);} // näyttää käytetyn kellukulman = sekunti () * 6; kulma = (kulma / 57.29577951); // Muunna astetta radiaaneiksi int x3 = (clockCenterX + (sin (kulma) * (clockRadius - (clockRadius / 5))))); int y3 = (clockCenterY - (cos (kulma) * * (clockRadius - (clockRadius / 5)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // näyttö minuutin käden kulma = minuutti () * 6; kulma = (kulma / 57.29577951); // Muunna astetta radiaaneiksi x3 = (clockCenterX + (sin (kulma) * (clockRadius - (clockRadius / 4))))); y3 = (clockCenterY - (cos (kulma) * (clockRadius - (clockRadius / 4)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // näyttötunnin käden kulma = tunti () * 30 + int ((minuutti () / 12) * 6); kulma = (kulma / 57.29577951); // Muunna astetta radiaaneiksi x3 = (clockCenterX + (sin (kulma) * (clockRadius - (clockRadius / 2))))); y3 = (clockCenterY - (cos (kulma) * * (clockRadius - (clockRa dius / 2)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); } void digitalClockFrame (OLEDDisplay * -näyttö, OLEDDisplayUiState * -tila, int16_t x, int16_t y) {String date = String (year ())+"/"+twoDigits (month ())+"/"+twoDigits (day ()); Merkkijonon aika = Jono (tunti ())+":"+kaksi numeroa (minuutti ())+":"+kaksi numeroa (toinen ()); display-> setTextAlignment (TEXT_ALIGN_CENTER); näyttö-> setFont (ArialMT_Plain_24); näyttö-> drawString (clockCenterX + x, 20, timenow); näyttö-> setFont (ArialMT_Plain_16); näyttö-> drawString (60, 45, päivämäärä); } void writeTo (int laite, tavuosoite, tavu val) {Wire.beginTransmission (laite); // aloita siirto laitteelle Wire.write (osoite); // lähetä rekisteriosoite Wire.write (val); // lähetä arvo kirjoittaa Wire.endTransmission (); // lopeta lähetys} // lukee numeja tavuista alkaen laitteen osoiterekisteristä puskurimatriisiin void readFrom (int -laite, tavuosoite, int -numero, tavupuskuri ) {Wire.beginTransmission (laite); // aloita siirto laitteelle Wire.write (osoite); // lähettää luettavan osoitteen Wire.endTransmission (); // lopeta lähetys Wire.beginTransmission (laite); // aloita siirto laitteelle Wire.requestFrom (laite, numero); // pyytää 6 tavua laitteelta int i = 0; while (Wire.available ()) // laite voi lähettää vähemmän kuin pyydetty (epänormaali) {buff = Wire.read (); // vastaanottaa tavun i ++; } Wire.endTransmission (); // lopeta lähetys} void runningFrame (OLEDDisplay*-näyttö, OLEDDisplayUiState*-tila, int16_t x, int16_t y) {float calValue = stepsSum*0.4487; display-> setTextAlignment (TEXT_ALIGN_CENTER); näyttö-> setFont (ArialMT_Plain_24); näyttö-> drawString (clockCenterX, clockCenterY, str); sprintf (str, "%.2fcal", calValue); display-> setTextAlignment (TEXT_ALIGN_CENTER); näyttö-> setFont (ArialMT_Plain_10); näyttö-> drawString (100, 20, str); näyttö-> drawXbm (10, 14, 34, 50, running_Logo_bits); } void uploadFrame (OLEDDisplay * -näyttö, OLEDDisplayUiState * -tila, int16_t x, int16_t y) {display-> setFont (ArialMT_Plain_16); display-> drawString (60, 45, "lähetä tiedot…"); } // Tämä taulukko pitää toimintojen osoittimet kaikkiin kehyksiin // kehykset ovat yksittäisiä näkymiä, jotka liukuvat FrameCallback -kehyksissä = {analogClockFrame, digitalClockFrame, runningFrame, uploadFrame}; // kuinka monta kehystä on? int frameCount = 4; // Peittokuvat piirretään staattisesti kehyksen päälle, esim. a clock OverlayCallback overlays = {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 (DIA_LEFT); ui.setFrames (kehykset, frameCount); ui.setOverlays (peittokuvat, overlaysCount); ui.disableAutoTransition (); ui.switchToFrame (2); ui.init (); display.flipScreenVertically (); } void adxl345Init (void) {writeTo (LAITE, 0x2D, 0); writeTo (LAITE, 0x2D, 16); writeTo (LAITE, 0x2D, 8); } void updateAdxl345 (void) {readFrom (DEVICE, regAddress, TO_READ, buff); // lukee kiihdytystiedot ADXL345: stä 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 ++; } currentValue = xx; } sprintf (str, "%d", stepsSum); } int getKeys (void) {if (digitalRead (D2) == LOW) {delay (5); if (digitalRead (D2) == LOW) {while (digitalRead (D2) == LOW); palauta POWER_KEY; }} if (digitalRead (D3) == LOW) {delay (5); if (digitalRead (D3) == LOW) {while (digitalRead (D3) == LOW); palauta MENU_KEY; }} if (digitalRead (D4) == LOW) {delay (5); if (digitalRead (D4) == LOW) {while (digitalRead (D4) == LOW); palauta UPLOAD_KEY; }} paluu 0; } void doKeysFunction (void) {static int uiFrameIndex = 2; int avaimet = getKeys (); if (avaimet == POWER_KEY) {staattinen merkki i = 0; jos (i) {ui.init (); display.flipScreenVertically (); display.displayOn (); } else {display.displayOff (); } i = ~ i; } if (avaimet == MENU_KEY) {if (upload == false) {uiFrameIndex ++; jos (uiFrameIndex == 3) uiFrameIndex = 0; ui.switchToFrame (uiFrameIndex); } else {ui.switchToFrame (3); }} jos (avaimet == UPLOAD_KEY) {jos (lataa == tosi) {lataa = epätosi; 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 ülejäänudTimeBudget = ui.update (); staattinen int testSum = 0; if ((testSum 0) {delay (leftTimeBudget);} doKeysFunction (); timer.run ();}

Varoitus: Muuta Wi-Fi-asetusta, passia ja AUTHTOKENS-tiedostoja itse.

char auth = "YourAuthToken"; // WiFi -kirjautumistietosi. // Aseta salasana "" avoimille verkoille. char ssid = "Oma verkkosiNimi"; char pass = "Oma salasana";

Vaihe 3: Laitteistoyhteys

Laitteistoyhteys
Laitteistoyhteys
Laitteistoyhteys
Laitteistoyhteys
Laitteistoyhteys
Laitteistoyhteys

Liitä OLED12864 ja kiihdytysmoduuli I2C: hen, pohjat D2, D3, D4. Lisäksi lisää 51k: n vetovastusvastuksia pohjaan, jotta se saavuttaa 3,3 V: n, kuten alla on esitetty.

Varoitus: On väärin kytkeä vetovastusvastukset AREF: ään, oikea on 3.3 V

Laitteiston juotoskuva, joka on esitetty alla:

Juottamisen jälkeen laitteistomoduulin kokoaminen kuoreen, kuten alla:

Kattava vaikutus kuva ~

Suositeltava: