فهرست مطالب:
- مرحله 1: یک پروژه Blynk ایجاد کنید
- مرحله 2: برنامه ها را در FireBeetle Board-ESP32 بارگیری کنید
- مرحله 3: اتصال سخت افزار
تصویری: چگونه می توان شمارنده قدم ساخت؟: 3 مرحله (همراه با تصاویر)
2024 نویسنده: John Day | [email protected]. آخرین اصلاح شده: 2024-01-30 08:52
قبلاً در بسیاری از ورزش ها عملکرد خوبی داشتم: پیاده روی ، دویدن ، دوچرخه سواری ، بدمینتون و غیره.
من عاشق دوچرخه سواری برای سفرهای دور و دراز هستم. خوب ، به شکم شکم من نگاه کنید ……
خوب ، به هر حال ، من تصمیم می گیرم که دوباره تمرین کنم. چه تجهیزاتی باید تهیه کنم؟ علاوه بر امکانات ورزشی ، بله! من به یک ساز نیاز دارم! من معتقدم که با آن ، می توانم مقدار مناسب ورزش را حفظ کنم. در اینجا ساز به وجود می آید. بیایید با یک ویدیو شروع کنیم
این ابزار نه تنها می تواند مراحل (و کالری) را در زمان واقعی ثبت کند ، بلکه زمان را نیز نشان می دهد. چیزی که خاص است این است که قالب نمایشگر اشاره گر است - بسیار جالب! من واقعا، واقعا دوستش دارم!
می توانید سوابق خود را در اینترنت بارگذاری کنید
فقط با یک کلیک همه رکوردها را می توان با 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 ولت است
تصویر لحیم کاری سخت افزاری ، به شرح زیر نشان داده شده است:
پس از لحیم کاری ، مونتاژ ماژول سخت افزاری به پوسته ، مانند شکل زیر نشان داده شده است:
تصویر جلوه جامع
توصیه شده:
چگونه می توان یک ساعت بزرگ قفسه پنهان لبه ساخت: 27 مرحله (همراه با تصاویر)
چگونه می توان یک ساعت بزرگ قفسه پنهان لبه ساخت: ما فضایی بزرگ در قسمتی از دیوار اتاق نشیمن خود داشتیم که هرگز نمی توانستیم "چیزی" مناسب برای آویزان کردن روی آن پیدا کنیم. پس از چندین سال تلاش ، تصمیم گرفتیم چیزی را برای خودمان بسازیم. این نسبتاً خوب بود (به نظر ما) بنابراین من آن را تبدیل کردم
Clockception - چگونه می توان یک ساعت را از ساعت ساخت؟!: 14 مرحله (همراه با تصاویر)
Clockception - چگونه می توان یک ساعت ساخته شده از ساعت ساخت !: سلام به همه! این ارسال من برای مسابقه نویسنده اولین بار 2020 است! اگر این پروژه را دوست دارید ، من از رای شما بسیار استقبال می کنم :) متشکرم! این دستورالعمل شما را در روند ساخت یک ساعت ساخته شده از ساعت راهنمایی می کند! من هوشمندانه نام برده ام
چگونه می توان یک تقویت کننده صوتی ساده را در محدوده Rs ساخت. 100 (2 دلار) به نام Handy Speaky: 6 مرحله (همراه با تصاویر)
چگونه می توان یک تقویت کننده صوتی ساده را در محدوده Rs ساخت. 100 (2 دلار) به نام Handy Speaky: در پروژه امروز ، من به شما نشان می دهم که چگونه ساده ترین تقویت کننده مینی صدا را بر اساس LM386 بسازید. این تقویت کننده صدا بسیار آسان ساخته می شود ، علاوه بر این ، بسیار جمع و جور است و فقط با یک منبع تغذیه با فشار کمی 6-12 ولت کار می کند. این من
چگونه می توان بادسنج خود را با استفاده از کلیدهای نی ، سنسور جلوه هال و برخی ضایعات در Nodemcu ساخت - قسمت 2 - نرم افزار: 5 مرحله (همراه با تصاویر)
نحوه ساخت بادسنج خود با استفاده از کلیدهای نی ، سنسور جلوه هال و برخی ضایعات در Nodemcu - قسمت 2 - نرم افزار: مقدمه این دنباله اولین پست است & quot؛ چگونه می توان بادسنج خود را با استفاده از کلیدهای نی ، سنسور جلوه هال و برخی ضایعات ساخت در Nodemcu - قسمت 1 - سخت افزار & quot؛ - جایی که من نحوه جمع آوری سرعت و جهت باد را نشان می دهم
کوادکوپتر DJi F450 چگونه می توان ساخت؟ خانه ساخته شده .: 7 مرحله (همراه با تصاویر)
کوادکوپتر DJi F450 چگونه می توان ساخت؟ خانه ساخته شده: این یک هواپیمای بدون سرنشین خانگی بود که توسط فرستنده و گیرنده hobby king 6channel فرستنده و کنترل کننده و کنترل کننده پرواز Kk2.1.5 کنترل می شد ، معمولاً موتورهای بدون برس با برد 1000 کیلوولت برای این کار استفاده می شود اما برای پروژه من از موتورهای 1400 کیلو ولت برای بهترین عملکرد استفاده کرده ام