Innehållsförteckning:

Hur man gör en stegräknare?: 3 steg (med bilder)
Hur man gör en stegräknare?: 3 steg (med bilder)

Video: Hur man gör en stegräknare?: 3 steg (med bilder)

Video: Hur man gör en stegräknare?: 3 steg (med bilder)
Video: Lägga tak del 3, ströläkt och bärläkt 2024, November
Anonim
Image
Image
Skapa ett Blynk -projekt
Skapa ett Blynk -projekt

Jag brukade prestera bra på många sporter: promenader, löpning, cykling, badminton etc.

Jag älskar att åka för att resa runt innan länge. Titta, titta på min mage …

Tja, i alla fall bestämmer jag mig för att starta om för att träna. Vilken utrustning ska jag förbereda? Förutom idrottsanläggning, ja! Jag behöver ett instrument! Jag tror med det, jag kan behålla lämplig mängd träning. Här blir instrumentet till. Låt oss börja med en video ~

Instrumentet kan inte bara registrera steg (och kalorier) i realtid, utan visa tid. Det som är speciellt är att visningsformatet är pekare ~ så coolt! Jag gillar det verkligen, verkligen!

Du kan ladda upp dina poster till Internet

bara med ett klick. Alla poster kan visas av Blynk (en smarttelefonprogramvara som introducerades tidigare). Samma som bärbar smart klocka, instrumentet får tid på nätet (Så du behöver inte vara rädd för kraften och tiduppdateringen).

Hårdvara i meed:

FireBeetle Board-ESP32

FireBeetle Covers-Proto Board

OLED12864 dispaly -skärm

Accelerationsmodul

3.7V batteri (köpt online, volymen är cirka 600mAH)

3 bottnar (köpt online)

Det är mycket bekvämt att bygga detta projekt av Blybk.

Steg 1: Skapa ett Blynk -projekt

Lägg till två kontroller:

Värdevisning * 1

Realtidsklocka * 1

Namnet på Value Display bör anges i steg, men ingen inställning för egenskaperna för realtidsklocka. Välj V1 som ingångsstift för att justera layouten på kontrollerna, som visas nedan.

Steg 2: Ladda ner program till FireBeetle Board-ESP32

Klicka här för att ladda ner källkoden till esp32. Källkoden består av biblioteksfiler och 3D -utskriftsfiler. Du bör spara biblioteksfilen till lib of arduino. Och 3D -filerna kan skriva ut skorpor direkt.

Nedan är huvudprogrammet

#include #include // Behövs endast för Arduino 1.6.5 och tidigare #include "SSD1306.h" // alias för "#include" SSD1306Wire.h "" #include "OLEDDisplayUi.h" #include "images.h" # inkludera #include #include #include #include #define POWER_KEY 1 #define MENU_KEY 2 #define UPLOAD_KEY 3 boolean upload = false; SSD1306 -skärm (0x3c, 18, 0); OLEDDisplayUi ui (& display); SimpleTimer -timer; WidgetRTC rtc; int screenW = 128; int screenH = 64; int clockCenterX = skärmW/2; int clockCenterY = ((screenH-16)/2) +16; // den övre gula delen är 16 px höjd int clockRadius = 23; #define DEVICE (0x53) // ADXL345 enhetsadress #define TO_READ (6) // antal byte som vi ska läsa varje gång (två byte för varje axel) byte buff [TO_READ]; // 6 bytes buffert för att spara data läst från enhetens char str [100]; // strängbuffert för att transformera data innan den skickas till serieporten int regAddress = 0x32; // första axel-accelerationsdataregister på ADXL345 int xx, yy, zz; // accelerationsdata med tre axlar statisk int currentValue = 0; statiska osignerade långa stegSum = 0; char auth = "YourAuthToken"; // Dina WiFi -uppgifter. // Ställ in lösenordet på "" för öppna nätverk. char ssid = "Ditt nätverksnamn"; char pass = "Ditt lösenord"; 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, 0x00, 0x00 0xF8, 0x17, 0x00, 0x00, 0xC0, 0xF8, 0x0F, 0x00, 0x00, 0xE0, 0xFB, 0x17, 0x00, 0x00, 0xC0, 0xFF, 0x13, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x0, 0xFE, 0x03, 0x00, 0x00, 0x00, 0xF9, 0x03, 0x00, 0x00, 0x00, 0xFA, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0x07, 0x00, 0x00, 0x00, 0xF4, 0x0F, 0x00, 0x00, 0x00, 0xF9, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x80, 0x00, 0x00, 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, 0x0, 0x0, 0x0, 0x0 0x00, 0xC0, 0x01, 0xF0, 0x03, 0x00, 0xC0, 0x03, 0xE8, 0x07, 0x00, 0xC0, 0x03, 0x88, 0x6F, 0x00, 0x80, 0x03, 0x40, 0x1, 0x0, 0x0, 0x, 0x00, 0x80, 0x03, 0x00, 0xF8, 0x01, 0x00, 0x07, 0x00, 0xF4, 0x00, 0x00, 0x07, 0x00, 0xE8, 0x00, 0x80, 0x0F, 0x00, 0xE8, 0x0, 0x0, 0x0, 0x00, 0xE8, 0x0F, 0x00, 0xE8, 0x00, 0xF0, 0x09, 0x00, 0x60, 0x01, 0xF0, 0x04, 0x00, 0x00, 0x00,}; // verktygsfunktion för digital klockdisplay: skriver ut ledande 0 sträng tvåDigits (int siffror) {if (siffror <10) {String i = '0'+String (siffror); återvända i; } annat {retursträng (siffror); }} 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); // timme bockar för (int z = 0; z drawLine (x2 + x, y2 + y, x3 + x, y3 + y);} // visa andrahands flottörvinkel = sekund () * 6; vinkel = (vinkel / 57.29577951); // Konvertera grader till radianer int x3 = (clockCenterX + (sin (vinkel) * (clockRadius - (clockRadius / 5))))); int y3 = (clockCenterY - (cos (vinkel) * (clockRadius - (clockRadius / 5))))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // visa minutvisare = minut () * 6; vinkel = (vinkel / 57.29577951); // Konvertera grader till radianer x3 = (clockCenterX + (sin (vinkel) * (clockRadius - (clockRadius / 4)))); y3 = (clockCenterY - (cos (vinkel) * (clockRadius - (clockRadius / 4))))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // visa timvisare = timme () * 30 + int ((minut () / 12) * 6); vinkel = (vinkel / 57.29577951); // Konvertera grader till radianer x3 = (clockCenterX + (sin (vinkel) * (clockRadius - (clockRadius / 2)))); y3 = (clockCenterY - (cos (vinkel) * (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 (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 enhet, byte adress, byte val) {Wire.beginTransmission (enhet); // starta överföring till enhet Wire.write (adress); // skicka registeradress Wire.write (val); // skicka värde för att skriva Wire.endTransmission (); // slutöverföring} // läser num bytes från adressregister på enhet in till buff array void readFrom (int enhet, byte adress, int num, byte buff ) {Wire.beginTransmission (enhet); // starta överföring till enhet Wire.write (adress); // skickar adress att läsa från Wire.endTransmission (); // avsluta överföring Wire.beginTransmission (enhet); // starta överföring till enhet Wire.requestFrom (enhet, num); // begär 6 byte från enhet int i = 0; medan (Wire.available ()) // -enheten kan skicka mindre än begärd (onormal) {buff = Wire.read (); // ta emot en byte i ++; } Wire.endTransmission (); // end transmission} void runningFrame (OLEDDisplay*display, OLEDDisplayUiState*state, 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, "ladda upp data …"); } // Denna array håller funktionspekare till alla ramar // ramar är de enda vyer som glider i FrameCallback -ramar = {analogClockFrame, digitalClockFrame, runningFrame, uploadFrame}; // hur många ramar finns det? int frameCount = 4; // Överlägg ritas statiskt ovanpå en ram t.ex. a clock OverlayCallback overlays = {clockOverlay}; int overlaysCount = 1; void uploadToBlynk (void) {if (upload == true) {Blynk.virtualWrite (V0, stepsSum); Blynk.virtualWrite (V1, stepSum); }} 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 (ramar, frameCount); ui.setOverlays (overlays, overlaysCount); ui.disableAutoTransition (); ui.switchToFrame (2); ui.init (); display.flipScreenVertically (); } void adxl345Init (void) {writeTo (DEVICE, 0x2D, 0); writeTo (ENHET, 0x2D, 16); writeTo (ENHET, 0x2D, 8); } void updateAdxl345 (void) {readFrom (DEVICE, regAddress, TO_READ, buff); // läs accelerationsdata från ADXL345 xx = (((int) buff [1]) << 8) | buff [0]; åå = (((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); retur POWER_KEY; }} if (digitalRead (D3) == LOW) {delay (5); if (digitalRead (D3) == LOW) {while (digitalRead (D3) == LOW); gå tillbaka MENU_KEY; }} if (digitalRead (D4) == LOW) {delay (5); if (digitalRead (D4) == LOW) {while (digitalRead (D4) == LOW); returnera UPLOAD_KEY; }} returnera 0; } void doKeysFunction (void) {static int uiFrameIndex = 2; int nycklar = getKeys (); if (nycklar == POWER_KEY) {statisk karaktär i = 0; om (i) {ui.init (); display.flipScreenVertically (); display.displayOn (); } annat {display.displayOff (); } i = ~ i; } if (keys == MENU_KEY) {if (upload == false) {uiFrameIndex ++; om (uiFrameIndex == 3) uiFrameIndex = 0; ui.switchToFrame (uiFrameIndex); } annat {ui.switchToFrame (3); }} if (keys == UPLOAD_KEY) {if (upload == true) {upload = false; ui.switchToFrame (uiFrameIndex); } annat {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 stayingTimeBudget = ui.update (); static int testSum = 0; if ((testSum 0) {delay (stayingTimeBudget);} doKeysFunction (); timer.run ();}

Varning: Du bör ändra Wi-Fi-inställning, pass och AUTHTOKENS för dig själv.

char auth = "YourAuthToken"; // Dina WiFi -uppgifter. // Ställ in lösenordet på "" för öppna nätverk. char ssid = "Ditt nätverksnamn"; char pass = "Ditt lösenord";

Steg 3: Maskinvaruanslutning

Maskinvaruanslutning
Maskinvaruanslutning
Maskinvaruanslutning
Maskinvaruanslutning
Maskinvaruanslutning
Maskinvaruanslutning

Anslut OLED12864 och accelerationsmodul till I2C, bottnar till D2, D3, D4. Lägg dessutom till 51k uppdragningsmotstånd till bottnarna för att nå 3,3V, som visas nedan.

Varning: Det är fel att ansluta uppdragningsmotstånd till AREF, det rätta är 3,3V

Hårdvarulödningsbilden, som visas nedan:

Efter lödningen, montering av hårdvarumodul till skorpa, som visas nedan:

Omfattande effektbild ~

Rekommenderad: