جدول المحتويات:
- الخطوة 1: قم بإنشاء مشروع Blynk
- الخطوة 2: قم بتنزيل البرامج على FireBeetle Board-ESP32
- الخطوة 3: توصيل الأجهزة
فيديو: كيف تصنع عداد خطوات؟: 3 خطوات (بالصور)
2024 مؤلف: John Day | [email protected]. آخر تعديل: 2024-01-30 07:36
كنت أؤدي أداءً جيدًا في العديد من الرياضات: المشي والجري وركوب الدراجة ولعب تنس الريشة وما إلى ذلك.
أحب الركوب للسفر قبل وقت طويل. حسنًا ، انظر إلى بطني المنتصب …….
حسنًا ، على أي حال ، قررت إعادة التمرين. ما هي المعدات التي يجب أن أحضرها؟ إلى جانب المنشأة الرياضية ، نعم! أحتاج إلى آلة! أنا أؤمن به ، يمكنني الحفاظ على قدر مناسب من التمرين. هنا تأتي الآلة إلى حيز الوجود. لنبدأ بالفيديو ~
لا يمكن للأداة فقط تسجيل الخطوات (والسعرات الحرارية) في الوقت الفعلي ، ولكن إظهار الوقت. ما هو خاص هو أن شكل العرض هو المؤشر ~ رائع جدًا! أنا حقا، أحب ذلك حقا!
يمكنك تحميل السجلات الخاصة بك على الإنترنت
بنقرة واحدة فقط. يمكن عرض جميع السجلات بواسطة Blynk (برنامج هاتف ذكي تم تقديمه من قبل). مثل الساعة الذكية القابلة للارتداء ، تحصل الأداة على الوقت على الإنترنت (لذلك لا داعي للخوف من تحديث الطاقة والوقت).
الأجهزة في ميد:
لوحة FireBeetle-ESP32
أغطية FireBeetle - لوح بروتو
شاشة عرض OLED12864
وحدة التسريع
بطارية 3.7 فولت (تم شراؤها عبر الإنترنت ، الحجم حوالي 600 مللي أمبير في الساعة
3 زجاجات (تم شراؤها عبر الإنترنت
من المريح جدًا بناء هذا المشروع بواسطة Blybk.
الخطوة 1: قم بإنشاء مشروع Blynk
أضف عنصري تحكم:
عرض القيمة * 1
ساعة الوقت الحقيقي * 1
يجب تعيين اسم عرض القيمة على الخطوات ، ولكن لا يوجد إعداد لخصائص ساعة الوقت الفعلي. اختر V1 كدبوس الإدخال لتعديل تخطيط عناصر التحكم ، كما هو موضح أدناه.
الخطوة 2: قم بتنزيل البرامج على FireBeetle Board-ESP32
انقر هنا لتنزيل الكود المصدري إلى esp32. يتكون كود المصدر من ملفات مكتبة وملفات طباعة ثلاثية الأبعاد. يجب عليك حفظ ملف المكتبة في lib من arduino. ويمكن للملفات ثلاثية الأبعاد طباعة القشور مباشرة.
أدناه هو البرنامج الرئيسي
# تضمين # تضمين // مطلوب فقط لـ Arduino 1.6.5 والإصدارات الأقدم # تضمين "SSD1306.h" // الاسم المستعار لـ `# تضمين" SSD1306Wire.h "` # تضمين "OLEDDisplayUi.h" # تضمين "images.h" # تضمين # تضمين # تضمين # تضمين # تضمين # تحديد POWER_KEY 1 # تعريف MENU_KEY 2 # تعريف UPLOAD_KEY 3 تحميل منطقي = خطأ ؛ عرض SSD1306 (0x3c ، 18 ، 0) ؛ OLEDDisplayUi ui (وعرض) ؛ مؤقت SimpleTimer ؛ القطعة RTC rtc ؛ شاشة int = 128 ؛ شاشة كثافة العمليات = 64 ؛ int ClockCenterX = screenW / 2 ؛ int clockCenterY = ((screenH-16) / 2) +16 ؛ // الجزء العلوي الأصفر هو 16 بكسل ارتفاع في clockRadius = 23 ؛ #define DEVICE (0x53) // ADXL345 device address #define TO_READ (6) // عدد البايتات التي سنقرأها في كل مرة (2 بايت لكل محور) بايت Buff [TO_READ] ؛ // 6 بايت عازلة لحفظ البيانات المقروءة من الجهاز char str [100] ؛ // سلسلة عازلة لتحويل البيانات قبل إرسالها إلى المنفذ التسلسلي int regAddress = 0x32 ؛ // سجل بيانات تسريع المحور الأول على ADXL345 int xx، yy، zz؛ // ثلاثة محاور تسريع البيانات static int currentValue = 0 ؛ خطوات طويلة ثابتة غير موقعة المجموع = 0 ؛ char auth = "YourAuthToken" ؛ // بيانات اعتماد WiFi الخاصة بك. // تعيين كلمة المرور على "" للشبكات المفتوحة. char ssid = "YourNetworkName"؛ char pass = "YourPassword" ؛ تشغيل حرف ثابت: 0xFC، 0x00، 0x00، 0x00، 0x00، 0xF8، 0x01، 0x00، 0x00، 0x00، 0xF8، 0x01، 0x00، 0x00، 0x00، 0xE0، 0x03، 0x00، 0x00، 0x60، 0xF1، 0x07، 0x00، 0x00، 0x20،::: 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 ، 0x05 ، 0xF8 ، 0x01 ، 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، 0x90، 0x0F، 0x00، 0xE0، 0x00 ، 0xE8 ، 0x0F ، 0x00 ، 0xE8 ، 0x00 ، 0xF0 ، 0x09 ، 0x00 ، 0x60 ، 0x01 ، 0xF0 ، 0x04 ، 0x00 ، 0x00 ، 0x00 ،} ؛ // وظيفة المنفعة لعرض الساعة الرقمية: طباعة تؤدي إلى 0 سلسلة من رقمين (أرقام int) {if (digits <10) {String i = '0' + String (digits)؛ العودة أنا } else {return String (digits)؛ }} تراكمات فارغة (عرض OLEDDisplay * ، OLEDDisplayUiState * state) {if ((hour () == 0) && (minutes () == 0) && (second () == 0)) stepsSum = 0؛ } void analogClockFrame (OLEDDisplay * display، OLEDDisplayUiState * state، 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)؛} // عرض زاوية تعويم اليد الثانية = second () * 6؛ angle = (زاوية / 57.29577951) ؛ // تحويل الدرجات إلى راديان int x3 = (clockCenterX + (الخطيئة (زاوية) * (clockRadius - (clockRadius / 5)))) ؛ int y3 = (clockCenterY - (cos (angle) * (clockRadius - (clockRadius / 5))) ؛ عرض-> رسم خط (clockCenterX + x ، clockCenterY + y ، x3 + x ، y3 + y) ؛ // عرض زاوية عقرب الدقائق = دقيقة () * 6 ؛ زاوية = (زاوية / 57.29577951) ؛ // تحويل الدرجات إلى راديان x3 = (clockCenterX + (الخطيئة (زاوية) * (clockRadius - (clockRadius / 4)))) ؛ y3 = (clockCenterY - (cos (زاوية) * (clockRadius - (clockRadius / 4)))) ؛ عرض-> drawLine (clockCenterX + x ، clockCenterY + y ، x3 + x ، y3 + y) ؛ // عرض زاوية عقرب الساعة = ساعة () * 30 + int ((دقيقة () / 12) * 6) ؛ زاوية = (زاوية / 57.29577951) ؛ // تحويل الدرجات إلى راديان x3 = (clockCenterX + (الخطيئة (زاوية) * (clockRadius - (clockRadius / 2)))) ؛ y3 = (clockCenterY - (cos (زاوية) * (clockRadius - (clockRa ديوس / 2)))) ؛ عرض-> 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 (minutes ()) + ":" + twoDigits (second ())؛ عرض-> setTextAlignment (TEXT_ALIGN_CENTER) ؛ عرض-> setFont (ArialMT_Plain_24) ؛ عرض-> drawString (clockCenterX + x ، 20 ، timenow) ؛ عرض-> setFont (ArialMT_Plain_16) ؛ عرض-> drawString (60 ، 45 ، التاريخ) ؛ } writeTo باطلة (جهاز int ، عنوان بايت ، قيمة بايت) {Wire.beginTransmission (الجهاز) ؛ // بدء الإرسال إلى الجهاز Wire.write (العنوان) ؛ // إرسال عنوان السجل Wire.write (val) ؛ // إرسال القيمة لكتابة Wire.endTransmission () ؛ // end Transmission} // يقرأ عدد البايتات بدءًا من تسجيل العنوان على الجهاز إلى صفيف فارغ للقراءة من (جهاز int ، عنوان بايت ، int num ، byte buff ) {Wire.beginTransmission (device) ؛ // بدء الإرسال إلى الجهاز Wire.write (العنوان) ؛ // يرسل العنوان للقراءة من Wire.endTransmission () ؛ // نهاية الإرسال Wire.beginTransmission (الجهاز) ؛ // بدء الإرسال إلى الجهاز Wire.requestFrom (الجهاز ، العدد) ؛ // طلب 6 بايت من الجهاز int i = 0 ؛ while (Wire.available ()) // قد يرسل أقل من المطلوب (غير طبيعي) {buff = Wire.read () ؛ // تلقي بايت i ++ ؛ } Wire.endTransmission () ؛ // end Transmission} void runningFrame (OLEDDisplay * display، OLEDDisplayUiState * state، int16_t x، int16_t y) {float calValue = stepsSum * 0.4487؛ عرض-> setTextAlignment (TEXT_ALIGN_CENTER) ؛ عرض-> setFont (ArialMT_Plain_24) ؛ عرض-> drawString (ClockCenterX ، ClockCenterY ، str) ؛ sprintf (str، "٪.2fcal"، calValue) ؛ عرض-> setTextAlignment (TEXT_ALIGN_CENTER) ؛ عرض-> setFont (ArialMT_Plain_10) ؛ عرض-> drawString (100 ، 20 ، str) ؛ عرض-> drawXbm (10 ، 14 ، 34 ، 50 ، run_Logo_bits) ؛ } تحميل باطل (OLEDDisplay * display، OLEDDisplayUiState * state، int16_t x، int16_t y) {display-> setFont (ArialMT_Plain_16) ؛ display-> drawString (60، 45، "تحميل البيانات …")؛ } // هذه المصفوفة تحتفظ بمؤشرات الوظيفة لكل الإطارات // الإطارات هي العروض الفردية التي تنزلق في إطارات FrameCallback = {analogClockFrame، digitalClockFrame، runningFrame، uploadFrame}؛ // كم عدد الإطارات الموجودة؟ int frameCount = 4 ؛ // يتم رسم التراكبات بشكل ثابت أعلى إطار على سبيل المثال. تراكبات OverlayCallback على مدار الساعة = {clockOverlay} ؛ int overaysCount = 1 ؛ void uploadToBlynk (void) {if (upload == true) {Blynk.virtualWrite (V0، stepsSum)؛ Blynk.virtualWrite (V1 ، stepsSum) ؛ }} 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 () ، } adxl345Init باطل (باطل) {writeTo (DEVICE، 0x2D، 0) ؛ الكتابة إلى (جهاز ، 0x2D ، 16) ؛ الكتابة إلى (جهاز ، 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] ؛ إذا (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) {delay (5)؛ if (digitalRead (D3) == LOW) {while (digitalRead (D3) == LOW) ؛ إرجاع MENU_KEY ؛ }} if (digitalRead (D4) == LOW) {delay (5)؛ if (digitalRead (D4) == LOW) {while (digitalRead (D4) == LOW) ؛ إرجاع UPLOAD_KEY ؛ }} إرجاع 0؛ } doKeysFunction (void) باطل {static int uiFrameIndex = 2 ؛ مفاتيح int = getKeys () ؛ if (keys == POWER_KEY) {static char i = 0 ؛ إذا (i) {ui.init () ؛ display.flipScreenVertically () ، display.displayOn () ، } else {display.displayOff ()؛ } أنا = ~ أنا ؛ } if (keys == MENU_KEY) {if (upload == false) {uiFrameIndex ++؛ إذا (uiFrameIndex == 3) uiFrameIndex = 0 ؛ ui.switchToFrame (uiFrameIndex) ؛ } else {ui.switchToFrame (3) ؛ }} if (keys == UPLOAD_KEY) {if (upload == true) {upload = false؛ ui.switchToFrame (uiFrameIndex) ؛ } else {upload = true؛ ui.switchToFrame (3) ، }}} void setup () {pinMode (D2، INPUT)؛ pinMode (D3 ، الإدخال) ؛ pinMode (D4 ، الإدخال) ؛ Blynk.begin (auth ، ssid ، pass) ؛ rtc.begin () ، uiInit () ، adxl345Init () ، timer.setInterval (30 ، updateAdxl345) ؛ timer.setInterval (100 ، uploadToBlynk) ؛ } حلقة باطلة () {int dynamicTimeBudget = ui.update () ؛ اختبار كثافة العمليات الساكنة = 0 ؛ إذا ((testSum 0) {delay (dynamicTimeBudget)؛} doKeysFunction ()؛ timer.run ()؛}
تحذير: يجب عليك تعديل إعدادات Wi-Fi وجواز السفر والمرجعيات لنفسك.
char auth = "YourAuthToken" ؛ // بيانات اعتماد WiFi الخاصة بك. // تعيين كلمة المرور على "" للشبكات المفتوحة. char ssid = "YourNetworkName"؛ char pass = "YourPassword" ؛
الخطوة 3: توصيل الأجهزة
قم بتوصيل OLED12864 ووحدة التسريع بـ I2C ، القيعان بـ D2 ، D3 ، D4. علاوة على ذلك ، أضف مقاومات سحب 51 كيلو إلى القيعان لتصل إلى 3.3 فولت ، كما هو موضح أدناه.
تحذير: من الخطأ توصيل مقاومات السحب بـ AREF ، المقاومات الصحيحة هي 3.3 فولت
صورة لحام الأجهزة ، كما هو موضح أدناه:
بعد اللحام ، يتم تجميع وحدة الأجهزة على القشرة ، كما هو موضح أدناه:
صورة تأثير شامل ~
موصى به:
كيف تصنع Softstarter: 4 خطوات (بالصور)
كيف تصنع Softstarter: في هذا المشروع الصغير ، سنلقي نظرة فاحصة على الأجهزة التي تتطلب softstarter من أجل العمل بشكل صحيح مع نظام إخراج محدود. تشتمل الأجهزة الموضحة في هذا المشروع على عاكس ، ومحول دفعة ، ومصدر طاقة
كيف تصنع منهاجًا على Scratch: 6 خطوات (بالصور)
كيفية إنشاء منصة على Scratch: Scratch هو موقع ويب يقوم فيه الأشخاص بإنشاء ألعاب وبرامج أخرى باستخدام كتل معدة مسبقًا تقوم بسحبها وإفلاتها في مساحة العمل. سأوضح لك اليوم كيفية صنع لعبة منصات من الصفر
كيف تصنع جهاز الرؤية الليلية الخاص بك: 5 خطوات (بالصور)
كيف تصنع جهاز الرؤية الليلية الخاص بك!: في هذا المشروع سأوضح لك كيفية إنشاء جهاز للرؤية الليلية. تتكون بشكل أساسي من كاميرا مراقبة وشاشة صغيرة و PCB مخصص يتميز بمصابيح IR LED ومحرك LED. بعد تشغيل الجهاز باستخدام powerbank USB Type-C PD ، يمكنك
كيف تصنع وحدة التحكم في الألعاب الخاصة بك: 6 خطوات (بالصور)
كيف تصنع وحدة التحكم في الألعاب الخاصة بك: هل أردت يومًا أن تصنع وحدة التحكم في ألعاب الفيديو الخاصة بك؟ وحدة تحكم رخيصة وصغيرة وقوية وحتى تناسب جيبك تمامًا؟ لذلك في هذا المشروع ، سأوضح لكم يا رفاق كيفية صنع وحدة تحكم في الألعاب باستخدام Raspberry Pi ، ولكن ما هو Raspberry
كيف تصنع عداد بالميكروبيت: 9 خطوات
كيف تصنع عدادًا باستخدام Microbit؟: عندما نركب طائرة ، غالبًا ما نواجه موقفًا مثل هذا: مضيفة جميلة تحمل صندوقًا فضيًا صغيرًا تستمر في الضغط عليه أثناء مرورها. إنها تذمر: 1،2،3،4،5،6 …… يجب أن تفكر في ذلك - إنها تحسب العدد الإجمالي