Mục lục:

Làm thế nào để tạo bộ đếm bước?: 3 bước (có hình ảnh)
Làm thế nào để tạo bộ đếm bước?: 3 bước (có hình ảnh)

Video: Làm thế nào để tạo bộ đếm bước?: 3 bước (có hình ảnh)

Video: Làm thế nào để tạo bộ đếm bước?: 3 bước (có hình ảnh)
Video: ✅ Cách bật chức năng đếm bước theo dõi sức khỏe sẵn có của iPhone 2024, Tháng mười hai
Anonim
Image
Image
Tạo một dự án Blynk
Tạo một dự án Blynk

Tôi đã từng chơi tốt nhiều môn thể thao: đi bộ, chạy, đạp xe, chơi cầu lông, v.v.

Tôi thích cưỡi ngựa để đi du lịch khắp nơi trước đó. Chà, hãy nhìn cái bụng đẫy đà của tôi ……

Dù sao thì, tôi quyết định khởi động lại để tập thể dục. Tôi cần chuẩn bị những thiết bị gì? Bên cạnh cơ sở thể thao, có! Tôi cần một nhạc cụ! Tôi tin rằng với nó, tôi có thể duy trì lượng tập thể dục phù hợp. Đây là nhạc cụ ra đời. Hãy bắt đầu với một video ~

Công cụ này không chỉ có thể ghi lại các bước (và lượng calo) theo thời gian thực mà còn hiển thị thời gian. Điều đặc biệt là định dạng hiển thị là con trỏ ~ quá tuyệt! Tôi thực sự, thực sự thích nó!

Bạn có thể tải hồ sơ của mình lên Internet

chỉ bằng một cú nhấp chuột. Tất cả các bản ghi có thể được hiển thị bằng Blynk (một phần mềm điện thoại thông minh đã được giới thiệu trước đây). Giống như đồng hồ thông minh có thể đeo được, công cụ này có thời gian phù hợp (Vì vậy, bạn không cần phải lo lắng về nguồn điện và thời gian cập nhật).

Phần cứng trong meed:

Bảng FireBeetle-ESP32

Bảng che phủ FireBeetle-Proto

Màn hình hiển thị OLED12864

Mô-đun tăng tốc

Pin 3.7V (mua trực tuyến, âm lượng khoảng 600mAH)

3 đáy (mua trực tuyến)

Rất thuận tiện để xây dựng dự án này bởi Blybk.

Bước 1: Tạo một dự án Blynk

Thêm hai điều khiển:

Hiển thị giá trị * 1

Đồng hồ thời gian thực * 1

Tên của Hiển thị giá trị phải được đặt thành các bước, nhưng không có cài đặt nào cho các thuộc tính của Đồng hồ thời gian thực. Chọn V1 làm chân đầu vào để điều chỉnh bố cục của các điều khiển, được hiển thị như bên dưới.

Bước 2: Tải chương trình xuống FireBeetle Board-ESP32

Bấm vào đây để tải mã nguồn về esp32. Mã nguồn bao gồm các tệp thư viện và tệp in 3D. Bạn nên lưu tệp thư viện vào lib của arduino. Và các tệp 3D có thể in trực tiếp lớp vỏ.

Dưới đây là chương trình chính

#include #include // Chỉ cần thiết cho Arduino 1.6.5 trở về trước #include "SSD1306.h" // bí danh cho `#include" SSD1306Wire.h "` #include "OLEDDisplayUi.h" #include "images.h" # bao gồm #include #include #include #include #define POWER_KEY 1 #define MENU_KEY 2 #define UPLOAD_KEY 3 boolean upload = false; Màn hình SSD1306 (0x3c, 18, 0); OLEDDisplayUi ui (& display); Bộ đếm thời gian SimpleTimer; WidgetRTC rtc; int screenW = 128; int screenH = 64; int clockCenterX = screenW / 2; int clockCenterY = ((screenH-16) / 2) +16; // phần trên cùng màu vàng có chiều cao 16 px int clockRadius = 23; #define DEVICE (0x53) // địa chỉ thiết bị ADXL345 #define TO_READ (6) // số byte chúng ta sẽ đọc mỗi lần (hai byte cho mỗi trục) byte buff [TO_READ]; // Bộ đệm 6 byte để lưu dữ liệu đọc từ thiết bị char str [100]; // bộ đệm chuỗi để biến đổi dữ liệu trước khi gửi đến cổng nối tiếp int regAddress = 0x32; // thanh ghi dữ liệu trục-gia tốc-đầu tiên trên ADXL345 int xx, yy, zz; // dữ liệu gia tốc ba trục static int currentValue = 0; static unsigned long stepSum = 0; char auth = "YourAuthToken"; // Thông tin đăng nhập WiFi của bạn. // Đặt mật khẩu thành "" cho các mạng mở. char ssid = "YourNetworkName"; char pass = "YourPassword"; const char running_Logo_bits PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x03, 0x00, 0, 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, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 0xF8, 0x17, 0x00, 0x00, 0xC0, 0xF8, 0x0F, 0x00, 0x00, 0xE0, 0xFB, 0x17, 0x00, 0x00, 0xC0, 0xFF, 0x13, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x00, 0xFF, 0x03, 0x00, 0xFF, 0x03, 0x00 0xFE, 0x03, 0x00, 0x00, 0x00, 0xF9, 0x03, 0x00, 0x00, 0x00, 0xFA, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 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, 0x00 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, 005xE0 0x00, 0xC0, 0x01, 0xF0, 0x03, 0x00, 0xC0, 0x03, 0xE8, 0x07, 0x00, 0xC0, 0x03, 0x88, 0x6F, 0x00, 0x80, 0x03, 0xC0, 0x03, 0xE8, 0x07, 0x00, 0xC0, 0x03, 0x88, 0x6F, 0x00, 0x80, 0x03, 0x40, 0x1E, 0x00, 0xA0 0x00, 0x80, 0x03, 0x00, 0xF8, 0x01, 0x00, 0x07, 0x00, 0xF4, 0x00, 0x00, 0x07, 0x00, 0xE8, 0x00, 0x80, 0x0F, 0x00, 0xE8, 0x00, 0x90, 0x00, 0x90, 0x00, 0x90, 0x00 0x00, 0xE8, 0x0F, 0x00, 0xE8, 0x00, 0xF0, 0x09, 0x00, 0x60, 0x01, 0xF0, 0x04, 0x00, 0x00, 0x00,}; // chức năng tiện ích cho hiển thị đồng hồ kỹ thuật số: in ra hàng đầu 0 String twoDigits (intumbers) {if (architects <10) {String i = '0' + String (chữ số); trả lại tôi; } else {return String (các chữ số); }} void clockOverlay (OLEDDisplay * display, OLEDDisplayUiState * state) {if ((giờ () == 0) && (phút () == 0) && (giây () == 0)) bướcSum = 0; } void analogClockFrame (OLEDDisplay * state, OLEDDisplayUiState * state, int16_t x, int16_t y) {display-> drawCircle (clockCenterX + x, clockCenterY + y, 2); // tích tắc giờ cho (int z = 0; z drawLine (x2 + x, y2 + y, x3 + x, y3 + y);} // hiển thị kim giây float angle = second () * 6; angle = (angle / 57.29577951); // Chuyển đổi độ sang radian 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); // hiển thị góc kim phút = phút () * 6; angle = (angle / 57.29577951); // Chuyển đổi độ sang radian x3 = (clockCenterX + (sin (angle) * (clockRadius - (clockRadius / 4)))); y3 = (clockCenterY - (cos (angle) * (clockRadius - (clockRadius / 4)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // hiển thị góc kim giờ = giờ () * 30 + int ((phút () / 12) * 6); angle = (angle / 57.29577951); // Chuyển đổi độ sang radian x3 = (clockCenterX + (sin (angle) * (clockRadius - (clockRadius / 2)))); y3 = (clockCenterY - (cos (angle) * (clockRadius - (clockRa dius / 2)))); display-> 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 (giờ ()) + ":" + twoDigits (phút ()) + ":" + twoDigits (giây ()); 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, ngày tháng); } void writeTo (int device, byte address, byte val) {Wire.beginTransmission (device); // bắt đầu truyền tới thiết bị Wire.write (address); // gửi địa chỉ thanh ghi Wire.write (val); // gửi giá trị để ghi Wire.endTransmission (); // kết thúc truyền} // đọc num byte bắt đầu từ thanh ghi địa chỉ trên thiết bị vào mảng buff void readFrom (int device, byte address, int num, byte buff ) {Wire.beginTransmission (device); // bắt đầu truyền tới thiết bị Wire.write (address); // gửi địa chỉ để đọc từ Wire.endTransmission (); // kết thúc truyền dẫn Wire.beginTransmission (thiết bị); // bắt đầu truyền tới thiết bị Wire.requestFrom (device, num); // yêu cầu 6 byte từ thiết bị int i = 0; while (Wire.available ()) // thiết bị có thể gửi ít hơn yêu cầu (bất thường) {buff = Wire.read (); // nhận một byte i ++; } Wire.endTransmission (); // kết thúc truyền dẫn} void runningFrame (OLEDDisplay * display, OLEDDisplayUiState * state, 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 * display, OLEDDisplayUiState * state, int16_t x, int16_t y) {display-> setFont (ArialMT_Plain_16); display-> drawString (60, 45, "tải lên dữ liệu…"); } // Mảng này giữ con trỏ hàm đến tất cả các khung // các khung là các khung nhìn đơn trượt trong các khung FrameCallback = {analogClockFrame, digitalClockFrame, runningFrame, uploadFrame}; // có bao nhiêu khung hình? int frameCount = 4; // Các lớp phủ được vẽ tĩnh trên đầu khung, ví dụ. một lớp phủ đồng hồ OverlayCallback = {clockOverlay}; int overlaysCount = 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 (frame, frameCount); ui.setOverlays (lớp phủ, lớp phủCount); ui.disableAutoTransition (); ui.switchToFrame (2); ui.init (); display.flipScreenVerently (); } void adxl345Init (void) {writeTo (DEVICE, 0x2D, 0); writeTo (THIẾT BỊ, 0x2D, 16); writeTo (DEVICE, 0x2D, 8); } void updateAdxl345 (void) {readFrom (DEVICE, regAddress, TO_READ, buff); // đọc dữ liệu tăng tốc từ 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) {delay (5); if (digitalRead (D2) == LOW) {while (digitalRead (D2) == LOW); trả lại POWER_KEY; }} if (digitalRead (D3) == LOW) {delay (5); if (digitalRead (D3) == LOW) {while (digitalRead (D3) == LOW); trả về MENU_KEY; }} if (digitalRead (D4) == LOW) {delay (5); if (digitalRead (D4) == LOW) {while (digitalRead (D4) == LOW); trả về UPLOAD_KEY; }} trả về 0; } void doKeysFunction (void) {static int uiFrameIndex = 2; int các khóa = getKeys (); if (các phím == POWER_KEY) {static char i = 0; if (i) {ui.init (); display.flipScreenVerently (); display.displayOn (); } else {display.displayOff (); } i = ~ i; } if (các khóa == MENU_KEY) {if (tải lên == false) {uiFrameIndex ++; if (uiFrameIndex == 3) uiFrameIndex = 0; ui.switchToFrame (uiFrameIndex); } else {ui.switchToFrame (3); }} if (key == 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 (auth, ssid, pass); rtc.begin (); uiInit (); adxl345Init (); timer.setInterval (30, updateAdxl345); timer.setInterval (100, uploadToBlynk); } void loop () {int còn lạiTimeBudget = ui.update (); static int testSum = 0; if ((testSum 0) {delay (còn lạiTimeBudget);} doKeysFunction (); timer.run ();}

Thận trọng: Bạn nên sửa đổi cài đặt Wi-Fi, hộ chiếu và AUTHTOKENS cho chính mình.

char auth = "YourAuthToken"; // Thông tin đăng nhập WiFi của bạn. // Đặt mật khẩu thành "" cho các mạng mở. char ssid = "YourNetworkName"; char pass = "YourPassword";

Bước 3: Kết nối phần cứng

Kết nối phần cứng
Kết nối phần cứng
Kết nối phần cứng
Kết nối phần cứng
Kết nối phần cứng
Kết nối phần cứng

Kết nối OLED12864 và mô-đun tăng tốc với I2C, đáy với D2, D3, D4. Hơn nữa, thêm điện trở kéo lên 51k vào đáy để đạt 3,3V, được hiển thị như bên dưới.

Thận trọng: Sai khi kết nối điện trở kéo lên với AREF, điện trở đúng là 3,3V

Hình ảnh hàn phần cứng, được hiển thị như dưới đây:

Sau khi hàn, lắp ráp mô-đun phần cứng vào lớp vỏ, được hiển thị như dưới đây:

Hình ảnh hiệu ứng toàn diện ~

Đề xuất: