Isi kandungan:

Bagaimana Membuat Pembilang Langkah? 3 Langkah (dengan Gambar)
Bagaimana Membuat Pembilang Langkah? 3 Langkah (dengan Gambar)

Video: Bagaimana Membuat Pembilang Langkah? 3 Langkah (dengan Gambar)

Video: Bagaimana Membuat Pembilang Langkah? 3 Langkah (dengan Gambar)
Video: Mengenal Bilangan Pecahan | Gambar 2024, November
Anonim
Image
Image
Buat Projek Blynk
Buat Projek Blynk

Saya pernah menunjukkan prestasi yang baik di banyak sukan: berjalan, berlari, menunggang basikal, bermain badminton dll.

Saya gemar menunggang perjalanan jauh-jauh. Baiklah, lihatlah perut saya yang pucat ……

Bagaimanapun, saya memutuskan untuk memulakan semula untuk bersenam. Peralatan apa yang harus saya sediakan? Selain kemudahan sukan, ya! Saya memerlukan instrumen! Saya percaya dengan itu, saya dapat melakukan senaman yang sesuai. Di sinilah instrumen itu wujud. Mari mulakan dengan video ~

Instrumen ini bukan sahaja dapat merakam langkah (dan kalori) pada waktu nyata, tetapi menunjukkan waktu. Yang istimewa ialah format penunjuk adalah penunjuk ~ sangat keren! Saya sangat suka!

Anda boleh memuat naik rekod anda ke Internet

hanya dengan satu klik. Semua rekod boleh dipaparkan oleh Blynk (perisian telefon pintar yang diperkenalkan sebelumnya). Sama seperti jam tangan pintar yang boleh dipakai, alat ini mendapat masa dalam talian (Oleh itu, anda tidak perlu takut dengan kekuatan dan masa mengemas kini).

Perkakasan dalam meed:

Papan FireBeetle-ESP32

FireBeetle Covers-Proto Board

Skrin pelupusan OLED12864

Modul pecutan

Bateri 3.7V (dibeli dalam talian, jumlahnya sekitar 600mAH)

3 botol (dibeli dalam talian)

Sangat senang untuk membina projek ini oleh Blybk.

Langkah 1: Buat Projek Blynk

Tambahkan dua kawalan:

Paparan Nilai * 1

Jam masa nyata * 1

Nama Paparan Nilai harus diatur ke beberapa langkah, tetapi tidak ada pengaturan untuk sifat jam Waktu Nyata. Pilih V1 sebagai pin input untuk mengatur susun atur kawalan, seperti di bawah.

Langkah 2: Muat turun Program ke FireBeetle Board-ESP32

Klik di sini untuk memuat turun kod sumber ke esp32. Kod sumber terdiri daripada fail perpustakaan dan fail percetakan 3D. Anda harus menyimpan fail perpustakaan ke lib of arduino. Dan fail 3D boleh mencetak kerak secara langsung.

Berikut adalah program utama

#include #include // Hanya diperlukan untuk Arduino 1.6.5 dan lebih awal #include "SSD1306.h" // alias untuk `#include" SSD1306Wire.h "" #include "OLEDDisplayUi.h" #include "images.h" # sertakan #include #include #include #include #define POWER_KEY 1 #define MENU_KEY 2 # tentukan UPLOAD_KEY 3 boolean upload = false; Paparan SSD1306 (0x3c, 18, 0); OLEDDisplayUi ui (& display); Pemasa SimpleTimer; WidgetRTC rtc; int skrinW = 128; int skrinH = 64; int clockCenterX = skrinW / 2; int clockCenterY = ((skrinH-16) / 2) +16; // bahagian kuning atas ialah 16 px tinggi int clockRadius = 23; #define DEVICE (0x53) // alamat peranti ADXL345 #define TO_READ (6) // jumlah bait yang akan kita baca setiap kali (dua bait untuk setiap paksi) buff byte [TO_READ]; // 6 bait penyangga untuk menyimpan data yang dibaca dari peranti peranti [100]; // string buffer untuk mengubah data sebelum menghantarnya ke port serial int regAddress = 0x32; // daftar paksi-pecutan pertama-data pada ADXL345 int xx, yy, zz; // data pecutan tiga paksi statik int currentValue = 0; langkah panjang yang tidak ditandatangani statikSum = 0; char auth = "YourAuthToken"; // Kelayakan WiFi anda. // Tetapkan kata laluan ke "" untuk rangkaian terbuka. char ssid = "YourNetworkName"; char pass = "Kata Laluan Anda"; 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 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, 0x 0xF8, 0x17, 0x00, 0x00, 0xC0, 0xF8, 0x0F, 0x00, 0x00, 0xE0, 0xFB, 0x17, 0x00, 0x00, 0xC0, 0xFF, 0x13, 0x00, 0x00, 0x00, 0xFF, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 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 0xF4, 0x07, 0x00, 0x00, 0x00, 0xF4, 0x0F, 0x00, 0x00, 0x00, 0xF9, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x80, 0xFE, 0x1F, 0x1F, 0x1F 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, 0x0, 0x00, 0x0, 0x00, 0x00, 0x00, 0x00, 0x 0x00, 0xC0, 0x01, 0xF0, 0x03, 0x00, 0xC0, 0x03, 0xE8, 0x07, 0x00, 0xC0, 0x03, 0x88, 0x6F, 0x00, 0x80, 0x03, 0x40, 0x1E, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x00, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x 0x00, 0x80, 0x03, 0x00, 0xF8, 0x01, 0x00, 0x07, 0x00, 0xF4, 0x00, 0x00, 0x07, 0x00, 0xE8, 0x00, 0x80, 0x0F, 0x00, 0xE8, 0x00, 0x0, 0x0, 0x0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0 0x00, 0xE8, 0x0F, 0x00, 0xE8, 0x00, 0xF0, 0x09, 0x00, 0x60, 0x01, 0xF0, 0x04, 0x00, 0x00, 0x00,}; // fungsi utiliti untuk paparan jam digital: cetakan yang memimpin 0 String twoDigits (int digit) {if (digit <10) {String i = '0' + String (digit); pulangan i; } lain {String kembali (digit); }} kekosongan jam Overlay (paparan OLEDDisplay *, keadaan OLEDDisplayUiState *) {if ((jam () == 0) && (minit () == 0) && (kedua () == 0)) langkahSum = 0; } void analogClockFrame (paparan OLEDDisplay *, keadaan OLEDDisplayUiState *, int16_t x, int16_t y) {display-> drawCircle (clockCenterX + x, clockCenterY + y, 2); // kutu jam untuk (int z = 0; z drawLine (x2 + x, y2 + y, x3 + x, y3 + y);} // paparkan sudut apungan terpakai = kedua () * 6; sudut = (sudut / 57.29577951); // Tukar darjah ke 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); // paparan sudut tangan minit = minit () * 6; sudut = (sudut / 57.29577951); // Tukar darjah ke radian x3 = (clockCenterX + (sin (sudut) * (clockRadius - (clockRadius / 4)))); y3 = (clockCenterY - (cos (angle) * (clockRadius - (clockRadius / 4)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // sudut paparan jam tangan = jam () * 30 + int ((minit () / 12) * 6); angle = (angle / 57.29577951); // Tukar darjah ke 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 (tahun ()) + "/" + twoDigits (bulan ()) + "/" + duaDigits (hari ()); String timenow = Rentetan (jam ()) + ":" + twoDigits (minit ()) + ":" + twoDigits (kedua ()); paparan-> setTextAlignment (TEXT_ALIGN_CENTER); display-> setFont (ArialMT_Plain_24); paparan-> drawString (clockCenterX + x, 20, timenow); display-> setFont (ArialMT_Plain_16); display-> drawString (60, 45, tarikh); } batal writeTo (int device, byte address, byte val) {Wire.beginTransmission (peranti); // mulakan penghantaran ke peranti Wire.write (alamat); // hantar alamat daftar Wire.write (val); // hantar nilai untuk menulis Wire.endTransmission (); // transmisi akhir} // membaca bilangan bait bermula dari daftar alamat pada peranti ke array buff void readFrom (int device, alamat byte, int num, byte buff ) {Wire.beginTransmission (device); // mulakan penghantaran ke peranti Wire.write (alamat); // menghantar alamat untuk dibaca dari Wire.endTransmission (); // akhir penghantaran Wire.beginTransmission (peranti); // mulakan penghantaran ke peranti Wire.requestFrom (peranti, nombor); // minta 6 bait dari peranti int i = 0; sementara (Wire.available ()) // peranti boleh menghantar kurang daripada yang diminta (tidak normal) {buff = Wire.read (); // terima byte i ++; } Wire.endTransmission (); // end transmission} void runningFrame (OLEDDisplay * display, OLEDDisplayUiState * state, int16_t x, int16_t y) {float calValue = stepSum * 0.4487; paparan-> setTextAlignment (TEXT_ALIGN_CENTER); display-> setFont (ArialMT_Plain_24); paparan-> drawString (clockCenterX, clockCenterY, str); sprintf (str, "%.2fcal", calValue); paparan-> setTextAlignment (TEXT_ALIGN_CENTER); display-> setFont (ArialMT_Plain_10); display-> drawString (100, 20, str); display-> drawXbm (10, 14, 34, 50, running_Logo_bits); } batal uploadFrame (paparan OLEDDisplay *, keadaan OLEDDisplayUiState *, int16_t x, int16_t y) {display-> setFont (ArialMT_Plain_16); display-> drawString (60, 45, "muat naik data …"); } // Array ini menyimpan penunjuk fungsi ke semua bingkai // bingkai adalah pandangan tunggal yang meluncur dalam bingkai FrameCallback = {analogClockFrame, digitalClockFrame, runningFrame, uploadFrame}; // berapakah bilangan bingkai yang ada? int frameCount = 4; // Lapisan dilukis secara statik di atas bingkai misalnya. jam OverlayCallback overlay = {clockOverlay}; int overlaysCount = 1; void uploadToBlynk (void) {if (upload == true) {Blynk.virtualWrite (V0, stepSum); Blynk.virtualWrite (V1, StepSum); }} 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 (bingkai, frameCount); ui.setOverlays (overlay, overlaysCount); ui.disableAutoTransition (); ui.switchToFrame (2); ui.init (); display.flipScreenVertically (); } batal adxl345Init (tidak sah) {writeTo (PERANTI, 0x2D, 0); writeTo (PERANTI, 0x2D, 16); writeTo (PERANTI, 0x2D, 8); } kemas kini batalAdxl345 (tidak sah) {readFrom (PERANTI, regAddress, TO_READ, buff); // baca data pecutan dari 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) {langkahSum ++; } currentValue = xx; } sprintf (str, "% d", langkahSum); } int getKeys (batal) {if (digitalRead (D2) == RENDAH) {kelewatan (5); jika (digitalRead (D2) == RENDAH) {manakala (digitalRead (D2) == RENDAH); pulangkan POWER_KEY; }} jika (digitalRead (D3) == RENDAH) {kelewatan (5); jika (digitalRead (D3) == RENDAH) {manakala (digitalRead (D3) == RENDAH); pulangkan MENU_KEY; }} jika (digitalRead (D4) == RENDAH) {kelewatan (5); jika (digitalRead (D4) == RENDAH) {manakala (digitalRead (D4) == RENDAH); pulangkan UPLOAD_KEY; }} pulangkan 0; } void doKeysFunction (void) {stat ui int uiFrameIndex = 2; kunci int = getKeys (); jika (kunci == POWER_KEY) {char static = =; jika (i) {ui.init (); display.flipScreenVertically (); display.displayOn (); } lain {display.displayOff (); } i = ~ i; } if (kunci == MENU_KEY) {if (muat naik == palsu) {uiFrameIndex ++; jika (uiFrameIndex == 3) uiFrameIndex = 0; ui.switchToFrame (uiFrameIndex); } lain {ui.switchToFrame (3); }} if (kunci == UPLOAD_KEY) {if (muat naik == benar) {muat = salah; ui.switchToFrame (uiFrameIndex); } lain {muat naik = benar; ui.switchToFrame (3); }}} persediaan tidak sah () {pinMode (D2, INPUT); pinMode (D3, INPUT); pinMode (D4, INPUT); Blynk.begin (auth, ssid, pass); rtc.begin (); uiInit (); adxl345Init (); timer.setInterval (30, kemas kiniAdxl345); timer.setInterval (100, uploadToBlynk); } gelung void () {int tersisaTimeBudget = ui.update (); ujian int statikSum = 0; if ((testSum 0) {delay (sisaTimeBudget);} doKeysFunction (); timer.run ();}

Awas: Anda harus mengubah sendiri tetapan Wi-Fi, pasport dan AUTHTOKENS.

char auth = "YourAuthToken"; // Kelayakan WiFi anda. // Tetapkan kata laluan ke "" untuk rangkaian terbuka. char ssid = "YourNetworkName"; char pass = "Kata Laluan Anda";

Langkah 3: Sambungan Perkakasan

Sambungan Perkakasan
Sambungan Perkakasan
Sambungan Perkakasan
Sambungan Perkakasan
Sambungan Perkakasan
Sambungan Perkakasan

Sambungkan OLED12864 dan modul pecutan ke I2C, bahagian bawah ke D2, D3, D4. Lebih-lebih lagi, tambahkan resistor pull-up 51k ke bahagian bawah hingga mencapai 3.3V, seperti di bawah.

Awas: Tidak betul menyambungkan perintang tarik ke AREF, yang betul ialah 3.3V

Gambar pematerian perkakasan, ditunjukkan seperti di bawah:

Selepas pateri, memasang modul perkakasan ke kerak, seperti di bawah:

Imej kesan komprehensif ~

Disyorkan: