Inhaltsverzeichnis:

Wie erstelle ich einen Schrittzähler?: 3 Schritte (mit Bildern)
Wie erstelle ich einen Schrittzähler?: 3 Schritte (mit Bildern)

Video: Wie erstelle ich einen Schrittzähler?: 3 Schritte (mit Bildern)

Video: Wie erstelle ich einen Schrittzähler?: 3 Schritte (mit Bildern)
Video: Garmin Vivofit 3 Schrittzähler ✔ 1 Jahr Praxis [ 1 Jahr Akkuleistung ] 24/7 Fitnesstracker Top Tipp 2024, November
Anonim
Image
Image
Erstellen Sie ein Blynk-Projekt
Erstellen Sie ein Blynk-Projekt

Früher habe ich bei vielen Sportarten gute Leistungen gezeigt: Gehen, Laufen, Fahrrad fahren, Badminton spielen usw.

Ich liebe es zu reiten, um in Kürze herumzureisen. Nun, sieh dir meinen beleibten Bauch an……

Jedenfalls beschließe ich, wieder Sport zu treiben. Welche Ausrüstung soll ich vorbereiten? Außer Sportanlage ja! Ich brauche ein Instrument! Ich glaube, damit kann ich ein angemessenes Maß an Bewegung halten. Hier entsteht das Instrument. Beginnen wir mit einem Video~

Das Instrument kann nicht nur Schritte (und Kalorien) in Echtzeit aufzeichnen, sondern auch die Zeit anzeigen. Das Besondere ist, dass das Format der Show Pointer~ so cool ist! Ich mag es wirklich sehr!

Sie können Ihre Aufzeichnungen ins Internet hochladen

nur mit einem Klick. Alle Datensätze können von Blynk (einer zuvor eingeführten Smartphone-Software) angezeigt werden. Wie bei einer tragbaren Smartwatch erhält das Instrument die Zeit online (Sie brauchen also keine Angst vor der Aktualisierung von Leistung und Uhrzeit zu haben).

Hardware in meed:

FireBeetle-Board-ESP32

FireBeetle Covers-Proto Board

OLED12864 Anzeigebildschirm

Beschleunigungsmodul

3,7V Batterie (online gekauft, die Lautstärke beträgt ca. 600mAH)

3 Flaschen (online gekauft))

Es ist sehr praktisch, dieses Projekt von Blybk zu bauen.

Schritt 1: Erstellen Sie ein Blynk-Projekt

Fügen Sie zwei Steuerelemente hinzu:

Wertanzeige * 1

Echtzeituhr * 1

Der Name der Wertanzeige sollte auf Schritte gesetzt werden, aber keine Einstellung für die Eigenschaften der Echtzeituhr. Wählen Sie V1 als Eingangspin, um das Layout der Steuerelemente anzupassen, wie unten gezeigt.

Schritt 2: Programme auf FireBeetle Board-ESP32 herunterladen

Klicken Sie hier, um den Quellcode für esp32 herunterzuladen. Der Quellcode besteht aus Bibliotheksdateien und 3D-Druckdateien. Sie sollten die Bibliotheksdatei in der lib von arduino speichern. Und die 3D-Dateien können Krusten direkt drucken.

Unten ist das Hauptprogramm

#include #include // Nur benötigt für Arduino 1.6.5 und früher #include "SSD1306.h" // Alias für `#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 Boolescher Upload = false; SSD1306-Anzeige (0x3c, 18, 0); OLEDDisplayUi-UI (&display); SimpleTimer-Timer; WidgetRTC rtc; int screenW = 128; int screenH = 64; int clockCenterX = screenW/2; int clockCenterY = ((screenH-16)/2)+16; // oberer gelber Teil ist 16 px Höhe int clockRadius = 23; #define DEVICE (0x53) //ADXL345 Geräteadresse #define TO_READ (6) //Anzahl der Bytes, die wir jedes Mal lesen (zwei Bytes für jede Achse) byte buff[TO_READ]; ///6 Byte Puffer zum Speichern der vom Gerät gelesenen Daten char str[100]; // String-Puffer zum Transformieren von Daten vor dem Senden an den seriellen Port Int regAddress = 0x32; // erstes Achsbeschleunigungsdatenregister auf dem ADXL345 int xx, yy, zz; // dreiachsige Beschleunigungsdaten statisch Int currentValue = 0; statisch unsigned long stepsSum=0; char auth = "IhrAuthToken"; // Ihre WLAN-Zugangsdaten. // Passwort für offene Netzwerke auf "" setzen. char ssid = "IhrNetzwerkname"; char pass = "IhrPasswort"; 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, 00 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, 0x03, 0x00 0xFE, 0x03, 0x00, 0x00, 0x00, 0xF9, 0x03, 0x00, 0x00, 0x00, 0xFA, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0 0xF4, 0x07, 0x00, 0x00, 0x00, 0xF4, 0x0F, 0x00, 0x00, 0x00, 0xF9, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x80, 0xFE, 0x1F, 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, 0xE0,8 0x00, 0xC0, 0x01, 0xF0, 0x03, 0x00, 0xC0, 0x03, 0xE8, 0x07, 0x00, 0xC0, 0x03, 0x88, 0x6F, 0x00, 0x80, 0x03, 0x40, 0x1E, 0x00, 0xA,0,0 0x00, 0x80, 0x03, 0x00, 0xF8, 0x01, 0x00, 0x07, 0x00, 0xF4, 0x00, 0x00, 0x07, 0x00, 0xE8, 0x00, 0x80, 0x0F, 0x00, 0xE8, 0x00, 0x90, 0x,F 0x00, 0xE8, 0x0F, 0x00, 0xE8, 0x00, 0xF0, 0x09, 0x00, 0x60, 0x01, 0xF0, 0x04, 0x00, 0x00, 0x00, }; // Hilfsfunktion für die Digitaluhranzeige: druckt führende 0 String twoDigits (int digits) { if (digits <10) { String i = '0' + String (digits); Rückkehr ich; } Else { Return String (Ziffern); aufrechtzuerhalten. aufrechtzuerhalten. aufrechtzuerhalten. Void analogClockFrame (OLEDDisplay * display, OLEDDisplayUiState * state, int16_t x, int16_t y) { display-> drawCircle (clockCenterX + x, clockCenterY + y, 2); // Stunde tickt for(int z=0; z drawLine(x2 + x, y2 + y, x3 + x, y3 + y); } // Sekundenzeiger float angle = second() * 6; angle = (angle / 57.29577951); // Grad in Bogenmaß umwandeln 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); // Minutenzeigerwinkel anzeigen = minute() * 6; angle = (angle / 57.29577951); // Grad in Bogenmaß umwandeln x3 = (clockCenterX + (sin(angle) * (clockRadius - (clockRadius / 4)))); y3 = (clockCenterY - (cos(angle) * (clockRadius - (clockRadius / 4)))); display->drawLine(clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // Stundenzeigerwinkel anzeigen = hour() * 30 + int((minute() / 12) * 6); angle = (Winkel / 57,29577951); // Grad in Bogenmaß umwandeln 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(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); aufrechtzuerhalten. Void writeTo (int device, byte address, byte val) { Wire.beginTransmission (device); // Übertragung zum Gerät starten Wire.write (Adresse); // Registeradresse senden Wire.write (val); // Wert senden, um Wire.endTransmission() zu schreiben; // Übertragung beenden} // Liest Anzahl Bytes beginnend vom Adressregister auf dem Gerät in das Buff-Array void readFrom (int device, byte address, int num, byte buff) { Wire.beginTransmission (device); // Übertragung zum Gerät starten Wire.write (Adresse); // sendet Adresse zum Lesen von Wire.endTransmission (); // Übertragung beenden Wire.beginTransmission (Gerät); // Übertragung zum Gerät starten Wire.requestFrom(device, num); // 6 Byte vom Gerät anfordern Int i = 0; while(Wire.available()) //Gerät sendet möglicherweise weniger als angefordert (abnormal) { buff= Wire.read(); // ein Byte empfangen i++; } Wire.endTransmission(); // Übertragung beenden aufrechtzuerhalten. 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); aufrechtzuerhalten. Void uploadFrame (OLEDDisplay * display, OLEDDisplayUiState * state, int16_t x, int16_t y) { display->setFont (ArialMT_Plain_16); display->drawString(60, 45, "Daten hochladen …"); } // Dieses Array behält Funktionszeiger auf alle Frames // Frames sind die einzelnen Ansichten, die in FrameCallback geschoben werden frames = { analogClockFrame, digitalClockFrame, runningFrame, uploadFrame}; // Wie viele Bilder gibt es? int frameCount = 4; // Overlays werden statisch auf einen Rahmen gezeichnet, zB. ein Clock-OverlayCallback-Overlays = {clockOverlay}; int overlaysCount = 1; Void uploadToBlynk (void) { if (upload == true) { Blynk.virtualWrite (V0, stepsSum); Blynk.virtualWrite (V1, SchritteSum); aufrechtzuerhalten.}} 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(frames, frameCount); ui.setOverlays(Overlays, OverlaysCount); ui.disableAutoTransition(); ui.switchToFrame(2); ui.init(); display.flipScreenVertically(); aufrechtzuerhalten. Void adxl345Init (void) {writeTo (GERÄT, 0x2D, 0); writeTo(GERÄT, 0x2D, 16); writeTo(GERÄT, 0x2D, 8); aufrechtzuerhalten. Void updateAdxl345 (void) {readFrom (DEVICE, regAddress, TO_READ, Buff); // die Beschleunigungsdaten vom ADXL345 lesen 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 < aktueller Wert) { SchritteSum ++; } aktueller Wert = xx; } sprintf(str, "%d", stepsSum); aufrechtzuerhalten. Int getKeys (void) { if (digitalRead (D2) == LOW) { delay (5); if (digitalRead (D2) == LOW) { während (digitalRead (D2) == LOW); POWER_KEY zurückgeben; } } if (digitalRead (D3) == LOW) { Verzögerung (5); if (digitalRead (D3) == LOW) { während (digitalRead (D3) == LOW); MENÜ_SCHLÜSSEL zurückgeben; } } if (digitalRead (D4) == LOW) { Verzögerung (5); if (digitalRead (D4) == LOW) { während (digitalRead (D4) == LOW); UPLOAD_KEY zurückgeben; } } Rückgabe 0; aufrechtzuerhalten. Void doKeysFunction (void) { static int uiFrameIndex = 2; int-Schlüssel = getKeys(); if (keys == POWER_KEY) { statisches Zeichen i = 0; wenn (i) {ui.init (); display.flipScreenVertically(); display.displayOn(); }sonst{ display.displayOff(); } ich = ~i; } if(keys == MENU_KEY){ if(upload == false){ uiFrameIndex++; if(uiFrameIndex == 3) uiFrameIndex = 0; ui.switchToFrame(uiFrameIndex); }sonst{ ui.switchToFrame(3); }} if(keys == UPLOAD_KEY){ if(upload == true){ upload = false; ui.switchToFrame(uiFrameIndex); }sonst{ hochladen = wahr; ui.switchToFrame(3); } } } Void setup () {pinMode (D2, INPUT); PinMode (D3, EINGANG); PinMode (D4, EINGANG); Blynk.begin(auth, ssid, pass); rtc.begin(); uiInit(); adxl345Init(); timer.setInterval(30, updateAdxl345); timer.setInterval(100, uploadToBlynk); aufrechtzuerhalten. Void Schleife () { Int RestTimeBudget = ui.update (); statische int testSum = 0; if((testSum 0) { delay(remainingTimeBudget); } doKeysFunction(); timer.run(); }

Achtung: Sie sollten die WLAN-Einstellungen, den Reisepass und die AUTHTOKENS für sich selbst ändern.

char auth = "IhrAuthToken"; // Ihre WLAN-Zugangsdaten. // Passwort für offene Netzwerke auf "" setzen. char ssid = "IhrNetzwerkname"; char pass = "IhrPasswort";

Schritt 3: Hardwareverbindung

Hardware-Verbindung
Hardware-Verbindung
Hardware-Verbindung
Hardware-Verbindung
Hardware-Verbindung
Hardware-Verbindung

Verbinden Sie OLED12864 und Beschleunigungsmodul mit I2C, Unterseite mit D2, D3, D4. Fügen Sie außerdem 51k Pull-up-Widerstände zu den Böden hinzu, um 3,3 V zu erreichen, wie unten gezeigt.

Achtung: Es ist falsch, Pullup-Widerstände an AREF anzuschließen, der richtige ist an 3.3V

Das Hardware-Lötbild, wie unten gezeigt:

Nach dem Löten, Zusammenbauen des Hardwaremoduls zur Kruste, wie unten gezeigt:

Umfassendes Effektbild~

Empfohlen: