فهرست مطالب:

چگونه می توان شمارنده قدم ساخت؟: 3 مرحله (همراه با تصاویر)
چگونه می توان شمارنده قدم ساخت؟: 3 مرحله (همراه با تصاویر)

تصویری: چگونه می توان شمارنده قدم ساخت؟: 3 مرحله (همراه با تصاویر)

تصویری: چگونه می توان شمارنده قدم ساخت؟: 3 مرحله (همراه با تصاویر)
تصویری: قدم به قدم ترک خودارضایی از روز سوم تا روز ۹۰ و اتفاقات از ابتدا تا انتها ... 2024, دسامبر
Anonim
Image
Image
ایجاد پروژه Blynk
ایجاد پروژه Blynk

قبلاً در بسیاری از ورزش ها عملکرد خوبی داشتم: پیاده روی ، دویدن ، دوچرخه سواری ، بدمینتون و غیره.

من عاشق دوچرخه سواری برای سفرهای دور و دراز هستم. خوب ، به شکم شکم من نگاه کنید ……

خوب ، به هر حال ، من تصمیم می گیرم که دوباره تمرین کنم. چه تجهیزاتی باید تهیه کنم؟ علاوه بر امکانات ورزشی ، بله! من به یک ساز نیاز دارم! من معتقدم که با آن ، می توانم مقدار مناسب ورزش را حفظ کنم. در اینجا ساز به وجود می آید. بیایید با یک ویدیو شروع کنیم

این ابزار نه تنها می تواند مراحل (و کالری) را در زمان واقعی ثبت کند ، بلکه زمان را نیز نشان می دهد. چیزی که خاص است این است که قالب نمایشگر اشاره گر است - بسیار جالب! من واقعا، واقعا دوستش دارم!

می توانید سوابق خود را در اینترنت بارگذاری کنید

فقط با یک کلیک همه رکوردها را می توان با Blynk (یک نرم افزار تلفن هوشمند که قبلاً معرفی شده بود) نمایش داد. همان ساعت هوشمند پوشیدنی ، این ابزار زمان را روی خط می گیرد (بنابراین نیازی به ترس از قدرت و زمان به روزرسانی ندارید).

سخت افزار در meed:

FireBeetle Board-ESP32

FireBeetle Covers-Proto Board

صفحه نمایش dispale OLED12864

ماژول شتابدهی

باتری 3.7V (خرید آنلاین ، حجم آن حدود 600mAH است)

3 بطری (خرید آنلاین)

ساخت این پروژه توسط Blybk بسیار راحت است.

مرحله 1: یک پروژه Blynk ایجاد کنید

دو کنترل اضافه کنید:

نمایش مقدار * 1

ساعت در زمان واقعی * 1

نام Value Display باید روی مراحل تنظیم شود ، اما هیچ تنظیماتی برای خواص ساعت در زمان واقعی ندارد. V1 را به عنوان پین ورودی برای تنظیم طرح کنترل ها ، مانند شکل زیر انتخاب کنید.

مرحله 2: برنامه ها را در FireBeetle Board-ESP32 بارگیری کنید

برای بارگیری کد منبع به esp32 اینجا را کلیک کنید. کد منبع شامل فایلهای کتابخانه و فایلهای چاپ سه بعدی است. شما باید فایل کتابخانه را در lib of arduino ذخیره کنید. و فایلهای سه بعدی می توانند مستقیماً پوسته چاپ کنند.

در زیر برنامه اصلی است

#Include #include // فقط برای آردوینو 1.6.5 و نسخه های قبلی مورد نیاز است #شامل "SSD1306.h" // نام مستعار برای "#include" SSD1306Wire.h " # #شامل" OLEDDisplayUi.h " #شامل" images.h " # شامل #شامل #شامل #شامل #شامل #شامل #تعریف POWER_KEY 1 #تعریف MENU_KEY 2 #تعریف UPLOAD_KEY 3 بارگذاری بول = false؛ صفحه نمایش SSD1306 (0x3c ، 18 ، 0) ؛ OLEDDisplayUi ui (& نمایش)؛ تایمر SimpleTimer ؛ WidgetRTC rtc؛ int screenW = 128؛ int screenH = 64 ؛ int clockCenterX = screenW/2؛ int clockCenterY = ((screenH-16)/2) +16 ؛ // قسمت زرد بالا 16 پیکسل ارتفاع int clockRadius = 23؛ #تعریف DEVICE (0x53) // آدرس دستگاه ADXL345 #تعریف TO_READ (6) // تعداد بایت هایی که قرار است هربار بخوانیم (دو بایت برای هر محور) byte buff [TO_READ] ؛ // 6 بایت بافر برای ذخیره داده های خوانده شده از دستگاه char char [100] ؛ // رشته بافر برای تبدیل داده ها قبل از ارسال آنها به پورت سریال int regAddress = 0x32؛ // اولین ثبت اطلاعات محور-شتاب در ADXL345 int xx ، yy ، zz ؛ // داده های شتاب سه محور static int currentValue = 0؛ مراحل طولانی بدون علامت ثابت جمع = 0؛ char auth = "YourAuthToken"؛ // اعتبارنامه WiFi شما. // برای شبکه های باز گذرواژه را روی "" قرار دهید. char ssid = "YourNetworkName"؛ char pass = "YourPassword"؛ const charing_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، مقدار 0x00، 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، 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، مقدار 0x00، مقدار 0x00، مقدار 0x00، 0xF4، 0x07، 0x00، 0x00، 0x00، 0xF4، 0x0F، 0x00، 0x00، 0x00، 0xF9، 0x0F، 0x00، 0x00، 0x00، 0xFC، 0x1F، 0x00، 0x00، 0x80، 0xFE، 0x00، 0x1F، 0x00، 0x00، 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، 0x90، 0x0F، مقدار 0x00، 0xE0، 0x00 ، 0xE8 ، 0x0F ، 0x00 ، 0xE8 ، 0x00 ، 0xF0 ، 0x09 ، 0x00 ، 0x60 ، 0x01 ، 0xF0 ، 0x04 ، 0x00 ، 0x00 ، 0x00 ،} ؛ // تابع ابزار برای نمایش ساعت دیجیتال: چاپ 0 پیشرو 0 String twoDigits (رقم int) {if (رقم <10) {String i = '0'+String (رقم) ؛ بازگشت i؛ } else {بازگشت رشته (رقم) ؛ }} void clockOverlay (OLEDDisplay * display، OLEDDisplayUiState * state) {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 (angle) * (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 (angle) * (clockRadius - (clockRadius / 4)))) ؛ y3 = (clockCenterY - (cos (زاویه) * (clockRadius - (clockRadius / 4)))) ؛ display-> drawLine (clockCenterX + x ، clockCenterY + y ، x3 + x ، y3 + y) ؛ // نمایش زاویه عقربه ساعت = ساعت () * 30 + int ((دقیقه () / 12) * 6) ؛ angle = (angle / 57.29577951) ؛ // تبدیل درجه به رادیان x3 = (clockCenterX + (sin (angle) * (clockRadius - (clockRadius / 2)))) ؛ y3 = (clockCenterY - (cos (زاویه) * (clockRadius - (clockRa dius / 2)))) ؛ display-> drawLine (clockCenterX + x ، clockCenterY + y ، x3 + x ، y3 + y) ؛ } void digitalClockFrame (نمایش OLEDDisplay * ، حالت OLEDDisplayUiState * ، int16_t x ، int16_t y) {تاریخ رشته = رشته (سال ())+"/"+دو عدد (ماه ())+"/"+دو عدد (روز ()) ؛ 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 val) {Wire.beginTransmission (دستگاه) ؛ // شروع انتقال به دستگاه Wire.write (آدرس) ؛ // ارسال آدرس ثبت Wire.write (val)؛ // ارسال مقدار برای نوشتن Wire.endTransmission ()؛ // پایان انتقال} // تعداد بایت های شروع شده از ثبت آدرس آدرس در دستگاه به buff array void readFrom (از دستگاه int ، آدرس بایت ، int num ، byte buff ) {Wire.beginTransmission (دستگاه) را می خواند. // شروع انتقال به دستگاه Wire.write (آدرس) ؛ // آدرس را برای خواندن از Wire.endTransmission () ارسال می کند. // پایان انتقال Wire.beginTransmission (دستگاه) ؛ // شروع انتقال به دستگاه Wire.requestFrom (دستگاه ، شماره) ؛ // درخواست 6 بایت از دستگاه int i = 0؛ در حالی که (Wire.available ()) // دستگاه ممکن است کمتر از خواسته (غیرعادی) ارسال کند {buff = Wire.read ()؛ // دریافت یک بایت 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 ، "بارگذاری داده ها …") ؛ } // این آرایه اشاره گرهای عملکرد را به همه فریم ها نگه می دارد // فریم ها تنها نماهایی هستند که در FrameCallback frames = {analogClockFrame ، digitalClockFrame ، runningFrame ، uploadFrame} ؛ // چند فریم وجود دارد؟ int frameCount = 4؛ // همپوشانی ها به طور ایستا در بالای یک قاب کشیده می شوند ، به عنوان مثال. overlayCallback overlay = {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 (فریم ، frameCount) ؛ ui.setOverlays (همپوشانی ، overlaysCount) ؛ ui.disableAutoTransition ()؛ ui.switchToFrame (2) ؛ ui.init ()؛ display.flipScreenVertically ()؛ } void adxl345Init (void) {writeTo (DEVICE، 0x2D، 0)؛ writeTo (دستگاه ، 0x2D ، 16) ؛ writeTo (DEVICE ، 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 (void) {if (digitalRead (D2) == LOW) {تاخیر (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 = getKeys ()؛ if (کلید == POWER_KEY) {char static char i = 0؛ if (i) {ui.init ()؛ display.flipScreenVertically ()؛ display.displayOn ()؛ } else {display.displayOff ()؛ } i = ~ i ؛ } if (keys == MENU_KEY) {if (upload == false) {uiFrameIndex ++؛ if (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 ، INPUT) ؛ pinMode (D4 ، INPUT) ؛ Blynk.begin (author، ssid، pass)؛ rtc.begin ()؛ uiInit ()؛ adxl345Init ()؛ timer.setInterval (30 ، updateAdxl345) ؛ timer.setInterval (100 ، uploadToBlynk) ؛ } void loop () {int დარჩენილიTimeBudget = ui.update ()؛ static int testSum = 0؛ if ((testSum 0) {تاخیر (باقی ماندهTimeBudget)؛} doKeysFunction ()؛ timer.run ()؛}

احتیاط: باید تنظیمات Wi-Fi ، گذرنامه و AUTHTOKENS را برای خود تغییر دهید.

char auth = "YourAuthToken"؛ // اعتبارنامه WiFi شما. // برای شبکه های باز گذرواژه را روی "" قرار دهید. char ssid = "YourNetworkName"؛ char pass = "YourPassword"؛

مرحله 3: اتصال سخت افزار

اتصال سخت افزار
اتصال سخت افزار
اتصال سخت افزار
اتصال سخت افزار
اتصال سخت افزار
اتصال سخت افزار

OLED12864 و ماژول شتاب را به I2C ، پایین را به D2 ، D3 ، D4 وصل کنید. علاوه بر این ، 51k مقاومت کششی را به پایین اضافه کنید تا به 3.3V برسد ، که در شکل زیر نشان داده شده است.

احتیاط: اتصال مقاومت های کششی به AREF اشتباه است ، درست ترین آن 3.3 ولت است

تصویر لحیم کاری سخت افزاری ، به شرح زیر نشان داده شده است:

پس از لحیم کاری ، مونتاژ ماژول سخت افزاری به پوسته ، مانند شکل زیر نشان داده شده است:

تصویر جلوه جامع

توصیه شده: