Obsah:

Jak udělat počítadlo kroků?: 3 kroky (s obrázky)
Jak udělat počítadlo kroků?: 3 kroky (s obrázky)

Video: Jak udělat počítadlo kroků?: 3 kroky (s obrázky)

Video: Jak udělat počítadlo kroků?: 3 kroky (s obrázky)
Video: Pletky s copy - francouzský cop 2024, Listopad
Anonim
Image
Image
Vytvořte projekt Blynk
Vytvořte projekt Blynk

Měl jsem dobrý výkon v mnoha sportech: chůze, běh, jízda na kole, hraní badmintonu atd.

Miluji jízdu, abych mohl dlouho cestovat. Podívejte se na mé bříško ……

No, každopádně jsem se rozhodl začít cvičit. Jaké vybavení si mám připravit? Kromě sportovního zařízení ano! Potřebuji nástroj! Věřím, že s tím dokážu udržet přiměřené množství cvičení. Zde nástroj vzniká. Začněme videem ~

Přístroj může nejen zaznamenávat kroky (a kalorie) v reálném čase, ale také ukazovat čas. Zvláštní je, že formát zobrazení je ukazatel ~ tak skvělý! Moc, moc se mi to líbí!

Své záznamy můžete nahrát na internet

pouze jedním kliknutím. Všechny záznamy může zobrazit Blynk (software pro chytrý telefon představený dříve). Stejně jako u chytrých hodinek, které lze nosit, nástroj získá čas online (takže se nemusíte bát aktualizace napájení a času).

Hardware v meed:

FireBeetle Board-ESP32

FireBeetle Covers-Proto Board

Displej displeje OLED12864

Zrychlovací modul

Baterie 3,7 V (zakoupeno online, objem kolem 600 mAh)

3 botičky (zakoupeno online)

Je velmi výhodné postavit tento projekt společností Blybk.

Krok 1: Vytvořte projekt Blynk

Přidejte dva ovládací prvky:

Zobrazení hodnoty * 1

Hodiny reálného času * 1

Název zobrazení hodnoty by měl být nastaven na kroky, ale žádné nastavení pro vlastnosti hodin reálného času. Zvolte V1 jako vstupní kolík a upravte rozložení ovládacích prvků, jak je znázorněno níže.

Krok 2: Stáhněte si programy do FireBeetle Board-ESP32

Kliknutím sem stáhnete zdrojový kód do esp32. Zdrojový kód se skládá ze souborů knihovny a souborů 3D tisku. Soubor knihovny byste měli uložit do lib of arduino. A 3D soubory mohou krusty tisknout přímo.

Níže je hlavní program

#include #include // Potřebné pouze pro Arduino 1.6.5 a starší #include "SSD1306.h" // alias pro `#include" SSD1306Wire.h "` #include "OLEDDisplayUi.h" #include "images.h" # zahrnout #include #include #include #include #define POWER_KEY 1 #define MENU_KEY 2 #define UPLOAD_KEY 3 boolean upload = false; Displej SSD1306 (0x3c, 18, 0); OLEDDisplayUi ui (& zobrazit); Časovač SimpleTimer; WidgetRTC rtc; int obrazovka W = 128; int obrazovkaH = 64; int clockCenterX = obrazovkaW/2; int clockCenterY = ((obrazovkaH-16)/2) +16; // horní žlutá část má výšku 16 px int clockRadius = 23; #define DEVICE (0x53) // adresa zařízení ADXL345 #define TO_READ (6) // počet bytů, které budeme číst pokaždé (dva bajty pro každou osu) byte buff [TO_READ]; // 6bytová vyrovnávací paměť pro ukládání dat načtených ze zařízení char str [100]; // vyrovnávací paměť řetězců pro transformaci dat před odesláním na sériový port int regAddress = 0x32; // první registr dat zrychlení osy na ADXL345 int xx, yy, zz; // statická data tříosého zrychlení int currentValue = 0; statické nepodepsané dlouhé krokySoučet = 0; char auth = "YourAuthToken"; // Vaše pověření WiFi. // U otevřených sítí nastavte heslo na „“. char ssid = "YourNetworkName"; char pass = "Vaše heslo"; 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, 0x 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, 0xF, 0x0, 0x0 0xFE, 0x03, 0x00, 0x00, 0x00, 0xF9, 0x03, 0x00, 0x00, 0x00, 0xFA, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x03, 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, 0x1, 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, 0x00, 0x0 0x00, 0xC0, 0x01, 0xF0, 0x03, 0x00, 0xC0, 0x03, 0xE8, 0x07, 0x00, 0xC0, 0x03, 0x88, 0x6F, 0x00, 0x80, 0x03, 0x40, 0x1E, 0x00, 0x 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,}; // pomocná funkce pro zobrazení digitálních hodin: tiskne úvodní 0 Řetězec twoDigits (int číslice) {if (číslice <10) {String i = '0'+String (číslice); vrátit i; } else {return String (číslice); }} 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); // hodinová tikadla pro (int z = 0; z drawLine (x2 + x, y2 + y, x3 + x, y3 + y);} // zobrazí úhel plovoucí ruky z druhé ruky = sekunda () * 6; úhel = (úhel / 57.29577951); // Převod stupňů na radiány int x3 = (clockCenterX + (sin (úhel) * (clockRadius - (clockRadius / 5))))); int y3 = (clockCenterY - (cos (úhel) * (clockRadius - (clockRadius / 5)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // zobrazení minutového úhlu ruky = minuta () * 6; úhel = (úhel / 57.29577951); // Převod stupňů na radiány x3 = (clockCenterX + (sin (úhel) * (clockRadius - (clockRadius / 4)))); y3 = (clockCenterY - (cos (úhel) * (clockRadius - (clockRadius / 4)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // zobrazení hodinového úhlu ruky = hodina () * 30 + int ((minuta () / 12) * 6); úhel = (úhel / 57.29577951); // Převod stupňů na radiány x3 = (clockCenterX + (sin (úhel) * (clockRadius - (clockRadius / 2)))); y3 = (clockCenterY - (cos (úhel) * (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 (hodina ())+":"+dvě číslice (minuta ())+":"+dvě číslice (druhá ()); 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, date); } void writeTo (int zařízení, adresa bytu, hodnota bytu) {Wire.beginTransmission (zařízení); // zahájení přenosu do zařízení Wire.write (adresa); // odeslat registrační adresu Wire.write (val); // odeslání hodnoty pro zápis Wire.endTransmission (); // konec přenosu} // čte počet bajtů počínaje registrem adres na zařízení do buff buffu void readFrom (int zařízení, adresa bytu, int num, byte buff ) {Wire.beginTransmission (zařízení); // zahájení přenosu do zařízení Wire.write (adresa); // odešle adresu ke čtení z Wire.endTransmission (); // konec přenosu Wire.beginTransmission (zařízení); // zahájení přenosu do zařízení Wire.requestFrom (zařízení, počet); // požadavek 6 bytů ze zařízení int i = 0; while (Wire.available ()) // zařízení může odesílat méně, než je požadováno (abnormální) {buff = Wire.read (); // obdrží bajt i ++; } Wire.endTransmission (); // konec přenosu} void runningFrame (OLEDDisplay*displej, OLEDDisplayUiState*stav, 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, „nahrát data …“); } // Toto pole uchovává ukazatele funkcí na všechny snímky // rámce jsou jednotlivá zobrazení, která se posouvají v rámcích FrameCallback = {analogClockFrame, digitalClockFrame, runningFrame, uploadFrame}; // kolik rámců je? int frameCount = 4; // Překryvy jsou staticky kresleny na horní část rámu, např. překrytí hodin OverlayCallback = {clockOverlay}; int overlaysCount = 1; void uploadToBlynk (void) {if (upload == true) {Blynk.virtualWrite (V0, stepsSum); Blynk.virtualWrite (V1, stepsSum); }} void uiInit (neplatné) {ui.setTargetFPS (30); //ui.setActiveSymbol(activeSymbol); //ui.setInactiveSymbol(inactiveSymbol); ui.setIndicatorPosition (TOP); ui.setIndicatorDirection (LEFT_RIGHT); ui.setFrameAnimation (SLIDE_LEFT); ui.setFrames (rámce, frameCount); ui.setOverlays (překryvy, overlaysCount); ui.disableAutoTransition (); ui.switchToFrame (2); ui.init (); display.flipScreenVertically (); } void adxl345Init (void) {writeTo (DEVICE, 0x2D, 0); writeTo (ZAŘÍZENÍ, 0x2D, 16); writeTo (ZAŘÍZENÍ, 0x2D, 8); } void updateAdxl345 (void) {readFrom (DEVICE, regAddress, TO_READ, buff); // přečtěte data zrychlení z 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); vrátit POWER_KEY; }} if (digitalRead (D3) == LOW) {delay (5); if (digitalRead (D3) == LOW) {while (digitalRead (D3) == LOW); vrátit MENU_KEY; }} if (digitalRead (D4) == LOW) {delay (5); if (digitalRead (D4) == LOW) {while (digitalRead (D4) == LOW); vrátit UPLOAD_KEY; }} vrátit 0; } void doKeysFunction (void) {static int uiFrameIndex = 2; int klíče = getKeys (); if (keys == POWER_KEY) {static char i = 0; if (i) {ui.init (); display.flipScreenVertically (); 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 ZbývajícíTimeBudget = ui.update (); static int testSum = 0; if ((testSum 0) {delay (remainTimeBudget);} doKeysFunction (); timer.run ();}

Upozornění: Nastavení Wi-Fi, cestovní pas a AUTHTOKENS byste měli upravit sami sobě.

char auth = "YourAuthToken"; // Vaše pověření WiFi. // U otevřených sítí nastavte heslo na „“. char ssid = "YourNetworkName"; char pass = "Vaše heslo";

Krok 3: Hardwarové připojení

Hardwarové připojení
Hardwarové připojení
Hardwarové připojení
Hardwarové připojení
Hardwarové připojení
Hardwarové připojení

Připojte OLED12864 a akcelerační modul k I2C, spodní části k D2, D3, D4. Kromě toho přidejte ke dnu 51k výsuvné odpory, aby dosáhly 3,3 V, jak je znázorněno níže.

Upozornění: Připojování výsuvných odporů k AREF je nesprávné, správné je 3,3V

Obrázek pájení hardwaru, zobrazený níže:

Po pájení sestavte hardwarový modul do kůry, viz níže:

Komplexní efektový obrázek ~

Doporučuje: