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, Jun
Anonim
Image
Image
Kreirajte Blynk projekt
Kreirajte Blynk projekt

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

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

Pa, u svakom slučaju, odlučujem ponovno početi vježbati. Koju opremu treba pripremiti? Osim sportskog objekta, da! Treba mi 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! Zaista, zaista mi se sviđa!

Svoje zapise možete postaviti na Internet

samo jednim klikom. Sve zapise može prikazati Blynk (softver za pametne telefone predstavljen ranije). 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 ekran

Modul ubrzanja

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

3 dna (kupljeno na mreži)

Vrlo je zgodno izgraditi ovaj Blybkov projekt.

Korak 1: Kreirajte Blynk projekt

Dodajte dvije kontrole:

Prikaz vrijednosti * 1

Sat u stvarnom vremenu * 1

Naziv prikaza vrijednosti treba postaviti na korake, ali bez postavki za svojstva sata realnog vremena. Odaberite V1 kao ulazni pin za prilagođavanje izgleda kontrola, prikazanog na donjoj slici.

Korak 2: Preuzmite programe na FireBeetle Board-ESP32

Kliknite ovdje za preuzimanje izvornog koda na esp32. Izvorni kod se sastoji od datoteka biblioteke i datoteka za 3D štampanje. Trebate spremiti datoteku knjižnice u lib of arduino. 3D datoteke mogu direktno štampati kore.

Ispod je glavni program

#include #include // Potrebno 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 ekran (0x3c, 18, 0); OLEDDisplayUi ui (& prikaz); SimpleTimer timer; WidgetRTC rtc; int screenW = 128; int screenH = 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) bajf bajtova [TO_READ]; // međuspremnik od 6 bajtova za spremanje podataka pročitanih s uređaja char str [100]; // međuspremnik stringova 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ši WiFi akreditivi. // Postavite 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, 0x60, 0xF1, 0x07, 0x00, 0x00, 0x60 0xF8, 0x17, 0x00, 0x00, 0xC0, 0xF8, 0x0F, 0x00, 0x00, 0xE0, 0xFB, 0x17, 0x00, 0x00, 0xC0, 0xFF, 0x13, 0x00, 0x00, 0x00, 0xFF, 0x02, 0x00 0xFE, 0x03, 0x00, 0x00, 0x00, 0xF9, 0x03, 0x00, 0x00, 0x00, 0xFA, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 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, 0x1F, 0x1, 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, 0x00 0x00, 0xC0, 0x01, 0xF0, 0x03, 0x00, 0xC0, 0x03, 0xE8, 0x07, 0x00, 0xC0, 0x03, 0x88, 0x6F, 0x00, 0x80, 0x03, 0x40, 0x1E, 0x00, 0xA0, 0xAx, 0x00, 0x80, 0x03, 0x00, 0xF8, 0x01, 0x00, 0x07, 0x00, 0xF4, 0x00, 0x00, 0x07, 0x00, 0xE8, 0x00, 0x80, 0x0F, 0x00, 0xE8, 0x00, 0x90, 0x0, 0x 0, 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); return i; } else {return String (cifre); }} void clockOverlay (OLEDDisplay * prikaz, OLEDDisplayUiState * stanje) {if ((sat () == 0) && (minuta () == 0) && (druga () == 0)) koraciSum = 0; } void analogClockFrame (OLEDDisplay * display, 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 stepene u radijane int x3 = (clockCenterX + (sin (ugao) * (clockRadius - (clockRadius / 5))))); int y3 = (clockCenterY - (cos (ugao)) * (clockRadius - (clockRadius / 5)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // prikaz minute kazaljke ugao = minute () * 6; ugao = (ugao / 57.29577951); // Pretvorimo stepene 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 ugla kazaljke sata = sat () * 30 + int ((minuta () / 12) * 6); angle = (angle / 57.29577951); // Pretvorimo stepene 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 * display, OLEDDisplayUiState * stanje, int16_t x, int16_t y) {String date = String (godina ())+"/"+dvije cifre (mjesec ())+"/"+dvije cifre (dan ()); String timenow = String (hour ())+":"+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, 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šava prenos} // čita broj bajtova počevši od registra adresa na uređaju u nizu baffova void readFrom (int uređaj, adresa bajta, int broj, bajt buff ) {Wire.beginTransmission (uređaj); // započinjemo prijenos na uređaj Wire.write (adresa); // šalje adresu za čitanje iz Wire.endTransmission (); // prekid prijenosa Wire.beginTransmission (uređaj); // započinjemo prijenos 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 zahtijevanog (abnormalno) {buff = Wire.read (); // primimo bajt i ++; } Wire.endTransmission (); // prekid prijenosa} void runningFrame (OLEDDisplay*prikaz, 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 prekrivači sata = {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 (SLIDE_LEFT); ui.setFrames (okviri, frameCount); ui.setOverlays (prekrivanja, 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) baff [3]) << 8) | buff [2]; zz = (((int) baff [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, pasoš i AUTHTOKENS trebali biste sami promijeniti.

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

Korak 3: Povezivanje hardvera

Hardverska veza
Hardverska veza
Hardverska veza
Hardverska veza
Hardverska veza
Hardverska veza

Spojite OLED12864 i modul ubrzanja na I2C, donji dio na D2, D3, D4. Osim toga, dodajte 51k pull-up otpornika na dno kako biste dosegli 3.3V, prikazano na donjoj slici.

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

Slika hardverskog lemljenja, prikazana na sljedećoj slici:

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

Sveobuhvatna slika efekta ~

Preporučuje se: