Sadržaj:

Kako napraviti brojač koraka?: 3 koraka (sa slikama)
Kako napraviti brojač koraka?: 3 koraka (sa slikama)

Video: Kako napraviti brojač koraka?: 3 koraka (sa slikama)

Video: Kako napraviti brojač koraka?: 3 koraka (sa slikama)
Video: Ako imate Samsung EVO KORISNIH TRIKOVA 2024, Rujan
Anonim
Image
Image
Izradite Blynk projekt
Izradite Blynk projekt

Nekada sam se dobro snašao u mnogim sportovima: hodanje, trčanje, vožnja bicikla, igranje badmintona itd.

Volim jahanje kako bih uskoro putovao. Pa, pogledaj moj trbušni trbuh …….

Pa, u svakom slučaju, odlučujem ponovno početi vježbati. Koju opremu trebam pripremiti? Osim sportskog objekta, da! Trebam instrument! Vjerujem da uz to mogu održati odgovarajuću količinu vježbe. Ovdje nastaje instrument. Počnimo s videom ~

Instrument ne samo da može bilježiti korake (i kalorije) u stvarnom vremenu, već i prikazivati vrijeme. Ono što je posebno je to što je format prikaza pokazivač ~ tako super! Stvarno, jako mi se sviđa!

Svoje zapise možete postaviti na Internet

samo jednim klikom. Sve zapise može prikazati Blynk (softver za pametni telefon koji je već predstavljen). Isti kao nosivi pametni sat, instrument dobiva vrijeme na mreži (tako da se ne morate bojati snage i ažuriranja vremena).

Hardver u Meed -u:

FireBeetle ploča-ESP32

FireBeetle pokriva-Proto ploču

OLED12864 displej zaslon

Modul ubrzanja

Baterija od 3,7 V (kupljena na mreži, glasnoća je oko 600 mAH)

3 dna (kupljeno na mreži)

Vrlo je prikladno izgraditi ovaj projekt tvrtke Blybk.

Korak 1: Izradite Blynk projekt

Dodajte dvije kontrole:

Prikaz vrijednosti * 1

Sat u stvarnom vremenu * 1

Naziv Prikaza vrijednosti trebao bi biti postavljen na korake, ali bez postavki za svojstva sata u stvarnom vremenu. Odaberite V1 kao ulazni pin kako biste prilagodili raspored kontrola, prikazan na sljedeći način.

Korak 2: Preuzmite programe na FireBeetle Board-ESP32

Kliknite ovdje za preuzimanje izvornog koda na esp32. Izvorni kod sastoji se od datoteka knjižnice i datoteka za 3D ispis. Datoteku knjižnice trebate spremiti u lib arduino. 3D datoteke mogu izravno ispisivati kore.

Ispod je glavni program

#include #include // Potrebno je samo za Arduino 1.6.5 i starije #include "SSD1306.h" // alias za `#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 zaslon (0x3c, 18, 0); OLEDDisplayUi ui (& prikaz); Mjerač vremena SimpleTimer; WidgetRTC rtc; int zaslonW = 128; int zaslonH = 64; int clockCenterX = screenW/2; int clockCenterY = ((screenH-16)/2) +16; // gornji žuti dio je 16 px visina int clockRadius = 23; #define DEVICE (0x53) // ADXL345 adresa uređaja #define TO_READ (6) // broj bajtova koje ćemo čitati svaki put (dva bajta za svaku os) bajt baf [TO_READ]; // međuspremnik od 6 bajta za spremanje podataka pročitanih s uređaja char str [100]; // međuspremnik nizova za transformaciju podataka prije slanja na serijski port int regAddress = 0x32; // prvi registar podataka o ubrzanju osi na ADXL345 int xx, yy, zz; // troosni podaci o ubrzanju static int currentValue = 0; statički nepotpisani dugi koraciSum = 0; char auth = "YourAuthToken"; // Vaše WiFi vjerodajnice. // Postavi lozinku na "" za otvorene mreže. char ssid = "Ime vaše mreže"; char pass = "Vaša lozinka"; 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, 0x00, 0x00, 0x60, 0x00, 0x00 0xF8, 0x17, 0x00, 0x00, 0xC0, 0xF8, 0x0F, 0x00, 0x00, 0xE0, 0xFB, 0x17, 0x00, 0x00, 0xC0, 0xFF, 0x13, 0x00, 0x00, 0x00, 0xFF, 0x03, 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, 0x07, 0x00, 0x00, 0xF0, 0x07, 0x00 0xF4, 0x07, 0x00, 0x00, 0x00, 0xF4, 0x0F, 0x00, 0x00, 0x00, 0xF9, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x80, 0xFE, 0x1x, 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, 0xE0, 0x00, 0xE0, 0x00, 0xC0, 0x01, 0xF0, 0x03, 0x00, 0xC0, 0x03, 0xE8, 0x07, 0x00, 0xC0, 0x03, 0x88, 0x6F, 0x00, 0x80, 0x03, 0x40, 0x1E, 0x00, 0xA0, 0xA0, 0x00 0x00. 0x00, 0xE8, 0x0F, 0x00, 0xE8, 0x00, 0xF0, 0x09, 0x00, 0x60, 0x01, 0xF0, 0x04, 0x00, 0x00, 0x00,}; // pomoćna funkcija za prikaz digitalnog sata: ispisuje vodeći 0 String twoDigits (int znamenke) {if (znamenke <10) {String i = '0'+String (znamenke); povratak i; } else {return niz (znamenke); }} void clockOverlay (OLEDDisplay * zaslon, OLEDDisplayUiState * stanje) {if ((sat () == 0) && (minuta () == 0) && (druga () == 0)) stepsSum = 0; } void analogClockFrame (OLEDDisplay * zaslon, OLEDDisplayUiState * stanje, int16_t x, int16_t y) {display-> drawCircle (clockCenterX + x, clockCenterY + y, 2); // satni otkucaji za (int z = 0; z drawLine (x2 + x, y2 + y, x3 + x, y3 + y);} // prikaz druge ruke float angle = second () * 6; angle = (angle / 57.29577951); // Pretvorimo stupnjeve u radijane int x3 = (clockCenterX + (sin (kut) * (clockRadius - (clockRadius / 5))))); int y3 = (clockCenterY - (cos (kut) * (clockRadius - (clockRadius / 5)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // prikaz minute kut kazaljke = minuta () * 6; kut = (kut / 57.29577951); // Pretvorimo stupnjeve u radijane x3 = (clockCenterX + (sin (kut) * (clockRadius - (clockRadius / 4)))); y3 = (clockCenterY - (cos (kut) * (clockRadius - (clockRadius / 4)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // prikaz kazaljke sata kut = sat () * 30 + int ((minuta () / 12) * 6); angle = (angle / 57.29577951); // Pretvorimo stupnjeve u radijane x3 = (clockCenterX + (sin (kut) * (clockRadius - (clockRadius / 2)))); y3 = (clockCenterY - (cos (kut) * (clockRadius - (clockRa dius / 2)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); } void digitalClockFrame (OLEDDisplay * zaslon, OLEDDisplayUiState * stanje, int16_t x, int16_t y) {Datum niza = Niz (godina ())+"/"+dvije znamenke (mjesec ())+"/"+dvije znamenke (dan ()); String timenow = String (sat ())+":"+dvije znamenke (minute ())+":"+dvije znamenke (druga ()); 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, datum); } void writeTo (int uređaj, adresa bajta, bajt val) {Wire.beginTransmission (uređaj); // započinjemo prijenos na uređaj Wire.write (adresa); // šalje adresu registra Wire.write (val); // šalje vrijednost za upis Wire.endTransmission (); // završi prijenos} // čita broj bajtova počevši od registra adresa na uređaju u nizu buff void readFrom (int uređaj, adresa bajta, int num, bajt buff ) {Wire.beginTransmission (uređaj); // započinjemo prijenos na uređaj Wire.write (adresa); // šalje adresu za čitanje iz Wire.endTransmission (); // kraj prijenosa Wire.beginTransmission (uređaj); // pokretanje prijenosa na uređaj Wire.requestFrom (uređaj, broj); // zahtijeva 6 bajtova od uređaja int i = 0; while (Wire.available ()) // uređaj može poslati manje od traženog (abnormalno) {buff = Wire.read (); // primiti bajt i ++; } Wire.endTransmission (); // prekid prijenosa} void runningFrame (OLEDDisplay*zaslon, OLEDDisplayUiState*stanje, 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 * stanje, int16_t x, int16_t y) {display-> setFont (ArialMT_Plain_16); display-> drawString (60, 45, "upload data …"); } // Ovaj niz zadržava pokazivače funkcija na sve okvire // okviri su pojedinačni prikazi koji klize u okvirima FrameCallback = {analogClockFrame, digitalClockFrame, runningFrame, uploadFrame}; // koliko okvira ima? int frameCount = 4; // Slojevi se statički iscrtavaju na vrhu okvira, npr. OverlayCallback prekrivanja sata = {clockOverlay}; int preklapanjaBroj = 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 (SLIDE_LEFT); ui.setFrames (okviri, frameCount); ui.setOverlays (slojevi, overlaysCount); ui.disableAutoTransition (); ui.switchToFrame (2); ui.init (); display.flipScreenVertical (); } void adxl345Init (void) {writeTo (DEVICE, 0x2D, 0); writeTo (DEVICE, 0x2D, 16); writeTo (DEVICE, 0x2D, 8); } void updateAdxl345 (void) {readFrom (DEVICE, regAddress, TO_READ, buff); // čita podatke o ubrzanju iz ADXL345 xx = (((int) baff [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); return POWER_KEY; }} if (digitalRead (D3) == LOW) {delay (5); if (digitalRead (D3) == LOW) {while (digitalRead (D3) == LOW); return MENU_KEY; }} if (digitalRead (D4) == LOW) {delay (5); if (digitalRead (D4) == LOW) {while (digitalRead (D4) == LOW); return UPLOAD_KEY; }} return 0; } void doKeysFunction (void) {static int uiFrameIndex = 2; int ključevi = getKeys (); if (ključevi == POWER_KEY) {statički znak i = 0; if (i) {ui.init (); display.flipScreenVertical (); display.displayOn (); } else {display.displayOff (); } i = ~ i; } if (ključevi == MENU_KEY) {if (upload == false) {uiFrameIndex ++; if (uiFrameIndex == 3) uiFrameIndex = 0; ui.switchToFrame (uiFrameIndex); } else {ui.switchToFrame (3); }} if (ključevi == 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 preostaliTimeBudget = ui.update (); statički int testSum = 0; if ((testSum 0) {odgoda (preostaliTimeBudget);} doKeysFunction (); timer.run ();}

Oprez: Postavke Wi-Fi-ja, putovnicu i AUTHTOKENS trebali biste sami promijeniti.

char auth = "YourAuthToken"; // Vaše WiFi vjerodajnice. // Postavi lozinku na "" za otvorene mreže. char ssid = "Ime vaše mreže"; char pass = "Vaša lozinka";

Korak 3: Povezivanje hardvera

Veza hardvera
Veza hardvera
Veza hardvera
Veza hardvera
Veza hardvera
Veza hardvera

Spojite OLED12864 i modul ubrzanja na I2C, donji dio na D2, D3, D4. Štoviše, dodajte 51k pull-up otpornika na dno kako biste dosegli 3.3V, prikazano na dolje.

Oprez: Pogrešno je spojiti pull-up otpornike na AREF, ispravno je na 3.3V

Slika hardverskog lemljenja, prikazana na sljedeći način:

Nakon lemljenja, sastavljanje hardverskog modula na koru, prikazano na sljedeći način:

Sveobuhvatna slika efekta ~

Preporučeni: