สารบัญ:

วิธีทำตัวนับขั้นตอน: 3 ขั้นตอน (พร้อมรูปภาพ)
วิธีทำตัวนับขั้นตอน: 3 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: วิธีทำตัวนับขั้นตอน: 3 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: วิธีทำตัวนับขั้นตอน: 3 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: 3 ขั้นตอนง่ายๆ ในการช่วยจับตาการนับคะแนน 2024, มิถุนายน
Anonim
Image
Image
สร้างโครงการ Blynk
สร้างโครงการ Blynk

ฉันเคยเล่นกีฬาหลายประเภทได้ดี เช่น เดิน วิ่ง ขี่จักรยาน เล่นแบตมินตัน เป็นต้น

ฉันชอบขี่ไปเที่ยวรอบ ๆ มาก่อน ดูหน้าท้องฉันสิ……

อย่างไรก็ตาม ฉันตัดสินใจเริ่มออกกำลังกายใหม่ ต้องเตรียมอุปกรณ์อะไรบ้าง? นอกจากศูนย์กีฬาแล้ว เย้! ฉันต้องการเครื่องมือ! ฉันเชื่อว่าฉันสามารถออกกำลังกายได้ในปริมาณที่เหมาะสม เครื่องดนตรีมาถึงแล้ว มาเริ่มกันที่วิดีโอกันเลย~

เครื่องมือนี้ไม่เพียงแต่สามารถบันทึกขั้นตอน (และแคลอรี่) ได้แบบเรียลไทม์ แต่ยังแสดงเวลาอีกด้วย ที่พิเศษคือรูปแบบการแสดงเป็นแบบพอยน์เตอร์~ เท่มาก! ฉันชอบมันมากจริงๆ!

คุณสามารถอัปโหลดบันทึกของคุณไปยังอินเทอร์เน็ต

เพียงคลิกเดียว บันทึกทั้งหมดสามารถแสดงได้โดย 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

ภาพการบัดกรีฮาร์ดแวร์ที่แสดงด้านล่าง:

หลังจากการประสาน การประกอบโมดูลฮาร์ดแวร์เข้ากับเปลือกโลก ดังแสดงด้านล่าง:

ภาพผลที่ครอบคลุม~

แนะนำ: