Daftar Isi:

Cara Membuat Penghitung Langkah?: 3 Langkah (dengan Gambar)
Cara Membuat Penghitung Langkah?: 3 Langkah (dengan Gambar)

Video: Cara Membuat Penghitung Langkah?: 3 Langkah (dengan Gambar)

Video: Cara Membuat Penghitung Langkah?: 3 Langkah (dengan Gambar)
Video: Cara Membuat Matriks SWOT dengan Analisisnya dan Kuesionernya | Lanjutan dari AHP 2024, November
Anonim
Image
Image
Buat Proyek Blynk
Buat Proyek Blynk

Saya dulu berprestasi baik di banyak olahraga: berjalan, berlari, mengendarai sepeda, bermain bulu tangkis, dll.

Saya suka naik untuk bepergian sebelum lama. Nah, lihat perutku yang gendut……

Yah, bagaimanapun, saya memutuskan untuk memulai kembali untuk berolahraga. Peralatan apa yang harus saya siapkan? Selain fasilitas olahraga, ya! Aku butuh instrumen! Saya percaya dengan itu, saya bisa menjaga jumlah latihan yang tepat. Di sini instrumen muncul. Mari kita mulai dengan video~

Instrumen tidak hanya dapat merekam langkah (dan kalori) secara real time, tetapi juga menunjukkan waktu. Yang spesial adalah format tayangannya adalah pointer~ keren banget! Aku benar-benar menyukainya!

Anda dapat mengunggah catatan Anda ke Internet

hanya dengan satu klik. Semua catatan dapat ditampilkan oleh Blynk (perangkat lunak ponsel pintar yang diperkenalkan sebelumnya). Sama seperti jam tangan pintar yang dapat dipakai, instrumen mendapatkan waktu on line (Jadi Anda tidak perlu takut dengan kekuatan dan pembaruan waktu).

Perangkat keras di media:

Papan FireBeetle-ESP32

FireBeetle Covers-Proto Board

Layar tampilan OLED12864

Modul akselerasi

Baterai 3.7V (dibeli online, volumenya sekitar 600mAH)

3 botton (dibeli online)

Sangat nyaman untuk membangun proyek ini oleh Blybk.

Langkah 1: Buat Proyek Blynk

Tambahkan dua kontrol:

Tampilan Nilai * 1

Jam waktu nyata * 1

Nama Tampilan Nilai harus diatur ke langkah, tetapi tidak ada pengaturan untuk properti Jam waktu nyata. Pilih V1 sebagai pin input untuk mengatur tata letak kontrol, seperti di bawah ini.

Langkah 2: Unduh Program ke FireBeetle Board-ESP32

Klik di sini untuk mengunduh kode sumber ke esp32. Kode sumber terdiri dari file perpustakaan dan file pencetakan 3D. Anda harus menyimpan file perpustakaan ke lib arduino. Dan file 3D dapat mencetak kerak secara langsung.

Di bawah ini adalah program utama

#include #include // Hanya diperlukan untuk Arduino 1.6.5 dan sebelumnya #include "SSD1306.h" // alias untuk `#include "SSD1306Wire.h"` #include "OLEDDisplayUi.h" #include "images.h" # include #include #include #include #include #define POWER_KEY 1 #define MENU_KEY 2 #define UPLOAD_KEY 3 boolean upload = false; Layar SSD1306 (0x3c, 18, 0); OLEDDisplayUi ui (&tampilan); Pengatur waktu sederhana; WidgetRTC rtc; int layarW = 128; int layarH = 64; int clockCenterX = layarW/2; int clockCenterY = ((layarH-16)/2)+16; // bagian atas kuning adalah 16 px tinggi int clockRadius = 23; #define DEVICE (0x53) //ADXL345 alamat perangkat #define TO_READ (6) //jumlah byte yang akan kita baca setiap kali (dua byte untuk setiap sumbu) byte buff[TO_READ]; //6 byte buffer untuk menyimpan data yang dibaca dari perangkat char str[100]; //string buffer untuk mengubah data sebelum dikirim ke port serial int regAddress = 0x32; //register data-percepatan-sumbu pertama pada ADXL345 int xx, yy, zz; //data percepatan tiga sumbu static int currentValue = 0; langkah panjang statis yang tidak ditandatanganiSum=0; char auth = "YourAuthToken"; // Kredensial WiFi Anda. // Setel kata sandi ke "" untuk jaringan terbuka. char ssid = "NamaJaringanAnda"; char pass = "Kata Sandi 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 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, 0x03, 0x00, 0x00 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, 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, 0xE0, 0x05 0x00, 0xC0, 0x01, 0xF0, 0x03, 0x00, 0xC0, 0x03, 0xE8, 0x07, 0x00, 0xC0, 0x03, 0x88, 0x6F, 0x00, 0x80, 0x03, 0x40, 0x1E, 0x00, 0xA0, 0x03, 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, 0xE8, 0x0F, 0x00, 0xE8, 0x00, 0xF0, 0x09, 0x00, 0x60, 0x01, 0xF0, 0x04, 0x00, 0x00, 0x00, }; // fungsi utilitas untuk tampilan jam digital: mencetak awalan 0 String twoDigits(int digits){ if(digits <10) { String i = '0'+String(digits); kembali saya; } else { kembalikan String(digit); } } void clockOverlay(OLEDDisplay *display, OLEDDisplayUiState* state) { if((hour()==0) && (minute()==0) && (second()==0)) stepsSum = 0; } void analogClockFrame(OLEDDisplay *display, status OLEDDisplayUiState*, int16_t x, int16_t y) { display->drawCircle(clockCenterX + x, clockCenterY + y, 2); //hour ticks for(int z=0; z drawLine(x2 + x, y2 + y, x3 + x, y3 + y); } // menampilkan second hand float angle = second() * 6; angle = (angle / 57.29577951); //Mengonversi derajat ke radian int x3 = (Pusat jamX + (sin(sudut) * (Radius jam - (Radius jam / 5)))); int y3 = (Pusat jamY - (cos(sudut) * (Radius jam - (clockRadius / 5)))); display->drawLine(clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // menampilkan sudut jarum menit = menit() * 6; sudut = (sudut / 57.29577951); //Mengonversi derajat ke radian x3 = (Pusat jamX + (sin(sudut) * (Radius jam - (Radius jam / 4)))); y3 = (Pusat jam - (cos(sudut) * (Radius jam - (Radius jam / 4)))); display->drawLine(clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // menampilkan sudut jarum jam = jam() * 30 + int((minute() / 12) * 6); sudut = (sudut / 57.29577951); //Konversi derajat ke radian x3 = (Pusat jamX + (sin(sudut) * (Radius jam - (Radius jam / 2)))); y3 = (Pusat jamY - (cos(sudut) * (clockRadius - (clockRa dius / 2)))); tampilan->drawLine(clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); } void digitalClockFrame(OLEDDisplay *display, status OLEDDisplayUiState*, int16_t x, int16_t y) { String tanggal = String(year())+"/"+twoDigits(month())+"/"+twoDigits(day()); String waktu sekarang = String(jam())+":"+duaDigit(menit())+":"+duaDigit(kedua()); tampilan->setTextAlignment(TEXT_ALIGN_CENTER); tampilan->setFont(ArialMT_Plain_24); display->drawString(clockCenterX + x, 20, timenow); tampilan->setFont(ArialMT_Plain_16); tampilan->drawString(60, 45, tanggal); } void writeTo(perangkat int, alamat byte, val byte) { Wire.beginTransmission(perangkat); //mulai transmisi ke perangkat Wire.write(alamat); // kirim alamat register Wire.write(val); // kirim nilai untuk menulis Wire.endTransmission(); //end transmission } //membaca num byte mulai dari address register pada device ke buff array void readFrom(int device, byte address, int num, byte buff) { Wire.beginTransmission(device); //mulai transmisi ke perangkat Wire.write(alamat); //mengirim alamat untuk dibaca dari Wire.endTransmission(); //akhiri transmisi Wire.beginTransmission(perangkat); //mulai transmisi ke perangkat Wire.requestFrom(device, num); // meminta 6 byte dari perangkat int i = 0; while(Wire.available()) //perangkat mungkin mengirim kurang dari yang diminta (abnormal) { buff= Wire.read(); // menerima satu byte i++; } Wire.endTransmission(); //end transmission } void runningFrame(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { float calValue = stepsSum*0.4487; tampilan->setTextAlignment(TEXT_ALIGN_CENTER); tampilan->setFont(ArialMT_Plain_24); tampilan->drawString(clockCenterX, clockCenterY, str); sprintf(str, "%.2fcal", calValue); tampilan->setTextAlignment(TEXT_ALIGN_CENTER); tampilan->setFont(ArialMT_Plain_10); tampilan->drawString(100, 20, str); tampilan->drawXbm(10, 14, 34, 50, running_Logo_bits); } void uploadFrame(OLEDDisplay *display, status OLEDDisplayUiState*, int16_t x, int16_t y) { display->setFont(ArialMT_Plain_16); display->drawString(60, 45, "upload data …"); } // Array ini menyimpan pointer fungsi ke semua frame // frame adalah tampilan tunggal yang meluncur di FrameCallback frames = { analogClockFrame, digitalClockFrame, runningFrame, uploadFrame}; // ada berapa frame? int frameCount = 4; // Hamparan digambar secara statis di atas bingkai, mis. jam OverlayCallback overlay = { clockOverlay }; int overlay Hitung = 1; void uploadToBlynk(void){ if(upload == true){ Blynk.virtualWrite(V0, stepsSum); Blynk.virtualWrite(V1, jumlah langkah); } } void uiInit(void){ ui.setTargetFPS(30); //ui.setActiveSymbol(activeSymbol); //ui.setInactiveSymbol(Symbol tidak aktif); ui.setIndicatorPosition(TOP); ui.setIndicatorDirection(LEFT_RIGHT); ui.setFrameAnimation(SLIDE_LEFT); ui.setFrames(frame, frameCount); ui.setOverlay(overlay, overlayCount); ui.disableAutoTransition(); ui.switchToFrame(2); ui.init(); display.flipScreenVertikal(); } void adxl345Init(void){ writeTo(DEVICE, 0x2D, 0); writeTo(PERANGKAT, 0x2D, 16); writeTo(PERANGKAT, 0x2D, 8); } void updateAdxl345(void){ readFrom(DEVICE, regAddress, TO_READ, buff); //membaca data akselerasi dari ADXL345 xx = (((int)buff[1]) << 8) | penggemar[0]; yy = (((int)buff[3])<< 8) | penggemar [2]; zz = (((int)penggemar[5]) << 8) | penggemar [4]; if(xx 80){ if(xx < currentValue){ langkahJumlah++; } nilai saat ini = xx; } sprintf(str, "%d", jumlah langkah); } int getKeys(void){ if(digitalRead(D2) == RENDAH){ delay(5); if(digitalRead(D2) == LOW){ while(digitalRead(D2) == LOW); kembali POWER_KEY; } } if(digitalRead(D3) == RENDAH){ delay(5); if(digitalRead(D3) == LOW){ while(digitalRead(D3) == LOW); kembali MENU_KEY; } } if(digitalRead(D4) == RENDAH){ delay(5); if(digitalRead(D4) == LOW){ while(digitalRead(D4) == LOW); kembali UPLOAD_KEY; } } kembalikan 0; } void doKeysFunction(void){ static int uiFrameIndex = 2; int kunci = getKeys(); if(keys == POWER_KEY){ static char i = 0; if(i){ ui.init(); display.flipScreenVertikal(); tampilan.displayOn(); }else{ tampilan.displayOff(); } saya = ~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{ unggah = benar; ui.switchToFrame(3); } } } void setup() { pinMode(D2, INPUT); pinMode(D3, INPUT); pinMode(D4, INPUT); Blynk.begin(auth, ssid, pass); rtc.mulai(); uiInit(); adxl345Init(); timer.setInterval(30, perbaruiAdxl345); timer.setInterval(100, uploadToBlynk); } void loop() { int sisaWaktuBudget = ui.update(); static int testSum = 0; if((testSum 0) { delay(remainingTimeBudget); } doKeysFunction(); timer.run(); }

Perhatian: Anda harus mengubah pengaturan Wi-Fi, paspor, dan AUTHTOKENS untuk diri Anda sendiri.

char auth = "YourAuthToken"; // Kredensial WiFi Anda. // Setel kata sandi ke "" untuk jaringan terbuka. char ssid = "NamaJaringanAnda"; char pass = "Kata Sandi Anda";

Langkah 3: Koneksi Perangkat Keras

Koneksi Perangkat Keras
Koneksi Perangkat Keras
Koneksi Perangkat Keras
Koneksi Perangkat Keras
Koneksi Perangkat Keras
Koneksi Perangkat Keras

Hubungkan OLED12864 dan modul akselerasi ke I2C, bagian bawah ke D2, D3, D4. Selain itu, tambahkan resistor pull-up 51k ke bagian bawah untuk mencapai 3.3V, yang ditunjukkan seperti di bawah ini.

Perhatian: Salah menghubungkan resistor pull-up ke AREF, yang benar ke 3.3V

Gambar penyolderan perangkat keras, ditunjukkan seperti di bawah ini:

Setelah disolder, merakit modul hardware menjadi kerak, terlihat seperti di bawah ini:

Gambar efek yang komprehensif~

Direkomendasikan: