สารบัญ:
- ขั้นตอนที่ 1: สร้างโครงการ Blynk
- ขั้นตอนที่ 2: ดาวน์โหลดโปรแกรมไปที่ FireBeetle Board-ESP32
- ขั้นตอนที่ 3: การเชื่อมต่อฮาร์ดแวร์
วีดีโอ: วิธีทำตัวนับขั้นตอน: 3 ขั้นตอน (พร้อมรูปภาพ)
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:03
ฉันเคยเล่นกีฬาหลายประเภทได้ดี เช่น เดิน วิ่ง ขี่จักรยาน เล่นแบตมินตัน เป็นต้น
ฉันชอบขี่ไปเที่ยวรอบ ๆ มาก่อน ดูหน้าท้องฉันสิ……
อย่างไรก็ตาม ฉันตัดสินใจเริ่มออกกำลังกายใหม่ ต้องเตรียมอุปกรณ์อะไรบ้าง? นอกจากศูนย์กีฬาแล้ว เย้! ฉันต้องการเครื่องมือ! ฉันเชื่อว่าฉันสามารถออกกำลังกายได้ในปริมาณที่เหมาะสม เครื่องดนตรีมาถึงแล้ว มาเริ่มกันที่วิดีโอกันเลย~
เครื่องมือนี้ไม่เพียงแต่สามารถบันทึกขั้นตอน (และแคลอรี่) ได้แบบเรียลไทม์ แต่ยังแสดงเวลาอีกด้วย ที่พิเศษคือรูปแบบการแสดงเป็นแบบพอยน์เตอร์~ เท่มาก! ฉันชอบมันมากจริงๆ!
คุณสามารถอัปโหลดบันทึกของคุณไปยังอินเทอร์เน็ต
เพียงคลิกเดียว บันทึกทั้งหมดสามารถแสดงได้โดย Blynk (ซอฟต์แวร์สมาร์ทโฟนที่เปิดตัวก่อนหน้านี้) เช่นเดียวกับนาฬิกาสมาร์ทที่สวมใส่ได้ เครื่องมือจะได้รับเวลาออนไลน์ (ดังนั้นคุณจึงไม่ต้องกลัวการอัพเดทกำลังและเวลา)
ฮาร์ดแวร์ในสื่อ:
บอร์ด FireBeetle-ESP32
FireBeetle Covers-บอร์ดโปร
หน้าจอแสดง OLED12864
โมดูลเร่งความเร็ว
แบตเตอรี่ 3.7V (ซื้อออนไลน์ ระดับเสียงประมาณ 600mAH)
3 ปุ่ม (ซื้อออนไลน์)
สะดวกในการสร้างโครงการนี้โดย Blybk
ขั้นตอนที่ 1: สร้างโครงการ Blynk
เพิ่มสองการควบคุม:
ค่าแสดง * 1
นาฬิกาเรียลไทม์ * 1
ชื่อของ Value Display ควรตั้งเป็นขั้นตอน แต่ไม่มีการตั้งค่าคุณสมบัติของนาฬิกาแบบเรียลไทม์ เลือก V1 เป็นพินอินพุตเพื่อปรับเลย์เอาต์ของตัวควบคุมดังที่แสดงด้านล่าง
ขั้นตอนที่ 2: ดาวน์โหลดโปรแกรมไปที่ FireBeetle Board-ESP32
คลิกที่นี่เพื่อดาวน์โหลดซอร์สโค้ดไปยัง esp32 ซอร์สโค้ดประกอบด้วยไฟล์ไลบรารีและไฟล์การพิมพ์ 3 มิติ คุณควรบันทึกไฟล์ไลบรารีลงใน lib ของ arduino และไฟล์ 3D สามารถพิมพ์เปลือกโลกได้โดยตรง
ด้านล่างเป็นโปรแกรมหลัก
#include #include // จำเป็นสำหรับ Arduino 1.6.5 และรุ่นก่อนหน้าเท่านั้น #include "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 การอัปโหลดบูลีน = false; จอแสดงผล SSD1306 (0x3c, 18, 0); OLEDDisplayUi ui (&แสดง); SimpleTimer จับเวลา; WidgetRTC rtc; หน้าจอ intW = 128; หน้าจอ intH = 64; int clockCenterX = หน้าจอW/2; int clockCenterY = ((หน้าจอH-16)/2)+16; // ส่วนสีเหลืองด้านบนคือความสูง 16 px int clockRadius = 23; #define DEVICE (0x53) //ที่อยู่อุปกรณ์ ADXL345 #define TO_READ (6) // จำนวนไบต์ที่เราจะอ่านในแต่ละครั้ง (สองไบต์สำหรับแต่ละแกน) ไบต์บัฟ[TO_READ]; //6 ไบต์บัฟเฟอร์สำหรับบันทึกข้อมูลที่อ่านจากอุปกรณ์ถ่าน str[100]; //สตริงบัฟเฟอร์เพื่อแปลงข้อมูลก่อนที่จะส่งไปยังพอร์ตอนุกรม int regAddress = 0x32; //การลงทะเบียนข้อมูลการเร่งความเร็วแกนแรกบน ADXL345 int xx, yy, zz; //ข้อมูลการเร่งความเร็วสามแกนคงที่ int currentValue = 0; stepSum แบบยาวที่ไม่ได้ลงนามแบบคงที่ = 0; char auth = "YourAuthToken"; // ข้อมูลรับรอง WiFi ของคุณ // ตั้งรหัสผ่านเป็น "" สำหรับเครือข่ายที่เปิดอยู่ char ssid = "ชื่อเครือข่ายของคุณ"; char pass = "รหัสผ่านของคุณ"; อักขระ const running_Logo_bits PROGMEM = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x03, 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, 0x07, 0x00, 0x00 0xF8, 0x17, 0x00, 0x00, 0xC0, 0xF8, 0x0F, 0x00, 0x00, 0xE0, 0xFB, 0x17, 0x00, 0x00, 0xC0, 0xFF, 0x13, 0x00, 0x00, 0x00, 0xFF, 0x0300, 0x00, 0x 0xFE, 0x03, 0x00, 0x00, 0x00, 0xF9, 0x03, 0x00, 0x00, 0x00, 0xFA, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00 0xF4, 0x07, 0x00, 0x00, 0x00, 0xF4, 0x0F, 0x00, 0x00, 0x00, 0xF9, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x80, 0xFE, 0x1F, 00x00, 0x00, 0x80, 0xFE, 0x1F, 00x00 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, 0x7C, 0x00, 0x00, 0xE0, 0x05, 0x05 0x00, 0xC0, 0x01, 0xF0, 0x03, 0x00, 0xC0, 0x03, 0xE8, 0x07, 0x00, 0xC0, 0x03, 0x88, 0x6F, 0x00, 0x80, 0x03, 0x40, 0x1FC, 0x00, 0xA0, 0x03, 0x0 0x00, 0x80, 0x03, 0x00, 0xF8, 0x01, 0x00, 0x07, 0x00, 0xF4, 0x00, 0x00, 0x07, 0x00, 0xE8, 0x00, 0x80, 0x0F, 0x00, 0xE8, 0x00, 0x00, 0x0, 0x0F 0x00, 0xE8, 0x0F, 0x00, 0xE8, 0x00, 0xF0, 0x09, 0x00, 0x60, 0x01, 0xF0, 0x04, 0x00, 0x00, 0x00, }; // ฟังก์ชั่นยูทิลิตี้สำหรับการแสดงนาฬิกาดิจิตอล: พิมพ์ 0 String twoDigits นำหน้า (int digits) { if (digits <10) { String i = '0'+String (digits); กลับฉัน; } อื่น ๆ { ส่งคืนสตริง (ตัวเลข); } } โมฆะ clockOverlay (OLEDDisplay *display, OLEDDisplayUiState* state) { if((hour()==0) && (minute()==0) && (second()==0)) stepsSum = 0; } โมฆะ 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); } // แสดงมุมลอยของมือสอง = วินาที () * 6; มุม = (มุม / 57.29577951); //แปลงองศาเป็นเรเดียน int x3 = (clockCenterX + (sin(angle) * (clockRadius - (clockRadius / 5)))); int y3 = (clockCenterY - (cos(angle) * (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(angle) * (clockRadius - (clockRadius / 4)))); display->drawLine(clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // display hour hand angle = hour() * 30 + int((minute() / 12) * 6); angle = (angle / 57.29577951); //แปลงองศาเป็นเรเดียน x3 = (clockCenterX + (sin(angle) * (clockRadius - (clockRadius / 2)))); y3 = (clockCenterY - (cos(angle) * (clockRadius - (นาฬิกาRa dius / 2)))); display->drawLine(clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); } ถือเป็นโมฆะ digitalClockFrame (OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { วันที่สตริง = String (ปี ())+"/"+twoDigits (เดือน ())+"/"+twoDigits (วัน ()); สตริง timenow = String(hour())+":"+twoDigits(minute())+":"+twoDigits(second()); display->setTextAlignment(TEXT_ALIGN_CENTER); จอแสดงผล -> setFont (ArialMT_Plain_24); display->drawString(clockCenterX + x, 20, timenow); จอแสดงผล -> setFont (ArialMT_Plain_16); display->drawString(60, 45, วันที่); } เป็นโมฆะ writeTo (อุปกรณ์ int, ที่อยู่ไบต์, ไบต์ val) { Wire.beginTransmission (อุปกรณ์); // เริ่มส่งไปยังอุปกรณ์ Wire.write (ที่อยู่); // ส่งที่อยู่ลงทะเบียน Wire.write(val); // ส่งค่าเพื่อเขียน Wire.endTransmission(); // สิ้นสุดการส่ง } // อ่านจำนวนไบต์เริ่มต้นจากการลงทะเบียนที่อยู่บนอุปกรณ์ในอาร์เรย์ buff เป็นโมฆะ readFrom (อุปกรณ์ int, ที่อยู่ไบต์, จำนวน int, ไบต์ buff ) { Wire.beginTransmission (อุปกรณ์); //เริ่มส่งไปยังอุปกรณ์ Wire.write (ที่อยู่); //ส่งที่อยู่เพื่ออ่านจาก Wire.endTransmission(); //สิ้นสุดการส่ง Wire.beginTransmission(อุปกรณ์); //เริ่มส่งไปยังอุปกรณ์ Wire.requestFrom(device, num); // ขอ 6 ไบต์จากอุปกรณ์ int i = 0; while(Wire.available()) // อุปกรณ์อาจส่งน้อยกว่าที่ร้องขอ (ผิดปกติ) { buff= Wire.read(); // รับไบต์ i++; } Wire.endTransmission(); // สิ้นสุดการส่ง } เป็นโมฆะ runningFrame (OLEDDisplay * display, OLEDDisplayUiState * state, int16_t x, int16_t y) { float calValue = stepsSum * 0.4487; display->setTextAlignment(TEXT_ALIGN_CENTER); จอแสดงผล -> setFont (ArialMT_Plain_24); display->drawString(clockCenterX, clockCenterY, str); sprintf(str, "%.2fcal", calValue); display->setTextAlignment(TEXT_ALIGN_CENTER); จอแสดงผล -> setFont (ArialMT_Plain_10); display->drawString(100, 20, str); display->drawXbm(10, 14, 34, 50, running_Logo_bits); } เป็นโมฆะ uploadFrame (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 overlays = { clockOverlay }; int overlaysCount = 1; เป็นโมฆะ uploadToBlynk (เป็นโมฆะ) { ถ้า (อัปโหลด == จริง) { Blynk.virtualWrite (V0, จำนวนขั้นตอน); Blynk.virtualWrite (V1, จำนวนก้าว); } } โมฆะ uiInit(โมฆะ){ ui.setTargetFPS(30); //ui.setActiveSymbol (สัญลักษณ์ที่ใช้งาน); //ui.setInactiveSymbol (สัญลักษณ์ที่ไม่ใช้งาน); ui.setIndicatorPosition(TOP); ui.setIndicatorDirection(LEFT_RIGHT); ui.setFrameAnimation(SLIDE_LEFT); ui.setFrames (เฟรม, จำนวนเฟรม); ui.setOverlays (โอเวอร์เลย์, โอเวอร์เลย์นับ); ui.disableAutoTransition(); ui.switchToFrame(2); ui.init(); display.flipScreenVertically(); } เป็นโมฆะ adxl345Init (เป็นโมฆะ) { writeTo (DEVICE, 0x2D, 0); เขียนถึง (DEVICE, 0x2D, 16); เขียนถึง (DEVICE, 0x2D, 8); } เป็นโมฆะ updateAdxl345(เป็นโมฆะ){ 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){stepSum++; } มูลค่าปัจจุบัน = xx; } sprintf(str, "%d", จำนวนก้าว); } int getKeys(เป็นโมฆะ){ if(digitalRead(D2) == LOW){ ล่าช้า(5); if(digitalRead(D2) == ต่ำ){ ในขณะที่(digitalRead(D2) == ต่ำ); ส่งคืน POWER_KEY; } } if(digitalRead(D3) == LOW){ ล่าช้า(5); if(digitalRead(D3) == ต่ำ){ ในขณะที่(digitalRead(D3) == ต่ำ); กลับ MENU_KEY; } } if(digitalRead(D4) == ต่ำ){ ล่าช้า(5); if(digitalRead(D4) == ต่ำ){ ในขณะที่(digitalRead(D4) == ต่ำ); ส่งคืน UPLOAD_KEY; } } คืนค่า 0; } โมฆะ doKeysFunction (เป็นโมฆะ) { คงที่ int uiFrameIndex = 2; คีย์ int = getKeys(); ถ้า (คีย์ == POWER_KEY) { ถ่านคงที่ i = 0; ถ้า(i){ ui.init(); display.flipScreenVertically(); display.displayOn(); }อื่น{ display.displayOff(); } ผม = ~ผม; } if(คีย์ == 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); }อื่น{ อัพโหลด = จริง; ui.switchToFrame(3); } } } การตั้งค่าเป็นโมฆะ () { pinMode (D2, INPUT); โหมดพิน (D3, อินพุต); โหมดพิน (D4, อินพุต); Blynk.begin(รับรองความถูกต้อง, ssid, ผ่าน); rtc.begin(); uiInit(); adxl345Init(); timer.setInterval (30, updateAdxl345); timer.setInterval (100, uploadToBlynk); } วงเป็นโมฆะ () { int ที่เหลือTimeBudget = ui.update(); คงที่ int testSum = 0; if ((testSum 0) { ล่าช้า (remainingTimeBudget); } doKeysFunction (); timer.run (); }
ข้อควรระวัง: คุณควรแก้ไขการตั้งค่า Wi-Fi, หนังสือเดินทาง และ AUTHTOKENS เป็นตัวคุณเอง
char auth = "YourAuthToken"; // ข้อมูลรับรอง WiFi ของคุณ // ตั้งรหัสผ่านเป็น "" สำหรับเครือข่ายที่เปิดอยู่ char ssid = "ชื่อเครือข่ายของคุณ"; char pass = "รหัสผ่านของคุณ";
ขั้นตอนที่ 3: การเชื่อมต่อฮาร์ดแวร์
เชื่อมต่อ OLED12864 และโมดูลการเร่งความเร็วกับ I2C ด้านล่างเป็น D2, D3, D4 ยิ่งไปกว่านั้น เพิ่มตัวต้านทานแบบดึงขึ้น 51k ที่พื้นเพื่อให้ได้ 3.3V ดังที่แสดงด้านล่าง
ข้อควรระวัง: การเชื่อมต่อตัวต้านทานแบบดึงขึ้นกับ AREF ไม่ถูกต้อง ตัวต้านทานที่ถูกต้องคือ 3.3V
ภาพการบัดกรีฮาร์ดแวร์ที่แสดงด้านล่าง:
หลังจากการประสาน การประกอบโมดูลฮาร์ดแวร์เข้ากับเปลือกโลก ดังแสดงด้านล่าง:
ภาพผลที่ครอบคลุม~
แนะนำ:
DIY 37 Leds เกมรูเล็ต Arduino: 3 ขั้นตอน (พร้อมรูปภาพ)
DIY 37 Leds เกมรูเล็ต Arduino: รูเล็ตเป็นเกมคาสิโนที่ตั้งชื่อตามคำภาษาฝรั่งเศสหมายถึงวงล้อเล็ก
หมวกนิรภัย Covid ส่วนที่ 1: บทนำสู่ Tinkercad Circuits!: 20 ขั้นตอน (พร้อมรูปภาพ)
Covid Safety Helmet ตอนที่ 1: บทนำสู่ Tinkercad Circuits!: สวัสดีเพื่อน ๆ ในชุดสองตอนนี้ เราจะเรียนรู้วิธีใช้วงจรของ Tinkercad - เครื่องมือที่สนุก ทรงพลัง และให้ความรู้สำหรับการเรียนรู้เกี่ยวกับวิธีการทำงานของวงจร! หนึ่งในวิธีที่ดีที่สุดในการเรียนรู้คือการทำ ดังนั้น อันดับแรก เราจะออกแบบโครงการของเราเอง: th
Bolt - DIY Wireless Charging Night Clock (6 ขั้นตอน): 6 ขั้นตอน (พร้อมรูปภาพ)
Bolt - DIY Wireless Charging Night Clock (6 ขั้นตอน): การชาร์จแบบเหนี่ยวนำ (เรียกอีกอย่างว่าการชาร์จแบบไร้สายหรือการชาร์จแบบไร้สาย) เป็นการถ่ายโอนพลังงานแบบไร้สาย ใช้การเหนี่ยวนำแม่เหล็กไฟฟ้าเพื่อจ่ายกระแสไฟฟ้าให้กับอุปกรณ์พกพา แอปพลิเคชั่นที่พบบ่อยที่สุดคือ Qi Wireless Charging st
4 ขั้นตอน Digital Sequencer: 19 ขั้นตอน (พร้อมรูปภาพ)
4 ขั้นตอน Digital Sequencer: CPE 133, Cal Poly San Luis Obispo ผู้สร้างโปรเจ็กต์: Jayson Johnston และ Bjorn Nelson ในอุตสาหกรรมเพลงในปัจจุบัน ซึ่งเป็นหนึ่งใน “instruments” เป็นเครื่องสังเคราะห์เสียงดิจิตอล ดนตรีทุกประเภท ตั้งแต่ฮิปฮอป ป๊อป และอีฟ
ป้ายโฆษณาแบบพกพาราคาถูกเพียง 10 ขั้นตอน!!: 13 ขั้นตอน (พร้อมรูปภาพ)
ป้ายโฆษณาแบบพกพาราคาถูกเพียง 10 ขั้นตอน!!: ทำป้ายโฆษณาแบบพกพาราคาถูกด้วยตัวเอง ด้วยป้ายนี้ คุณสามารถแสดงข้อความหรือโลโก้ของคุณได้ทุกที่ทั่วทั้งเมือง คำแนะนำนี้เป็นการตอบสนองต่อ/ปรับปรุง/เปลี่ยนแปลงของ: https://www.instructables.com/id/Low-Cost-Illuminated-