Inhoudsopgave:

Hoe maak je een stappenteller?: 3 stappen (met afbeeldingen)
Hoe maak je een stappenteller?: 3 stappen (met afbeeldingen)

Video: Hoe maak je een stappenteller?: 3 stappen (met afbeeldingen)

Video: Hoe maak je een stappenteller?: 3 stappen (met afbeeldingen)
Video: STAPPENTELLER EXPERIMENT: Zelf Tellen VS Apple Watch & Phone App + Cardio Tips! 2024, Juni-
Anonim
Image
Image
Een Blynk-project maken
Een Blynk-project maken

Ik presteerde goed in veel sporten: wandelen, hardlopen, fietsen, badminton spelen etc.

Ik hou van paardrijden om snel rond te reizen. Nou, kijk eens naar mijn dikke buik……

Hoe dan ook, ik besluit weer te gaan sporten. Welke apparatuur moet ik voorbereiden? Naast sportfaciliteiten, ja! Ik heb een instrument nodig! Ik geloof dat ik hiermee de juiste hoeveelheid lichaamsbeweging kan behouden. Hier ontstaat het instrument. Laten we beginnen met een video~

Het instrument kan niet alleen stappen (en calorieën) in realtime opnemen, maar ook de tijd weergeven. Wat speciaal is, is dat het formaat van de weergave pointer is ~ zo cool! Ik vind het echt heel leuk!

U kunt uw gegevens uploaden naar internet

slechts met één klik. Alle records kunnen worden weergegeven door Blynk (een eerder geïntroduceerde smartphone-software). Hetzelfde als een draagbaar slim horloge, het instrument krijgt tijd online (je hoeft dus niet bang te zijn voor de kracht en tijd die wordt bijgewerkt).

Hardware in med:

FireBeetle Board-ESP32

FireBeetle Covers-Proto Board

OLED12864 weergavescherm

Versnellingsmodule

3.7V batterij (online gekocht, het volume is ongeveer 600mAH)

3 flessen (online gekocht)

Het is erg handig om dit project door Blybk te bouwen.

Stap 1: Maak een Blynk-project

Voeg twee besturingselementen toe:

Waardeweergave * 1

Realtime klok * 1

De naam van Waardeweergave moet worden ingesteld op stappen, maar geen instelling voor de eigenschappen van Real-time klok. Kies V1 als invoerpin om de lay-out van de bedieningselementen aan te passen, zoals hieronder weergegeven.

Stap 2: Programma's downloaden naar FireBeetle Board-ESP32

Klik hier om de broncode naar esp32 te downloaden. De broncode bestaat uit bibliotheekbestanden en 3D-printbestanden. U moet het bibliotheekbestand opslaan in de bibliotheek van arduino. En de 3D-bestanden kunnen korsten direct printen.

Hieronder het hoofdprogramma

#include #include // Alleen nodig voor Arduino 1.6.5 en eerder #include "SSD1306.h" // alias voor `#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 booleaanse upload = false; SSD1306-scherm (0x3c, 18, 0); OLEDDisplayUi ui (&display); SimpleTimer-timer; WidgetRTC rtc; int schermW = 128; int schermH = 64; int clockCenterX = schermW/2; int clockCenterY = ((schermH-16)/2)+16; // bovenste gele deel is 16 px hoogte int clockRadius = 23; #define DEVICE (0x53) //ADXL345 device address #define TO_READ (6) //aantal bytes dat we elke keer gaan lezen (twee bytes voor elke as) byte buff [TO_READ]; //6 bytes buffer voor het opslaan van gegevens gelezen van het apparaat char str [100]; //stringbuffer om gegevens te transformeren voordat ze naar de seriële poort worden verzonden int regAddress = 0x32; //eerste as-versnelling-gegevensregister op de ADXL345 int xx, yy, zz; // versnellingsgegevens met drie assen statisch int currentValue = 0; statische niet-ondertekende lange stepsSum=0; char auth = "YourAuthToken"; // Uw WiFi-inloggegevens. // Stel wachtwoord in op "" voor open netwerken. char ssid = "UwNetwerkNaam"; char pass = "UwWachtwoord"; 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, 0x 0xF8, 0x17, 0x00, 0x00, 0xC0, 0xF8, 0x0F, 0x00, 0x00, 0xE0, 0xFB, 0x17, 0x00, 0x00, 0xC0, 0xFF, 0x13, 0x00, 0x00, 0x00, 0xFF, 0x0300, 0x00, 0xFE, 0x03, 0x00, 0x00, 0x00, 0xF9, 0x03, 0x00, 0x00, 0x00, 0xFA, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x 0xF4, 0x07, 0x00, 0x00, 0x00, 0xF4, 0x0F, 0x00, 0x00, 0x00, 0xF9, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x80, 0xFE, 0x1F, 0x0, 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,x 0xE0, 0x00, 0xC0, 0x01, 0xF0, 0x03, 0x00, 0xC0, 0x03, 0xE8, 0x07, 0x00, 0xC0, 0x03, 0x88, 0x6F, 0x00, 0x80, 0x03, 0x40, 0x1E, 0x00,0x 0xA0, 0x00,x 0xA0, 0x00, 0x80, 0x03, 0x00, 0xF8, 0x01, 0x00, 0x07, 0x00, 0xF4, 0x00, 0x00, 0x07, 0x00, 0xE8, 0x00, 0x80, 0x0F, 0x00, 0xE8, 0x00, 0,0x 0x0F, 0x00, 0xE8, 0x0F, 0x00, 0xE8, 0x00, 0xF0, 0x09, 0x00, 0x60, 0x01, 0xF0, 0x04, 0x00, 0x00, 0x00, }; // hulpprogramma voor digitale klokweergave: drukt voorloop 0 String twoDigits (int cijfers) {if (cijfers <10) { String i = '0'+String (cijfers); retour ik; } else { return String (cijfers); } } 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); //uur tikt voor (int z=0; z drawLine(x2 + x, y2 + y, x3 + x, y3 + y); } // toon tweede hand zweefhoek = seconde() * 6; hoek = (hoek / 57.29577951); // Converteer graden naar radialen int x3 = (clockCenterX + (sin(angle) * (clockRadius - (clockRadius / 5)))); int y3 = (clockCenterY - (cos(angle) * (clockRadius - (clockRadius / 5)))); display->drawLine(clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // weergave minutenwijzer hoek = minuut () * 6; hoek = (hoek / 57.29577951); // Converteer graden naar radialen x3 = (clockCenterX + (sin(angle) * (clockRadius - (clockRadius / 4)))); y3 = (clockCenterY - (cos(angle) * (clockRadius - (clockRadius / 4)))); display->drawLine(clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // weergave uurwijzerhoek = uur() * 30 + int((minuut() / 12) * 6); hoek = (hoek / 57.29577951); // Converteer graden naar radialen x3 = (clockCenterX + (sin(angle) * (clockRadius - (clockRadius / 2)))); y3 = (clockCenterY - (cos(angle) * (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(uur())+":"+twoDigits(minute())+":"+twoCijfers(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-apparaat, byte-adres, byte-val) { Wire.beginTransmission (apparaat); // start verzending naar apparaat Wire.write (adres); // stuur registeradres Wire.write (val); // stuur waarde om Wire.endTransmission te schrijven (); // end transmissie } // leest num bytes vanaf adresregister op apparaat naar buff array void readFrom (int device, byte address, int num, byte buff ) { Wire.beginTransmission (apparaat); // start verzending naar apparaat Wire.write (adres); // verzendt adres om te lezen van Wire.endTransmission (); //Beëindig transmissie Wire.beginTransmission (apparaat); // start verzending naar apparaat Wire.requestFrom (apparaat, num); // verzoek 6 bytes van apparaat int i = 0; while(Wire.available()) //apparaat kan minder verzenden dan gevraagd (abnormaal) { buff= Wire.read(); // ontvang een byte i++; } Draad.endTransmission(); // end transmissie} 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, "gegevens uploaden …"); } // Deze array houdt functieaanwijzers naar alle frames // frames zijn de enkele weergaven die in FrameCallback-frames worden geschoven = { analogClockFrame, digitalClockFrame, runningFrame, uploadFrame}; // hoeveel frames zijn er? int frameCount = 4; // Overlays worden statisch op een frame getekend, bijv. een klok OverlayCallback overlays = {clockOverlay}; int overlaysCount = 1; void uploadToBlynk(void){if(upload == true){Blynk.virtualWrite(V0, stepsSum); Blynk.virtualWrite (V1, stappenSum); } } void uiInit(void){ ui.setTargetFPS(30); //ui.setActiveSymbol (activeSymbol); //ui.setInactiveSymbol (inactiveSymbol); ui.setIndicatorPositie (TOP); ui.setIndicatorDirection(LEFT_RIGHT); ui.setFrameAnimation(SLIDE_LEFT); ui.setFrames (frames, frameCount); ui.setOverlays(overlays, overlaysCount); ui.disableAutoTransition(); ui.switchToFrame(2); ui.init(); display.flipScreenVertical(); } void adxl345Init(void){ writeTo(DEVICE, 0x2D, 0); schrijfNaar(APPARAAT, 0x2D, 16); schrijfNaar(APPARAAT, 0x2D, 8); } void updateAdxl345(void){ readFrom(DEVICE, regAddress, TO_READ, buff); // lees de acceleratiegegevens van de 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++; } huidige waarde = xx; } sprintf(str, "%d", stepsSum); } int getKeys(void){ if(digitalRead(D2) == LAAG){ delay(5); if (digitalRead (D2) == LAAG) { while (digitalRead (D2) == LAAG); retourneer POWER_KEY; } } if(digitalRead(D3) == LAAG){ delay(5); if (digitalRead (D3) == LAAG) { while (digitalRead (D3) == LAAG); keer MENU_KEY terug; } } if(digitalRead(D4) == LAAG){ delay(5); if (digitalRead (D4) == LAAG) { while (digitalRead (D4) == LAAG); retourneer UPLOAD_KEY; } } retourneer 0; } void doKeysFunction(void){ static int uiFrameIndex = 2; int-sleutels = getKeys(); if(keys == POWER_KEY){ static char i = 0; if(i){ ui.init(); display.flipScreenVertical(); display.displayOn(); }else{ display.displayOff(); } ik = ~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{ uploaden = waar; ui.switchToFrame(3); } } } void setup () { pinMode (D2, INPUT); pinMode (D3, INGANG); pinMode (D4, INGANG); Blynk.begin(auth, ssid, pass); rtc.begin(); uiInit(); adxl345Init(); timer.setInterval (30, updateAdxl345); timer.setInterval(100, uploadToBlynk); } void loop() { int resterendeTimeBudget = ui.update(); statische int testSum = 0; if((testSum 0) {delay(remainingTimeBudget);} doKeysFunction(); timer.run();}

Let op: U dient de Wi-Fi-instelling, paspoort en AUTHTOKENS naar uzelf aan te passen.

char auth = "YourAuthToken"; // Uw WiFi-inloggegevens. // Stel wachtwoord in op "" voor open netwerken. char ssid = "UwNetwerkNaam"; char pass = "UwWachtwoord";

Stap 3: Hardwareverbinding

Hardwareverbinding
Hardwareverbinding
Hardwareverbinding
Hardwareverbinding
Hardwareverbinding
Hardwareverbinding

Sluit OLED12864 en acceleratiemodule aan op I2C, bodems op D2, D3, D4. Voeg bovendien 51k pull-up-weerstanden toe aan de bodems om 3,3 V te bereiken, zoals hieronder weergegeven.

Let op: Het is verkeerd om pull-up weerstanden aan te sluiten op AREF, de juiste is op 3.3V

De hardware-soldeerafbeelding, zoals hieronder weergegeven:

Na het soldeer, montage van de hardwaremodule tot korst, zoals hieronder weergegeven:

Uitgebreid effectbeeld ~

Aanbevolen: