Talaan ng mga Nilalaman:

Paano Gumawa ng isang Hakbang Counter ?: 3 Mga Hakbang (na may Mga Larawan)
Paano Gumawa ng isang Hakbang Counter ?: 3 Mga Hakbang (na may Mga Larawan)

Video: Paano Gumawa ng isang Hakbang Counter ?: 3 Mga Hakbang (na may Mga Larawan)

Video: Paano Gumawa ng isang Hakbang Counter ?: 3 Mga Hakbang (na may Mga Larawan)
Video: SLOPE NG HAGDAN ( STAIRS ) PAG COMPUTE SA MADALING PARAAN AT STEP BY STEP. 2024, Hunyo
Anonim
Image
Image
Lumikha ng isang Blynk Project
Lumikha ng isang Blynk Project

Naging mahusay akong gumanap sa maraming palakasan: paglalakad, pagtakbo, pagsakay sa bisikleta, paglalaro ng badminton atbp.

Gusto kong sumakay upang maglakbay sa paligid ng hindi masyadong matagal. Kaya, tingnan ang aking portly tiyan ……

Sa gayon, gayon pa man, nagpasiya akong mag-restart upang mag-ehersisyo. Anong kagamitan ang dapat kong ihanda? Bukod sa pasilidad sa palakasan, oo! Kailangan ko ng instrumento! Naniniwala ako kasama nito, mapapanatili ko ang naaangkop na dami ng ehersisyo. Dito nagmula ang instrumento. Magsimula tayo sa isang video ~

Ang instrumento ay hindi lamang maaaring magtala ng mga hakbang (at calories) sa real time, ngunit magpakita ng oras. Ano ang espesyal na ang format ng pagpapakita ay pointer ~ so cool! Talagang gusto ko talaga!

Maaari mong i-upload ang iyong mga tala sa Internet

sa pamamagitan lamang ng isang pag-click. Ang lahat ng mga tala ay maaaring ipakita ni Blynk (isang software ng smart-phone na ipinakilala dati). Kapareho ng naisusuot na matalinong relo, nakakakuha ng oras ang instrumento sa linya (Kaya't hindi mo kailangang matakot sa pag-update ng lakas at oras).

Ang hardware sa meed:

FireBeetle Board-ESP32

FireBeetle Covers-Proto Board

OLED12864 dispaly screen

Module ng pagpapabilis

3.7V na baterya (binili online, ang dami ay halos 600mAH)

3 botelya (binili online)

Napakadali na itayo ang proyektong ito ng Blybk.

Hakbang 1: Lumikha ng isang Blynk Project

Magdagdag ng dalawang kontrol:

Pagpapakita ng Halaga * 1

Oras ng real-time * 1

Ang pangalan ng Display Display ay dapat itakda sa mga hakbang, ngunit walang setting para sa mga pag-aari ng orasan na Real-time. Piliin ang V1 bilang input pin upang ayusin ang layout ng mga kontrol, ipinakita tulad ng sa ibaba.

Hakbang 2: Mag-download ng Mga Program sa FireBeetle Board-ESP32

Mag-click dito upang i-download ang source code sa esp32. Ang source code ay binubuo ng mga file ng library at mga file sa pag-print ng 3D. Dapat mong i-save ang file ng library sa lib ng arduino. At ang mga 3D file ay maaaring direktang mai-print ang mga crust.

Nasa ibaba ang pangunahing programa

#include #include // Kailangan lang para sa Arduino 1.6.5 at mas maaga #include "SSD1306.h" // alias para sa "#include" SSD1306Wire.h "" #include "OLEDDisplayUi.h" #include "na mga imahe.h" # isama ang # isama ang # isama ang # isama ang # isama ang # tukuyin ang POWER_KEY 1 # tukuyin ang MENU_KEY 2 # tukuyin ang UPLOAD_KEY 3 boolean upload = false; Ipakita ang SSD1306 (0x3c, 18, 0); OLEDDisplayUi ui (& display); SimpleTimer timer; WidgetRTC rtc; int screenW = 128; int screenH = 64; int clockCenterX = screenW / 2; int clockCenterY = ((screenH-16) / 2) +16; // top dilaw na bahagi ay 16 px taas int clockRadius = 23; #define DEVICE (0x53) // ADXL345 address ng aparato # tukuyin ang TO_READ (6) // bilang ng mga byte na babasahin namin sa bawat oras (dalawang byte para sa bawat axis) byte buff [TO_READ]; // 6 bytes buffer para sa pag-save ng data na nabasa mula sa aparato char str [100]; // string buffer upang ibahin ang data bago ipadala ito sa serial port int regAddress = 0x32; // unang rehistro ng axis-acceleration-data sa ADXL345 int xx, yy, zz; // three axis acceleration data static int currentValue = 0; static unsigned mahabang hakbangSum = 0; char auth = "YourAuthToken"; // Ang iyong mga kredensyal sa WiFi. // Itakda ang password sa "" para sa mga bukas na network. char ssid = "YourNetworkName"; pass 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, 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, 0x60, 0xF1, 0x07, 0x00, 0x60, 0xF1, 0x07, 0x 0 0xF8, 0x17, 0x00, 0x00, 0xC0, 0xF8, 0x0F, 0x00, 0x00, 0xE0, 0xFB, 0x17, 0x00, 0x00, 0xC0, 0xFF, 0x13, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x 0xFE, 0x03, 0x00, 0x00, 0x00, 0xF9, 0x03, 0x00, 0x00, 0x00, 0xFA, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0xF0, 0x0x, 0x 0 0xF4, 0x07, 0x00, 0x00, 0x00, 0xF4, 0x0F, 0x00, 0x00, 0x00, 0xF9, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x80, 0xFE, 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, 0x8 0x00, 0xC0, 0x01, 0xF0, 0x03, 0x00, 0xC0, 0x03, 0xE8, 0x07, 0x00, 0xC0, 0x03, 0x88, 0x6F, 0x00, 0x80, 0x03, 0x40, 0x1E, 0x 0, 0x 0 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, 0xE8, 0x0F, 0x00, 0xE8, 0x00, 0xF0, 0x09, 0x00, 0x60, 0x01, 0xF0, 0x04, 0x00, 0x00, 0x00,}; // utility function para sa pagpapakita ng digital na orasan: mga print na humahantong sa 0 String twoDigits (int digit) {kung (mga digit <10) {String i = '0' + String (mga digit); ibalik i; } iba pa {ibalik ang String (mga digit); }} void na orasanOverlay (display OLEDDisplay *, estado ng OLEDDisplayUiState) {kung ((oras () == 0) && (minuto () == 0) && (pangalawa () == 0)) stepsSum = 0; } walang bisa analogClockFrame (OLEDDisplay * display, OLEDDisplayUiState * estado, 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);} // display second hand float anggulo = pangalawa () * 6; anggulo = (anggulo / 57.29577951); // I-convert ang mga degree sa radians int x3 = (clockCenterX + (sin (anggulo) * (clockRadius - (clockRadius / 5)))); int y3 = (clockCenterY - (cos (anggulo) * (clockRadius - (clockRadius / 5)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // display minute hand anggulo = minuto () * 6; anggulo = (anggulo / 57.29577951); // convert degrees to radians x3 = (clockCenterX + (sin (anggulo) * (clockRadius - (clockRadius / 4)))); y3 = (clockCenterY - (cos (anggulo) * (clockRadius - (clockRadius / 4)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // display hour hand anggulo = oras () * 30 + int ((minuto () / 12) * 6); anggulo = (anggulo / 57.29577951); // I-convert ang mga degree sa mga radian x3 = (clockCenterX + (sin (anggulo) * (clockRadius - (clockRadius / 2)))); y3 = (clockCenterY - (cos (anggulo) * (orasanRadius - (orasanRa dius / 2)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); } walang bisa digitalClockFrame (OLEDDisplay * display, OLEDDisplayUiState * estado, int16_t x, int16_t y) {String date = String (year ()) + "/" + twoDigits (month ()) + "/" + twoDigits (day ()); String timenow = String (hour ()) + ":" + twoDigits (minuto ()) + ":" + twoDigits (pangalawa ()); 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, petsa); } walang bisa ang magsulatTo (int aparato, byte address, byte val) {Wire.beginTransmission (aparato); // simulan ang paghahatid sa aparato Wire.write (address); // send register address Wire.write (val); // send halaga upang isulat ang Wire.endTransmission (); // end transmission} // nagbabasa ng mga byte na nagsisimula sa pagrehistro sa address sa aparato upang i-buff ang array na walang bisa readFrom (int device, byte address, int num, byte buff ) {Wire.beginTransmission (aparato); // simulan ang paghahatid sa aparato Wire.write (address); // nagpapadala ng address upang mabasa mula sa Wire.endTransmission (); // end transmission Wire.beginTransmission (aparato); // simulan ang paghahatid sa aparato Wire.requestFrom (aparato, num); // request 6 bytes from device int i = 0; habang (Wire.available ()) // aparato ay maaaring magpadala ng mas mababa kaysa sa hiniling (abnormal) {buff = Wire.read (); // makatanggap ng isang byte i ++; } Wire.endTransmission (); // end transmission} void runningFrame (display OLEDDisplay *, estado ng OLEDDisplayUiState *, 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 * estado, int16_t x, int16_t y) {display-> setFont (ArialMT_Plain_16); display-> drawString (60, 45, "upload data …"); } // Ang array na ito ay nagpapanatili ng mga point point ng pag-andar sa lahat ng mga frame // mga frame ay ang nag-iisang view na slide sa FrameCallback frame = {analogClockFrame, digitalClockFrame, runningFrame, uploadFrame}; // ilan ang mga frame doon? int frameCount = 4; // Overlay ay statically iginuhit sa tuktok ng isang frame hal. isang orasan na OverlayCallback na overlay = {clockOverlay}; int overlaysCount = 1; void uploadToBlynk (void) {if (upload == true) {Blynk.virtualWrite (V0, stepsSum); Blynk.virtualWrite (V1, stepsSum); }} void uiInit (walang bisa) {ui.setTargetFPS (30); //ui.setActiveSymbol(activeSymbol); //ui.setInactiveSymbol(inactiveSymbol); ui.setIndicatorPosition (TOP); ui.setIndicatorDirection (LEFT_RIGHT); ui.setFrameAnimation (SLIDE_LEFT); ui.setFrames (mga frame, frameCount); ui.setOverlays (overlay, overlaysCount); ui.disableAutoTransition (); ui.switchToFrame (2); ui.init (); display.flipScreenVertically (); } walang bisa adxl345Init (walang bisa) {writeTo (DEVICE, 0x2D, 0); isulatTo (DEVICE, 0x2D, 16); isulatTo (DEVICE, 0x2D, 8); } void updateAdxl345 (void) {readFrom (DEVICE, regAddress, TO_READ, buff); // basahin ang data ng pagpabilis mula sa ADXL345 xx = ((((int) buff [1]) << 8) | buff [0]; yy = ((((int) buff [3]) << 8) | buff [2]; zz = ((((int) buff [5]) << 8) | buff [4]; kung (xx 80) {kung (xx <currentValue) {stepsSum ++; } kasalukuyangValue = xx; } sprintf (str, "% d", stepsSum); } int getKeys (walang bisa) {kung (digitalRead (D2) == LOW) {pagkaantala (5); kung (digitalRead (D2) == LOW) {habang (digitalRead (D2) == LOW); ibalik ang POWER_KEY; }} kung (digitalRead (D3) == LOW) {pagkaantala (5); kung (digitalRead (D3) == LOW) {habang (digitalRead (D3) == LOW); ibalik ang MENU_KEY; }} kung (digitalRead (D4) == LOW) {pagkaantala (5); kung (digitalRead (D4) == LOW) {habang (digitalRead (D4) == LOW); ibalik ang UPLOAD_KEY; }} ibalik ang 0; } walang bisa doKeysFunction (walang bisa) {static int uiFrameIndex = 2; int key = getKeys (); kung (key == POWER_KEY) {static char i = 0; kung (i) {ui.init (); display.flipScreenVertically (); display.displayOn (); } iba pa {display.displayOff (); } i = ~ i; } kung (mga key == MENU_KEY) {kung (mag-upload == maling) {uiFrameIndex ++; kung (uiFrameIndex == 3) uiFrameIndex = 0; ui.switchToFrame (uiFrameIndex); } iba pa {ui.switchToFrame (3); }} kung (mga key == UPLOAD_KEY) {kung (mag-upload == totoo) {upload = false; ui.switchToFrame (uiFrameIndex); } iba pa {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 leftTimeBudget = ui.update (); static int testSum = 0; kung ((testSum 0) {pagkaantala (natitirangTimeBudget);} doKeysFunction (); timer.run ();}

Pag-iingat: Dapat mong baguhin ang setting ng Wi-Fi, pasaporte at AUTHTOKENS sa iyong sarili.

char auth = "YourAuthToken"; // Ang iyong mga kredensyal sa WiFi. // Itakda ang password sa "" para sa mga bukas na network. char ssid = "YourNetworkName"; pass pass = "YourPassword";

Hakbang 3: Koneksyon sa Hardware

Koneksyon sa Hardware
Koneksyon sa Hardware
Koneksyon sa Hardware
Koneksyon sa Hardware
Koneksyon sa Hardware
Koneksyon sa Hardware

Ikonekta ang OLED12864 at ang module ng pagpapabilis sa I2C, sa ilalim sa D2, D3, D4. Bukod dito, magdagdag ng 51k pull-up resistors sa ilalim upang maabot ang 3.3V, na ipinakita tulad ng sa ibaba.

Pag-iingat: Maling kumonekta sa mga resistors ng pull-up sa AREF, ang tama ay sa 3.3V

Ang imahe ng paghihinang ng hardware, ipinakita tulad ng sa ibaba:

Pagkatapos ng panghinang, pag-iipon ng module ng hardware sa crust, ipinakita tulad ng sa ibaba:

Comprehensive epekto ng imahe ~

Inirerekumendang: