תוכן עניינים:

כיצד לבצע מונה צעדים?: 3 שלבים (עם תמונות)
כיצד לבצע מונה צעדים?: 3 שלבים (עם תמונות)

וִידֵאוֹ: כיצד לבצע מונה צעדים?: 3 שלבים (עם תמונות)

וִידֵאוֹ: כיצד לבצע מונה צעדים?: 3 שלבים (עם תמונות)
וִידֵאוֹ: 5 סימנים פסיכולוגים שהיא רוצה אותך | איך לדעת שהיא רוצה אותך 2024, יוני
Anonim
Image
Image
צור פרויקט Blynk
צור פרויקט Blynk

נהגתי להופיע היטב בענפי ספורט רבים: הליכה, ריצה, רכיבה על אופניים, משחק בדמינטון וכו '.

אני אוהב לרכוב כדי לטייל בקרוב. ובכן, תסתכל על הבטן הגופנית שלי ……

ובכן, בכל מקרה, אני מחליט להתחיל לפעול מחדש. איזה ציוד עלי להכין? חוץ ממתקן ספורט, כן! אני צריך כלי! אני מאמין שבאמצעותו אני יכול לשמור על הכושר המתאים. כאן הכלי נוצר. נתחיל בסרטון ~

המכשיר לא רק יכול להקליט צעדים (וקלוריות) בזמן אמת, אלא להראות זמן. המיוחד הוא שפורמט ההצגה הוא מצביע ~ כל כך מגניב! אני ממש ממש אוהב את זה!

אתה יכול להעלות את הרשומות שלך לאינטרנט

בלחיצה אחת בלבד. ניתן להציג את כל הרשומות על ידי Blynk (תוכנת טלפון חכם שהוצגה לפני כן). אותו הדבר כמו שעון חכם לביש, המכשיר מקבל זמן באינטרנט (כך שאתה לא צריך לפחד מהעוצמה ומהזמן המתעדכן).

חומרה ב- meed:

לוח FireBele-ESP32

כיסויי FireBele-Proto

מסך הפצה OLED12864

מודול האצה

סוללת 3.7V (נקנתה באינטרנט, עוצמת הקול היא סביב 600mAH)

3 בקבוקים (נקנו באינטרנט)

מאוד נוח לבנות את הפרויקט הזה על ידי Blybk.

שלב 1: צור פרויקט Blynk

הוסף שני פקדים:

תצוגת ערך * 1

שעון בזמן אמת * 1

יש להגדיר את השם של תצוגת ערך לשלבים, אך לא להגדיר את המאפיינים של שעון בזמן אמת. בחר V1 כסיכת הקלט כדי ליישר את פריסת הפקדים, המוצג להלן.

שלב 2: הורד תוכניות ל- FireBeetle Board-ESP32

לחץ כאן להורדת קוד המקור ל- esp32. קוד המקור כולל קבצי ספרייה וקבצי הדפסה תלת -ממדית. עליך לשמור את קובץ הספרייה ב- lib of arduino. וקבצי התלת -ממד יכולים להדפיס קרום ישירות.

להלן התוכנית העיקרית

#include #include // נחוץ רק עבור Arduino 1.6.5 ומעלה #כלול "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 (& תצוגה); טיימר SimpleTimer; WidgetRTC rtc; מסך int = 128; int מסך H = 64; int clockCenterX = screenW/2; int clockCenterY = ((screenH-16)/2) +16; // החלק הצהוב העליון הוא 16 פיקסלים בגובה int clockRadius = 23; #define DEVICE (0x53) // ADXL345 כתובת מכשיר #define TO_READ (6) // מספר בתים שאנו הולכים לקרוא בכל פעם (שני בתים לכל ציר) בייט buff [TO_READ]; // מאגר 6 בתים לשמירת נתונים הנקראים ממכשיר התקן [100]; // מאגר מחרוזת כדי להפוך נתונים לפני שליחתם ליציאה הטורית int regAddress = 0x32; // רשם הנתונים הראשון של האצה-האצה-נתונים ב- ADXL345 int xx, yy, zz; // נתוני האצה של שלושה צירים סטטי int currentValue = 0; צעדים ארוכים סטטיים לא חתומים Sum = 0; char auth = "YourAuthToken"; // אישורי ה- WiFi שלך. // הגדר את הסיסמה ל- "" עבור רשתות פתוחות. char ssid = "שם הרשת שלך"; 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, 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, 0x0, 0x, 0xF8, 0x17, 0x00, 0x00, 0xC0, 0xF8, 0x0F, 0x00, 0x00, 0xE0, 0xFB, 0x17, 0x00, 0x00, 0xC0, 0xFF, 0x13, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 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, 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, 0x0 0x00, 0xC0, 0x01, 0xF0, 0x03, 0x00, 0xC0, 0x03, 0xE8, 0x07, 0x00, 0xC0, 0x03, 0x88, 0x6F, 0x00, 0x80, 0x03, 0x40, 0x1E, 0x0, 0x0, 0x0, 0x0, 0x0 0x00, 0x80, 0x03, 0x00, 0xF8, 0x01, 0x00, 0x07, 0x00, 0xF4, 0x00, 0x00, 0x07, 0x00, 0xE8, 0x00, 0x80, 0x0F, 0x00, 0xE8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x00, 0xE8, 0x0F, 0x00, 0xE8, 0x00, 0xF0, 0x09, 0x00, 0x60, 0x01, 0xF0, 0x04, 0x00, 0x00, 0x00,}; // פונקציית השירות לתצוגת שעון דיגיטלי: הדפסה מובילה של 0 מחרוזת דו -ספרות (int ספרות) {if (ספרות <10) {מחרוזת i = '0'+מחרוזת (ספרות); החזר i; } else {מחרוזת החזרה (ספרות); }} void clockOverlay (תצוגת OLEDDisplay *, מצב OLEDDisplayUiState * {if ((hour () == 0) && (minute () == 0) && (second () == 0)) stepsSum = 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))))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // תצוגת זווית יד של שעה = שעה () * 30 + int ((דקה () / 12) * 6); זווית = (זווית / 57.29577951); // המרת מעלות לרדיאנים x3 = (clockCenterX + (sin (זווית) * (clockRadius - (clockRadius / 2)))); y3 = (clockCenterY - (cos (זווית) * (clockRadius - (clockRa דיוס / 2))))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); } void digitalClockFrame (תצוגת OLEDDisplay *, מצב OLEDDisplayUiState *, int16_t x, int16_t y) {תאריך מחרוזת = מחרוזת (שנה ())+"/"+twoDigits (חודש ())+"/"+twoDigits (יום ()); Sten 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, כתובת בתים, בייט val) {Wire.beginTransmission (מכשיר); // התחל שידור למכשיר Wire.write (כתובת); // שלח כתובת רישום Wire.write (val); // שלח ערך כדי לכתוב Wire.endTransmission (); // סוף שידור} // קורא מספר בתים החל מרשום כתובות במכשיר אל buff buff void readFrom (int device, byte address, int num, byte buff ) {Wire.beginTransmission (device); // התחל שידור למכשיר Wire.write (כתובת); // שולח כתובת לקריאה מ- Wire.endTransmission (); // סיום שידור Wire.beginTransmission (מכשיר); // התחל שידור למכשיר Wire.requestFrom (מכשיר, מספר); // לבקש 6 בתים מהמכשיר int i = 0; בעוד (Wire.available ()) // המכשיר עשוי לשלוח פחות מהמתבקש (חריג) {buff = Wire.read (); // לקבל בתים i ++; } Wire.endTransmission (); // end transmission} 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, "העלאת נתונים …"); } // מערך זה שומר מצביעי פונקציות לכל המסגרות // מסגרות הן התצוגות היחידות המחליקות במסגרות FrameCallback = {analogClockFrame, digitalClockFrame, runningFrame, uploadFrame}; // כמה מסגרות יש? int frameCount = 4; // שכבות -על מצויירות סטטית על גבי מסגרת למשל. שכבות -על OverCallback שכבות = {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 (מסגרות, frameCount); ui.setOverlays (שכבות -על, שכבות -על); ui.disableAutoTransition (); ui.switchToFrame (2); ui.init (); display.flipScreenVertically (); } void adxl345Init (void) {writeTo (DEVICE, 0x2D, 0); writeTo (DEVICE, 0x2D, 16); writeTo (DEVICE, 0x2D, 8); } void updateAdxl345 (void) {readFrom (DEVICE, regAddress, TO_READ, buff); // קרא את נתוני ההאצה מה- ADXL345 xx = (((int) buff [1]) << 8) | חובב [0]; yy = (((int) buff [3]) << 8) | חובב [2]; zz = (((int) buff [5]) << 8) | חובב [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); החזר POWER_KEY; }} if (digitalRead (D3) == LOW) {עיכוב (5); if (digitalRead (D3) == LOW) {while (digitalRead (D3) == LOW); חזור MENU_KEY; }} if (digitalRead (D4) == LOW) {עיכוב (5); if (digitalRead (D4) == LOW) {while (digitalRead (D4) == LOW); החזר UPLOAD_KEY; }} החזר 0; } void doKeysFunction (void) {static int uiFrameIndex = 2; int keys = getKeys (); אם (מפתחות == POWER_KEY) {char סטטי i = 0; אם (i) {ui.init (); display.flipScreenVertically (); display.displayOn (); } אחר {display.displayOff (); } i = ~ i; } if (keys == MENU_KEY) {if (upload == false) {uiFrameIndex ++; אם (uiFrameIndex == 3) uiFrameIndex = 0; ui.switchToFrame (uiFrameIndex); } אחר {ui.switchToFrame (3); }} if (keys == UPLOAD_KEY) {if (upload == true) {upload = false; ui.switchToFrame (uiFrameIndex); } אחר {upload = true; ui.switchToFrame (3); }}} הגדרת void () {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 () {int stayingTimeBudget = ui.update (); static int testSum = 0; if ((testSum 0) {delay (stayingTimeBudget);} doKeysFunction (); timer.run ();}

זהירות: עליך לשנות את הגדרת ה- Wi-Fi, דרכון ו- AUTHTOKENS לעצמך.

char auth = "YourAuthToken"; // אישורי ה- WiFi שלך. // הגדר את הסיסמה ל- "" עבור רשתות פתוחות. char ssid = "שם הרשת שלך"; char pass = "סיסמת YourPassword";

שלב 3: חיבור חומרה

חיבור חומרה
חיבור חומרה
חיבור חומרה
חיבור חומרה
חיבור חומרה
חיבור חומרה

חבר OLED12864 ומודול האצה ל- I2C, תחתית ל- D2, D3, D4. יתר על כן, הוסף נגדי משיכה של 51k לתחתית כדי להגיע ל- 3.3V, כפי שמוצג להלן.

זהירות: לא נכון לחבר נגדי משיכה ל- AREF, הנכון הוא 3.3V

תמונת הלחמת החומרה, המוצגת להלן:

לאחר הלחמה, הרכבת מודול חומרה לקרום, המוצג להלן:

תמונת אפקט מקיפה ~

מוּמלָץ: