תוכן עניינים:
וִידֵאוֹ: כיצד לבצע מונה צעדים?: 3 שלבים (עם תמונות)
2024 מְחַבֵּר: John Day | [email protected]. שונה לאחרונה: 2024-01-30 09:12
נהגתי להופיע היטב בענפי ספורט רבים: הליכה, ריצה, רכיבה על אופניים, משחק בדמינטון וכו '.
אני אוהב לרכוב כדי לטייל בקרוב. ובכן, תסתכל על הבטן הגופנית שלי ……
ובכן, בכל מקרה, אני מחליט להתחיל לפעול מחדש. איזה ציוד עלי להכין? חוץ ממתקן ספורט, כן! אני צריך כלי! אני מאמין שבאמצעותו אני יכול לשמור על הכושר המתאים. כאן הכלי נוצר. נתחיל בסרטון ~
המכשיר לא רק יכול להקליט צעדים (וקלוריות) בזמן אמת, אלא להראות זמן. המיוחד הוא שפורמט ההצגה הוא מצביע ~ כל כך מגניב! אני ממש ממש אוהב את זה!
אתה יכול להעלות את הרשומות שלך לאינטרנט
בלחיצה אחת בלבד. ניתן להציג את כל הרשומות על ידי 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
תמונת הלחמת החומרה, המוצגת להלן:
לאחר הלחמה, הרכבת מודול חומרה לקרום, המוצג להלן:
תמונת אפקט מקיפה ~
מוּמלָץ:
כיצד לבצע בקרת צלילים LM358 למגבר 2.1: 7 שלבים (עם תמונות)
כיצד להכין בקרת טון LM358 למגבר 2.1: אז בערוץ היוטיוב שלי אנשים רבים שואלים כיצד לשלב שני מגברים לאחד. המגבר הראשון משמש לרמקולי לוויין והמגבר השני משמש לרמקולי סאב וופר. ניתן לקרוא לתצורת התקנת מגבר זו אמפר
כיצד לבצע אוטומציה ביתית מבוססת IoT עם ממסר בקרת חיישני NodeMCU: 14 שלבים (עם תמונות)
כיצד לבצע אוטומציה ביתית מבוססת IoT באמצעות ממסר בקרת חיישני NodeMCU: בפרויקט זה מבוסס IoT, עשיתי אוטומציה ביתית עם מודול ממסר שליטה של Blynk ו- NodeMCU עם משוב בזמן אמת. במצב ידני, ניתן לשלוט על מודול ממסר זה מהנייד או מהסמארטפון, ומתג ידני. במצב אוטומטי, הסמאר הזה
כיצד לבצע דיגיטציה של שקופיות ושלילי סרטים באמצעות DSLR: 12 שלבים (עם תמונות)
כיצד לעשות דיגיטציה לשקופיות ולסרטים שליליים באמצעות DSLR: מערך רב תכליתי ויציב לדיגיטציה של שקופיות ושליליות באמצעות DSLR או כל מצלמה עם אפשרות מאקרו. מדריך זה הוא עדכון של כיצד לבצע דיגיטציה של 35 מ"מ שליליות (הועלה ביולי 2011) עם מספר שיפורים להרחבת
מונה צעדים - מיקרו: ביט: 12 שלבים (עם תמונות)
מונה צעדים - מיקרו: ביט: פרויקט זה יהווה מונה צעד. נשתמש בחיישן מד התאוצה המובנה ב- Micro: Bit למדידת הצעדים שלנו. בכל פעם שהמיקרו: ביט רועד נוסיף 2 לספירה ונציג אותו על המסך
כיצד לבצע מעגל הגנה על מעגלים קצרים: 10 שלבים (עם תמונות)
כיצד להפוך מעגל הגנה על מעגלים קצרים: היי חבר, היום אני עומד ליצור מעגל להגנה על מעגל קצר. מעגל זה נבצע באמצעות ממסר 12V. כיצד מעגל זה יפעל - כאשר יתרחש קצר בזמן הצד של העומס ואז המעגל ינותק אוטומטית