Πίνακας περιεχομένων:

Πώς να φτιάξετε έναν μετρητή βημάτων ;: 3 βήματα (με εικόνες)
Πώς να φτιάξετε έναν μετρητή βημάτων ;: 3 βήματα (με εικόνες)

Βίντεο: Πώς να φτιάξετε έναν μετρητή βημάτων ;: 3 βήματα (με εικόνες)

Βίντεο: Πώς να φτιάξετε έναν μετρητή βημάτων ;: 3 βήματα (με εικόνες)
Βίντεο: 3 Εφαρμογές Για Εισόδημα Απ'το ΚΙΝΗΤΟ ΣΟΥ! 2024, Ιούνιος
Anonim
Image
Image
Δημιουργήστε ένα έργο Blynk
Δημιουργήστε ένα έργο Blynk

Συνήθιζα να παίζω καλά σε πολλά αθλήματα: περπάτημα, τρέξιμο, ποδήλατο, παιχνίδι μπάντμιντον κλπ.

Μου αρέσει να ταξιδεύω πολύ πριν. Λοιπόν, κοίτα την κοιλιακή μου κοιλιά ……

Λοιπόν, έτσι κι αλλιώς, αποφασίζω να ξαναρχίσω για άσκηση. Τι εξοπλισμό πρέπει να ετοιμάσω; Εκτός από αθλητικές εγκαταστάσεις, ναι! Χρειάζομαι ένα όργανο! Πιστεύω ότι με αυτό, μπορώ να διατηρήσω την κατάλληλη ποσότητα άσκησης. Εδώ δημιουργείται το όργανο. Ας ξεκινήσουμε με ένα βίντεο

Το όργανο όχι μόνο μπορεί να καταγράφει βήματα (και θερμίδες) σε πραγματικό χρόνο, αλλά να δείχνει χρόνο. Αυτό που είναι ιδιαίτερο είναι ότι η μορφή προβολής είναι δείκτης - πολύ ωραία! Μου αρέσει πολύ, πολύ!

Μπορείτε να ανεβάσετε τα αρχεία σας στο Διαδίκτυο

μόνο με ένα κλικ. Όλες οι εγγραφές μπορούν να εμφανιστούν από το Blynk (ένα λογισμικό έξυπνων τηλεφώνων που είχε εισαχθεί πριν). Το ίδιο με το φορητό έξυπνο ρολόι, το όργανο παίρνει χρόνο on line (οπότε δεν χρειάζεται να φοβάστε την ενημέρωση ισχύος και χρόνου).

Υλικό στο meed:

FireBeetle Board-ESP32

FireBeetle Covers-Proto Board

Οθόνη διανομής OLED12864

Ενότητα επιτάχυνσης

Μπαταρία 3,7V (αγοράστηκε online, η ένταση είναι περίπου 600mAH

3 μπουκάλια (αγοράστηκαν online)

Είναι πολύ βολικό να κατασκευάσετε αυτό το έργο από τον Blybk.

Βήμα 1: Δημιουργήστε ένα έργο Blynk

Προσθέστε δύο στοιχεία ελέγχου:

Εμφάνιση τιμής * 1

Ρολόι σε πραγματικό χρόνο * 1

Το όνομα της ένδειξης τιμής θα πρέπει να οριστεί σε βήματα, αλλά καμία ρύθμιση για τις ιδιότητες του ρολογιού σε πραγματικό χρόνο. Επιλέξτε V1 ως τον πείρο εισόδου για να προσαρμόσετε τη διάταξη των χειριστηρίων, όπως φαίνεται παρακάτω.

Βήμα 2: Λήψη προγραμμάτων στο FireBeetle Board-ESP32

Κάντε κλικ εδώ για να κατεβάσετε τον πηγαίο κώδικα στο esp32. Ο πηγαίος κώδικας περιλαμβάνει αρχεία βιβλιοθήκης και αρχεία τρισδιάστατης εκτύπωσης. Θα πρέπει να αποθηκεύσετε το αρχείο της βιβλιοθήκης στο lib of arduino. Και τα τρισδιάστατα αρχεία μπορούν να εκτυπώσουν κρούστες απευθείας.

Παρακάτω είναι το κύριο πρόγραμμα

#include #include // Απαιτείται μόνο για το Arduino 1.6.5 και νωρίτερα #include "SSD1306.h" // ψευδώνυμο για "#include" SSD1306Wire.h "" #include "OLEDDisplayUi.h" #include "images.h" # περιλαμβάνουν #include #include #include #include #define POWER_KEY 1 #define MENU_KEY 2 #define UPLOAD_KEY 3 boolean upload = false? Οθόνη SSD1306 (0x3c, 18, 0). OLEDDisplayUi ui (& εμφάνιση); Χρονοδιακόπτης SimpleTimer. WidgetRTC rtc; int screenW = 128; int screenH = 64; int clockCenterX = screenW/2; int clockCenterY = ((οθόνηH-16)/2) +16; // πάνω κίτρινο μέρος είναι 16 px ύψος int clockRadius = 23; #define DEVICE (0x53) // ADXL345 διεύθυνση συσκευής #define TO_READ (6) // αριθμός byte που θα διαβάσουμε κάθε φορά (δύο byte για κάθε άξονα) byte buff [TO_READ]; // 6 bytes buffer για την αποθήκευση δεδομένων που διαβάζονται από το str char της συσκευής [100]. // buffer string για μετατροπή δεδομένων πριν τα στείλετε στη σειριακή θύρα int regAddress = 0x32; // πρώτος άξονας-επιτάχυνση-μητρώο δεδομένων στο ADXL345 int xx, yy, zz; // στατικά δεδομένα τριών αξόνων στατική int currentValue = 0; στατικά ανυπόγραφα μεγάλα βήματαSum = 0; char auth = "YourAuthToken"; // Τα διαπιστευτήριά σας WiFi. // Ορίστε τον κωδικό πρόσβασης σε "" για ανοιχτά δίκτυα. char ssid = "YourNetworkName"; char pass = "YourPassword"; 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, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x60, 0xF1, 0x0, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xF8, 0X17, 0x00, 0x00, 0xC0, 0xF8, 0x0F, 0x00, 0x00, 0xE0 ως, 0xFB, 0X17, 0x00, 0x00, 0xC0, 0xFF, 0x13, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x80, 0xFE, 0x03, 0x00, 0x00, 0x00, 0xF9, 0x03, 0x00, 0x00, 0x00, 0xFA, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, 0x00, 0x07, 0x07 0xF4, 0x07, 0x00, 0x00, 0x00, 0xF4, 0x0F, 0x00, 0x00, 0x00, 0xF9, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x80, 0xFE, 0x00, 0x1F, 0xFF, 0x1F, 0x00, 0x00, 0xA0, 0xFF, 0x5F, 0x00, 0x00, 0xC0, 0x3F, 0x3F, 0x00, 0x0 1 0x00, 0xC0, 0x01, 0xF0, 0x03, 0x00, 0xC0, 0x03, 0xE8, 0x07, 0x00, 0xC0, 0x03, 0x88, 0x6F, 0x00, 0x80, 0x03, 0x40, 0x1E, 0x00, 0xA0, 0x03, 0x40, 0xFC, 0x00, 0x80, 0x03, 0x00, 0xF8, 0x01, 0x00, 0x07, 0x00, 0xF4, 0x00, 0x00, 0x07, 0x00, 0xE8, 0x00, 0x80, 0x0F, 0x00, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0 0x00, 0xE8, 0x0F, 0x00, 0xE8, 0x00, 0xF0, 0x09, 0x00, 0x60, 0x01, 0xF0, 0x04, 0x00, 0x00, 0x00,} · // βοηθητική λειτουργία για ψηφιακή ένδειξη ρολογιού: εκτυπώνει τον αριθμό 0 String twoDigits (int ψηφία) {if (ψηφία <10) {String i = '0'+String (ψηφία); επιστροφή i? } else {return String (ψηφία); }} void clockOverlay (οθόνη OLEDDisplay *, OLEDDisplayUiState * κατάσταση) {if ((ώρα () == 0) && (λεπτό () == 0) && (δεύτερο () == 0)) βήματα Άθροισμα = 0; } void analogClockFrame (οθόνη OLEDDisplay *, κατάσταση OLEDDisplayUiState *, int16_t x, int16_t y) {display-> drawCircle (clockCenterX + x, clockCenterY + y, 2); // κρότωνες ώρας για (int z = 0; z drawLine (x2 + x, y2 + y, x3 + x, y3 + y);} // εμφάνιση μεταχειρισμένης γωνίας πλωτήρα = δεύτερο () * 6; γωνία = (γωνία / 57.29577951); // Μετατροπή βαθμών σε ακτίνια int x3 = (clockCenterX + (sin (γωνία) * (clockRadius - (clockRadius / 5)))); int y3 = (clockCenterY - (cos (γωνία) * (clockRadius - (clockRadius / 5)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // εμφάνιση γωνίας δείκτη χεριού = λεπτό () * 6; γωνία = (γωνία / 57.29577951); // Μετατροπή βαθμών σε ακτίνια x3 = (clockCenterX + (sin (γωνία) * (clockRadius - (clockRadius / 4)))); y3 = (clockCenterY - (cos (γωνία) * (clockRadius - (clockRadius / 4)))). γωνία = (γωνία / 57.29577951) 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, ημερομηνία); } void writeTo (int συσκευή, διεύθυνση byte, byte val) {Wire.beginTransmission (συσκευή); // ξεκινήστε τη μετάδοση στη συσκευή Wire.write (διεύθυνση); // αποστολή διεύθυνσης καταχώρισης Wire.write (val); // αποστολή τιμής για εγγραφή Wire.endTransmission (); // τερματισμός μετάδοσης} // διαβάζει num byte ξεκινώντας από την καταχώριση διευθύνσεων στη συσκευή στο buff array void readFrom (int συσκευή, διεύθυνση byte, int num, byte buff ) {Wire.beginTransmission (συσκευή); // ξεκινήστε τη μετάδοση στη συσκευή Wire.write (διεύθυνση); // στέλνει διεύθυνση για ανάγνωση από το Wire.endTransmission (); // τερματισμός μετάδοσης Wire.beginTransmission (συσκευή); // ξεκινήστε τη μετάδοση στη συσκευή Wire.requestFrom (συσκευή, αριθ.) // ζητήστε 6 byte από τη συσκευή int i = 0; ενώ η (Wire.available ()) // συσκευή μπορεί να στείλει λιγότερα από τα ζητούμενα (μη φυσιολογικά) {buff = Wire.read (); // λάβετε ένα byte i ++; } Wire.endTransmission (); // τερματισμός μετάδοσης} void runningFrame (οθόνη OLEDDisplay*, κατάσταση 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 (οθόνη OLEDDisplay *, κατάσταση OLEDDisplayUiState *, int16_t x, int16_t y) {display-> setFont (ArialMT_Plain_16); display-> drawString (60, 45, "μεταφόρτωση δεδομένων …"); } // Αυτός ο πίνακας διατηρεί δείκτες λειτουργιών σε όλα τα πλαίσια // πόσα καρέ υπάρχουν; int frameCount = 4; // Οι επικαλύψεις σχεδιάζονται στατικά πάνω από ένα πλαίσιο, π.χ. επικάλυψη ρολογιού OverlayCallback = {clockOverlay}; int overlaysCount = 1; void uploadToBlynk (void) {if (upload == true) {Blynk.virtualWrite (V0, stepsSum); Blynk.virtualWrite (V1, stepsSum); }} void uiInit (άκυρο) {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 (επικαλύψεις, overlaysCount); ui.disableAutoTransition (); ui.switchToFrame (2); ui.init (); display.flipScreenVertically (); } void adxl345Init (void) {writeTo (DEVICE, 0x2D, 0); writeTo (ΣΥΣΚΕΥΗ, 0x2D, 16); writeTo (ΣΥΣΚΕΥΗ, 0x2D, 8); } void updateAdxl345 (void) {readFrom (DEVICE, regAddress, TO_READ, buff); // διαβάστε τα δεδομένα επιτάχυνσης από το 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 (άκυρο) {if (digitalRead (D2) == LOW) {καθυστέρηση (5); εάν (digitalRead (D2) == LOW) {while (digitalRead (D2) == LOW)? επιστροφή POWER_KEY }} if (digitalRead (D3) == LOW) {καθυστέρηση (5); εάν (digitalRead (D3) == LOW) {while (digitalRead (D3) == LOW)? επιστροφή MENU_KEY; }} if (digitalRead (D4) == LOW) {καθυστέρηση (5); εάν (digitalRead (D4) == LOW) {while (digitalRead (D4) == LOW)? επιστροφή UPLOAD_KEY; }} επιστροφή 0; } void doKeysFunction (void) {static int uiFrameIndex = 2; κλειδιά int = getKeys (); if (κλειδιά == POWER_KEY) {στατικός χαρακτήρας i = 0; εάν (i) {ui.init (); display.flipScreenVertically (); display.displayOn (); } else {display.displayOff (); } i = ~ i; } if (κλειδιά == MENU_KEY) {if (upload == false) {uiFrameIndex ++; εάν (uiFrameIndex == 3) uiFrameIndex = 0; ui.switchToFrame (uiFrameIndex); } else {ui.switchToFrame (3); }} if (κλειδιά == 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 დარჩენილიTimeBudget = ui.update (); στατικό int testSum = 0; if ((testSum 0) {delay (დარჩენილიTimeBudget);} doKeysFunction (); timer.run ();}

Προσοχή: Θα πρέπει να τροποποιήσετε τη ρύθμιση Wi-Fi, το διαβατήριο και το AUTHTOKENS στον εαυτό σας.

char auth = "YourAuthToken"; // Τα διαπιστευτήριά σας WiFi. // Ορίστε τον κωδικό πρόσβασης σε "" για ανοιχτά δίκτυα. char ssid = "YourNetworkName"; char pass = "YourPassword";

Βήμα 3: Σύνδεση υλικού

Σύνδεση υλικού
Σύνδεση υλικού
Σύνδεση υλικού
Σύνδεση υλικού
Σύνδεση υλικού
Σύνδεση υλικού

Συνδέστε το OLED12864 και τη μονάδα επιτάχυνσης στο I2C, στο κάτω μέρος στο D2, D3, D4. Επιπλέον, προσθέστε 51k pull-up αντιστάσεις στους πυθμένες για να φτάσετε τα 3.3V, όπως φαίνεται παρακάτω.

Προσοχή: Είναι λάθος να συνδέσετε αντιστάσεις έλξης στο AREF, το σωστό είναι στα 3.3V

Η εικόνα συγκόλλησης υλικού, όπως φαίνεται παρακάτω:

Μετά τη συγκόλληση, συναρμολόγηση μονάδας υλικού σε κρούστα, όπως φαίνεται παρακάτω:

Ολοκληρωμένη εικόνα εφέ

Συνιστάται: