جدول المحتويات:

كيف تصنع عداد خطوات؟: 3 خطوات (بالصور)
كيف تصنع عداد خطوات؟: 3 خطوات (بالصور)

فيديو: كيف تصنع عداد خطوات؟: 3 خطوات (بالصور)

فيديو: كيف تصنع عداد خطوات؟: 3 خطوات (بالصور)
فيديو: شرطي يشرح طريقة فتح نافذة السيارة في حال نسيت المفتاح بالداخل #shorts 2024, سبتمبر
Anonim
Image
Image
قم بإنشاء مشروع Blynk
قم بإنشاء مشروع Blynk

كنت أؤدي أداءً جيدًا في العديد من الرياضات: المشي والجري وركوب الدراجة ولعب تنس الريشة وما إلى ذلك.

أحب الركوب للسفر قبل وقت طويل. حسنًا ، انظر إلى بطني المنتصب …….

حسنًا ، على أي حال ، قررت إعادة التمرين. ما هي المعدات التي يجب أن أحضرها؟ إلى جانب المنشأة الرياضية ، نعم! أحتاج إلى آلة! أنا أؤمن به ، يمكنني الحفاظ على قدر مناسب من التمرين. هنا تأتي الآلة إلى حيز الوجود. لنبدأ بالفيديو ~

لا يمكن للأداة فقط تسجيل الخطوات (والسعرات الحرارية) في الوقت الفعلي ، ولكن إظهار الوقت. ما هو خاص هو أن شكل العرض هو المؤشر ~ رائع جدًا! أنا حقا، أحب ذلك حقا!

يمكنك تحميل السجلات الخاصة بك على الإنترنت

بنقرة واحدة فقط. يمكن عرض جميع السجلات بواسطة 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 فولت

صورة لحام الأجهزة ، كما هو موضح أدناه:

بعد اللحام ، يتم تجميع وحدة الأجهزة على القشرة ، كما هو موضح أدناه:

صورة تأثير شامل ~

موصى به: