Kazalo:

Kako narediti števec korakov?: 3 koraki (s slikami)
Kako narediti števec korakov?: 3 koraki (s slikami)

Video: Kako narediti števec korakov?: 3 koraki (s slikami)

Video: Kako narediti števec korakov?: 3 koraki (s slikami)
Video: НЕ ВЗДУМАЙ снимать аккумулятор с машины. Делай это ПРАВИЛЬНО ! 2024, November
Anonim
Image
Image
Ustvarite projekt Blynk
Ustvarite projekt Blynk

Včasih sem bil uspešen pri številnih športih: hoja, tek, vožnja s kolesom, igranje badmintona itd.

Obožujem jahanje, da bi kmalu potoval naokoli. No, poglej moj trden trebuh …….

No, vseeno se odločim, da bom znova začel vaditi. Kakšno opremo naj pripravim? Poleg športnega objekta, ja! Rabim inštrument! Verjamem, da lahko ob tem vzdržujem ustrezno količino vadbe. Tu nastane inštrument. Začnimo z video ~

Instrument ne more samo beležiti korakov (in kalorij) v realnem času, ampak tudi prikazati čas. Posebnost je, da je oblika prikaza kazalka ~ tako kul! Res, zelo mi je všeč!

Svoje zapise lahko naložite v internet

samo z enim klikom. Vse zapise lahko prikaže Blynk (prej predstavljena programska oprema za pametne telefone). Tako kot nosljiva pametna ura, instrument dobi čas na spletu (zato se vam ni treba bati moči in časa posodabljanja).

Strojna oprema v sistemu meed:

FireBeetle Board-ESP32

FireBeetle pokriva proto ploščo

Displejski zaslon OLED12864

Modul pospeševanja

3,7 V baterija (kupljena na spletu, glasnost je okoli 600 mAH)

3 gumbi (kupljeni na spletu)

Ta projekt podjetja Blybk je zelo priročno zgraditi.

1. korak: Ustvarite projekt Blynk

Dodajte dva kontrolnika:

Prikaz vrednosti * 1

Ura v realnem času * 1

Ime prikaza vrednosti bi moralo biti nastavljeno na korake, vendar brez nastavitev za lastnosti ure v realnem času. Izberite V1 kot vhodni pin, da prilagodite postavitev kontrol, prikazano spodaj.

2. korak: Prenesite programe na FireBeetle Board-ESP32

Kliknite tukaj za prenos izvorne kode v esp32. Izvorno kodo sestavljajo knjižnične datoteke in datoteke 3D tiskanja. Datoteko knjižnice shranite v lib arduino. 3D datoteke lahko neposredno natisnejo skorje.

Spodaj je glavni program

#include #include // Potrebno samo za Arduino 1.6.5 in starejše #include "SSD1306.h" // vzdevek 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; Zaslon SSD1306 (0x3c, 18, 0); OLEDDisplayUi ui (& zaslon); Časovnik SimpleTimer; WidgetRTC rtc; int zaslonW = 128; int zaslonH = 64; int clockCenterX = screenW/2; int clockCenterY = ((screenH-16)/2) +16; // zgornji rumeni del je 16 px višina int clockRadius = 23; #define DEVICE (0x53) // Naslov naprave ADXL345 #define TO_READ (6) // število bajtov, ki jih bomo vsakič prebrali (dva bajta za vsako os) bajt baf [TO_READ]; // 6 bajtni vmesnik za shranjevanje podatkov, prebranih iz naprave char str [100]; // nizovni vmesnik za pretvorbo podatkov, preden jih pošljemo na serijska vrata int regAddress = 0x32; // prvi register podatkov o pospeševanju osi na ADXL345 int xx, yy, zz; // triosni pospeški podatkov static int currentValue = 0; statični nepodpisani dolgi korakiSum = 0; char auth = "YourAuthToken"; // Vaše poverilnice WiFi. // Za odprta omrežja nastavite geslo na "". char ssid = "Ime vašega omrežja"; char pass = "Vaša geslo"; 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, 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, 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, 0xE0, 0x00, 0xC0, 0x01, 0xF0, 0x03, 0x00, 0xC0, 0x03, 0xE8, 0x07, 0x00, 0xC0, 0x03, 0x88, 0x6F, 0x00, 0x80, 0x03, 0x40, 0x1E, 0x00, 0xA0, 0x00, 0xA0, 0x00, 0x80, 0x03, 0x00, 0xF8, 0x01, 0x00, 0x07, 0x00, 0xF4, 0x00, 0x00, 0x07, 0x00, 0xE8, 0x00, 0x80, 0x0F, 0x00, 0xE8, 0x00, 0x90, 0x0, 0x0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0x00, 0xE8, 0x0F, 0x00, 0xE8, 0x00, 0xF0, 0x09, 0x00, 0x60, 0x01, 0xF0, 0x04, 0x00, 0x00, 0x00,}; // pomožna funkcija za prikaz digitalne ure: natisne začetni 0 niz dvaDigits (int števke) {if (števke <10) {String i = '0'+niz (števke); vrniti i; } else {vrni niz (številke); }} void clockOverlay (prikaz OLEDDisplay *, stanje OLEDDisplayUiState *) {if ((ura () == 0) && (minuta () == 0) && (druga () == 0)) korakiSum = 0; } void analogClockFrame (zaslon OLEDDisplay *, stanje OLEDDisplayUiState *, int16_t x, int16_t y) {display-> drawCircle (clockCenterX + x, clockCenterY + y, 2); // urne oznake za (int z = 0; z drawLine (x2 + x, y2 + y, x3 + x, y3 + y);} // prikaz sekundarnega plavajočega kota = sekunda () * 6; kot = (kot / 57.29577951); // Pretvorimo stopinje v radiane int x3 = (clockCenterX + (sin (kot) * (clockRadius - (clockRadius / 5))))); int y3 = (clockCenterY - (cos (kot)) * (clockRadius - (clockRadius / 5)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // prikaz minutnega kazalnega kota = minute () * 6; kot = (kot / 57.29577951); // Pretvorimo stopinje v radiane x3 = (clockCenterX + (sin (kot)) * (clockRadius - (clockRadius / 4)))); y3 = (clockCenterY - (cos (kot) * (clockRadius - (clockRadius / 4)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // prikaz urnega kota kazalca = ura () * 30 + int ((minute () / 12) * 6); angle = (angle / 57.29577951); // Pretvorimo stopinje v radiane x3 = (clockCenterX + (sin (kot) * (clockRadius - (clockRadius / 2))))) clockRadius - (clockRa dius / 2)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); } void digitalClockFrame (zaslon OLEDDisplay *, stanje OLEDDisplayUiState *, int16_t x, int16_t y) {Datum niza = String (leto ())+"/"+dve številki (mesec ())+"/"+dve številki (dan ()); Niz timenow = String (ura ())+":"+dve številki (minuta ())+":"+dve številki (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 naprava, naslov bajtov, bajt val) {Wire.beginTransmission (naprava); // zaženemo prenos na napravo Wire.write (naslov); // pošljite naslov registra Wire.write (val); // pošlji vrednost za zapis Wire.endTransmission (); // zaključek prenosa} // bere število bajtov, ki se začnejo od registra naslovov na napravi v nizu buff void readFrom (int naprava, naslov bajta, int num, bajt buff ) {Wire.beginTransmission (naprava); // zaženemo prenos na napravo Wire.write (naslov); // pošlje naslov za branje iz Wire.endTransmission (); // konec prenosa Wire.beginTransmission (naprava); // zaženemo prenos na napravo Wire.requestFrom (device, num); // zahteva 6 bajtov od naprave int i = 0; while (Wire.available ()) // naprava lahko pošlje manj od zahtevanega (nenormalno) {buff = Wire.read (); // prejemam bajt i ++; } Wire.endTransmission (); // konec prenosa} void runningFrame (zaslon OLEDDisplay*, stanje OLEDDisplayUiState*, 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 (prikaz OLEDDisplay *, stanje OLEDDisplayUiState *, int16_t x, int16_t y) {display-> setFont (ArialMT_Plain_16); display-> drawString (60, 45, "naloži podatke …"); } // Ta matrika vodi funkcijske kazalce na vse okvirje // okvirji so posamezni pogledi, ki drsijo v okvirjih FrameCallback = {analogClockFrame, digitalClockFrame, runningFrame, uploadFrame}; // koliko okvirjev je? int frameCount = 4; // Prekrivanja so statično narisana na vrhu okvirja, npr. prekrivanje ure OverlayCallback = {clockOverlay}; int prekrivanjaCount = 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 (okvirji, frameCount); ui.setOverlays (prekrivanja, overlaysCount); ui.disableAutoTransition (); ui.switchToFrame (2); ui.init (); display.flipScreenVertical (); } void adxl345Init (void) {writeTo (DEVICE, 0x2D, 0); writeTo (NAPRAVA, 0x2D, 16); writeTo (NAPRAVA, 0x2D, 8); } void updateAdxl345 (void) {readFrom (DEVICE, regAddress, TO_READ, buff); // preberemo podatke o pospeševanju iz ADXL345 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); vrni 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; }} vrni 0; } void doKeysFunction (void) {static int uiFrameIndex = 2; int ključi = getKeys (); if (ključi == POWER_KEY) {statični znak i = 0; če (i) {ui.init (); display.flipScreenVertical (); display.displayOn (); } else {display.displayOff (); } i = ~ i; } if (keys == MENU_KEY) {if (upload == false) {uiFrameIndex ++; if (uiFrameIndex == 3) uiFrameIndex = 0; ui.switchToFrame (uiFrameIndex); } else {ui.switchToFrame (3); }} if (keys == 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čni int testSum = 0; if ((testSum 0) {zakasnitev (preostaliTimeBudget);} doKeysFunction (); timer.run ();}

Pozor: Nastavitve Wi-Fi, potni list in AUTOTOKENE morate spremeniti sami.

char auth = "YourAuthToken"; // Vaše poverilnice WiFi. // Za odprta omrežja nastavite geslo na "". char ssid = "Ime vašega omrežja"; char pass = "Vaša geslo";

3. korak: Povezava strojne opreme

Povezava strojne opreme
Povezava strojne opreme
Povezava strojne opreme
Povezava strojne opreme
Povezava strojne opreme
Povezava strojne opreme

OLED12864 in modul za pospeševanje priključite na I2C, spodnji na D2, D3, D4. Poleg tega dodajte 51k vlečnih uporov na dno, da dosežete 3.3V, kot je prikazano spodaj.

Pozor: Napačno je priključiti vlečne upore na AREF, pravi je na 3,3 V.

Slika spajkanja strojne opreme, prikazana spodaj:

Po spajkanju sestavite strojni modul na skorjo, kot je prikazano spodaj:

Celovita slika učinka ~

Priporočena: