Բովանդակություն:

Ինչպե՞ս պատրաստել քայլերի հաշվիչ: 3 քայլ (նկարներով)
Ինչպե՞ս պատրաստել քայլերի հաշվիչ: 3 քայլ (նկարներով)

Video: Ինչպե՞ս պատրաստել քայլերի հաշվիչ: 3 քայլ (նկարներով)

Video: Ինչպե՞ս պատրաստել քայլերի հաշվիչ: 3 քայլ (նկարներով)
Video: Ինչպես պարզել, որ ձեր դիմաց ՉԱՐ մարդ է․ Այս նշանները կօգնեն հասկանալ դա 2024, Հունիսի
Anonim
Image
Image
Ստեղծեք Blynk նախագիծ
Ստեղծեք Blynk նախագիծ

Ես լավ էի հանդես գալիս բազմաթիվ սպորտաձևերում ՝ քայլել, վազել, հեծանիվ վարել, բադմինտոն խաղալ և այլն:

Ես շատ եմ սիրում երկար ժամանակ ճանապարհորդել: Դե, նայեք իմ միջքաղաքային որովայնին ……

Դե, ամեն դեպքում, ես որոշում եմ վերսկսել մարզվելը: Ինչ սարքավորումներ պետք է պատրաստեմ: Բացի մարզական հաստատությունից, այո: Ինձ գործիք է պետք: Ես հավատում եմ, որ դրանով ես կարող եմ պահպանել համապատասխան քանակությամբ վարժություններ: Այստեղ գործիքը ծագում է: Սկսենք տեսանյութից

Գործիքը ոչ միայն կարող է գրանցել քայլեր (և կալորիաներ) իրական ժամանակում, այլև ցույց տալ ժամանակը: Առանձնահատուկն այն է, որ ցուցադրման ձևաչափը ցուցիչ է ~ այնքան թույն: Ինձ իսկապես դուր է գալիս:

Դուք կարող եք ձեր գրառումները վերբեռնել ինտերնետ

միայն մեկ կտտոցով: Բոլոր գրառումները կարող են ցուցադրվել Blynk- ի կողմից (նախկինում ներդրված խելացի հեռախոսների ծրագրակազմ): Նույնը, ինչ կրելի խելացի ժամացույցը, գործիքը ժամանակ է ստանում առցանց (այնպես որ պետք չէ վախենալ էներգիայի և ժամանակի թարմացումից):

Սարքավորումներ մարգագետնում.

FireBeetle Board-ESP32

FireBeetle Covers-Proto տախտակ

OLED12864 ցրված էկրան

Արագացման մոդուլ

3.7 Վ մարտկոց (գնված առցանց, ծավալը ՝ մոտ 600 մԱՀ)

3 շիշ (գնված է առցանց)

Շատ հարմար է կառուցել այս նախագիծը Blybk- ի կողմից:

Քայլ 1: Ստեղծեք Blynk նախագիծ

Ավելացնել երկու հսկիչ.

Արժեքի ցուցադրում * 1

Իրական ժամանակի ժամացույց * 1

Արժեքի ցուցադրման անունը պետք է սահմանվի քայլերի, բայց ոչ իրական ժամանակի ժամացույցի հատկությունների պարամետր: Ընտրեք V1- ը որպես մուտքագրման քորոց ՝ կարգավորիչների դասավորությունը կարգավորելու համար, ինչպես ցույց է տրված ստորև:

Քայլ 2: Ներբեռնեք ծրագրեր FireBeetle Board-ESP32- ում

Կտտացրեք այստեղ ՝ esp32 կոդին ներբեռնելու համար: Աղբյուրը բաղկացած է գրադարանային ֆայլերից և 3D տպման ֆայլերից: Դուք պետք է գրադարանի ֆայլը պահեք lib of arduino- ում: Իսկ 3D ֆայլերը կարող են ուղղակիորեն կեղևներ տպել:

Ստորև ներկայացնում ենք հիմնական ծրագիրը

#ներառել #ներառել // Անհրաժեշտ է միայն Arduino 1.6.5 և ավելի վաղ #ներառել «SSD1306.h» // կեղծանուն `« #ներառել »SSD1306Wire.h" # #ներառել "OLEDDisplayUi.h" #include "images.h" # ներառել #ներառել #ներառել #ներառել #ներառել #սահմանել POWER_KEY 1 #սահմանել MENU_KEY 2 #սահմանել UPLOAD_KEY 3 բուլյան բեռնում = կեղծ; SSD1306 էկրան (0x3c, 18, 0); OLEDDisplayUi ui (& ցուցադրում); SimpleTimer ժմչփ; WidgetRTC rtc; int screenW = 128; int էկրան H = 64; int clockCenterX = screenW/2; int clockCenterY = ((screenH-16)/2) +16; // վերին դեղին հատվածը 16 px բարձրություն է int clockRadius = 23; #սահմանել ՍԱՐՔԸ (0x53) // ADXL345 սարքի հասցեն #սահմանել TO_READ (6) // բայթերի քանակը, որոնք մենք պատրաստվում ենք կարդալ ամեն անգամ (երկու բայթ յուրաքանչյուր առանցքի համար) բայթային բուֆ [TO_READ]; // 6 բայթ բուֆեր ՝ սարքի char str- ից կարդացած տվյալները պահելու համար [100]; // string buffer ՝ տվյալները փոխակերպելու համար նախքան դրանք սերիական նավահանգիստ ուղարկելը int regAddress = 0x32; // առաջին առանցք-արագացում-տվյալների գրանցամատյան ADXL345 int xx, yy, zz; // երեք առանցքի արագացման տվյալներ ստատիկ int currentValue = 0; ստատիկ անստորագիր երկար քայլերՍում = 0; char auth = "YourAuthToken"; // Ձեր WiFi հավատարմագրերը: // Բաց ցանցերի համար գաղտնաբառ սահմանեք: char ssid = "Ձեր ցանցի անունը"; 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, 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, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x60, 0xF1, 0x07, 0x00, 0x00, 0x20, 0xF8, 0x17, 0x00, 0x00, 0xC0, 0xF8, 0x0F, 0x00, 0x00, 0xE0, 0xFB, 0x17, 0x00, 0x00, 0xC0, 0xff, 0x13, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00, 0x00, 0x80, 0xFE, 0x03, 0x00, 0x00, 0x00, 0xF9, 0x03, 0x00, 0x00, 0x00, 0xFA, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0xF0, 0x07, 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, 0x1F 0xFF, 0x1F, 0x00, 0x00, 0xA0, 0xFF, 0x5F, 0x00, 0x00, 0xC0, 0x3F, 0x3F, 0x00, 0x0 0.5 0x00, 0xC0, 0x01, 0xF0, 0x03, 0x00, 0xC0, 0x03, 0xE8, 0x07, 0x00, 0xC0, 0x03, 0x88, 0x6F, 0x00, 0x80, 0x03, 0x40, 0x1E, 0x00, 0xA0, 0x03, 0x40, 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, 0xE0, 0x00, 0xE8, 0x0F, 0x00, 0xE8, 0x00, 0xF0, 0x09, 0x00, 0x60, 0x01, 0xF0, 0x04, 0x00, 0x00, 0x00,}; // թվային ժամացույցի ցուցադրման օգտակար գործառույթ. տպում է առաջատար 0 String twoDigits (int թվեր) {if (digit <10) {String i = '0'+String (digit); վերադարձնել; } else {վերադարձ լար (թվանշաններ); }} void clockOverlay (OLEDDisplay * ցուցադրում, OLEDDisplayUiState * վիճակ) {if ((ժամ () == 0) && (րոպե () == 0) && (երկրորդ () == 0)) քայլերՍում = 0; } void analogClockFrame (OLEDDisplay * էկրան, OLEDDisplayUiState * վիճակ, 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 + (մեղք (անկյուն) * (clockRadius - (clockRadius / 5)))); int y3 = (clockCenterY - (cos (անկյուն) * (clockRadius - (clockRadius / 5)))); ցուցադրում-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y).; // Փոխարկել աստիճանները ռադիոների x3 = (clockCenterX + (մեղք (անկյուն) * (clockRadius - (clockRadius / 4)))); y3 = (clockCenterY - (cos (անկյուն) * (clockRadius - (clockRadius / 4)))); ցուցադրում-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // ժամացույցի ժամացույցի անկյուն = ժամ () * 30 + int ((րոպե () / 12) * 6); անկյուն = (անկյուն / 57.29577951); // Փոխարկել աստիճանները ռադիոների x3 = (clockCenterX + (մեղք (անկյուն) * (clockRadius - (clockRadius / 2)))); y3 = (clockCenterY - (cos (անկյուն) * (clockRadius - (clockRa dius / 2)))); ցուցադրում-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); } void digitalClockFrame (OLEDDisplay * ցուցադրում, OLEDDisplayUiState * վիճակ, int16_t x, int16_t y) {String date = String (year ())+"/"+twoDigits (month ())+"/"+twoDigits (day ()); Լարային ժամանակացույց = լարային (ժամ ())+":"+երկու թվանշան (րոպե ())+":"+երկու թվանշան (երկրորդ ()); ցուցադրում-> setTextAlignment (TEXT_ALIGN_CENTER); ցուցադրում-> setFont (ArialMT_Plain_24); ցուցադրում-> drawString (clockCenterX + x, 20, ժամանակացույց); ցուցադրում-> setFont (ArialMT_Plain_16); ցուցադրում-> drawString (60, 45, ամսաթիվ); } void writeTo (int սարք, բայթ հասցե, բայթ val) {Wire.beginTransmission (սարք); // սկսել փոխանցումը Wire.write սարքին (հասցե); // ուղարկել գրանցման հասցեն Wire.write (val); // ուղարկեք արժեք Wire.endTransmission () գրելու համար // ավարտել փոխանցումը} // կարդում է թվային բայթեր ՝ սկսած սարքի հասցեների գրանցումից մինչև buff array void readFrom (int սարք, բայթ հասցե, int num, բայթ buff ) {Wire.beginTransmission (սարք); // սկսել փոխանցումը Wire.write սարքին (հասցե); // ուղարկում է հասցե ՝ Wire.endTransmission- ից կարդալու համար (); // ավարտել փոխանցումը Wire.beginTransmission (սարք); // սկսել փոխանցումը սարքի Wire.requestFrom (սարքից, համարից); // պահանջել 6 բայթ սարքից int i = 0; մինչդեռ (Wire.available ()) // սարքը կարող է ավելի քիչ ուղարկել, քան պահանջվում է (աննորմալ) {buff = Wire.read (); // ստանալ բայթ i ++; } Wire.endTransmission (); // ավարտել փոխանցումը} void runningFrame (OLEDDisplay*ցուցադրում, OLEDDisplayUiState*վիճակ, int16_t x, int16_t y) {float calValue = stepsSum*0.4487; ցուցադրում-> setTextAlignment (TEXT_ALIGN_CENTER); ցուցադրում-> setFont (ArialMT_Plain_24); ցուցադրում-> drawString (clockCenterX, clockCenterY, փող); sprintf (փող., "%.2fcal", calValue); ցուցադրում-> setTextAlignment (TEXT_ALIGN_CENTER); ցուցադրում-> setFont (ArialMT_Plain_10); ցուցադրում-> drawString (100, 20, փող); ցուցադրում-> drawXbm (10, 14, 34, 50, running_Logo_bits); } void uploadFrame (OLEDDisplay * ցուցադրում, OLEDDisplayUiState * վիճակ, int16_t x, int16_t y) {display-> setFont (ArialMT_Plain_16); ցուցադրում-> drawString (60, 45, «տվյալների վերբեռնում …»); } // Այս զանգվածը պահում է բոլոր շրջանակների ֆունկցիայի ցուցիչները // շրջանակները այն միակ տեսարաններն են, որոնք սահում են FrameCallback շրջանակներում = {analogClockFrame, digitalClockFrame, runningFrame, uploadFrame}; // քանի՞ շրջանակ կա: int frameCount = 4; // laածկույթները ստատիկ կերպով գծված են շրջանակի վերևում, օրինակ. ժամացույց OverlayCallback ծածկույթ = {clockOverlay}; int overlaysCount = 1; անվավեր uploadToBlynk (անվավեր) {if (upload == true) {Blynk.virtualWrite (V0, stepsSum); Blynk.virtualWrite (V1, stepsSum); }} դատարկ uiInit (անվավեր) {ui.setTargetFPS (30); //ui.setActiveSymbol(activeSymbol); //ui.setInactiveSymbol (ակտիվSymbol); ui.setIndicatorPosition (TOP); ui.setIndicatorDirection (LEFT_RIGHT); ui.setFrameAnimation (SLIDE_LEFT); ui.setFrames (շրջանակներ, frameCount); ui.setOverlays (overlays, overlaysCount); ui.disableAutoTransition (); ui.switchToFrame (2); ui.init (); display.flipScreenVertically (); } void adxl345Init (անվավեր) {writeTo (ՍԱՐՔ, 0x2D, 0); writeTo (ՍԱՐՔ, 0x2D, 16); writeTo (ՍԱՐՔ, 0x2D, 8); } void updateAdxl345 (void) {readFrom (DEVICE, regAddress, TO_READ, buff); // կարդալ ADXL345- ի արագացման տվյալները xx = (((int) buff [1]) << 8) | buff [0]; yy = (((int) buff [3]) << 8) | բուֆ [2]; zz = (((int) buff [5]) << 8) | բուֆ [4]; if (xx 80) {if (xx <currentValue) {stepsSum ++; } currentValue = xx; } sprintf (փող, "%d", stepsSum); } int getKeys (անվավեր) {if (digitalRead (D2) == LOW) {հետաձգում (5); եթե (digitalRead (D2) == LOW) {while (digitalRead (D2) == LOW); վերադարձ POWER_KEY; }} if (digitalRead (D3) == LOW) {հետաձգում (5); if (digitalRead (D3) == LOW) {while (digitalRead (D3) == LOW); վերադարձ MENU_KEY; }} if (digitalRead (D4) == LOW) {հետաձգում (5); եթե (digitalRead (D4) == LOW) {while (digitalRead (D4) == LOW); վերադարձ UPLOAD_KEY; }} վերադարձ 0; } void doKeysFunction (void) {static int uiFrameIndex = 2; int ստեղներ = getKeys (); if (ստեղներ == POWER_KEY) {ստատիկ char i = 0; եթե (i) {ui.init (); display.flipScreenVertically (); display.displayOn (); } else {display.displayOff (); } i = ~ i; } if (keys == 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); } else {բեռնել = ճշմարիտ; ui.switchToFrame (3); }}} void setup () {pinMode (D2, INPUT); pinMode (D3, INPUT); pinMode (D4, INPUT); Blynk.begin (author, ssid, pass); rtc.begin (); uiInit (); adxl345Init (); timer.setInterval (30, updateAdxl345); timer.setInterval (100, uploadToBlynk); } void loop () {int დარჩენილიTimeBudget = ui.update (); ստատիկ int testSum = 0; եթե ((testSum 0) {հետաձգում (մնացածTimeBudget);} doKeysFunction (); timer.run ();}

Caգուշացում. Դուք ինքներդ պետք է փոփոխեք Wi-Fi- ի կարգավորումը, անձնագիրը և AUTHTOKENS- ը:

char auth = "YourAuthToken"; // Ձեր WiFi հավատարմագրերը: // Բաց ցանցերի համար գաղտնաբառ սահմանեք: char ssid = "Ձեր ցանցի անունը"; char pass = "YourPassword";

Քայլ 3: Սարքաշարի միացում

Սարքաշարի միացում
Սարքաշարի միացում
Սարքաշարի միացում
Սարքաշարի միացում
Սարքաշարի միացում
Սարքաշարի միացում

Միացրեք OLED12864- ը և արագացման մոդուլը I2C- ին, ներքևը ՝ D2, D3, D4: Ավելին, ներքևին ավելացրեք 51k ձգվող դիմադրիչներ `3.3V- ի հասնելու համար, ինչպես ցույց է տրված ստորև:

Wrongգուշացում. Սխալ է ձգվող դիմադրիչները AREF- ին միացնելը, ճիշտը `3.3 Վ-ին

Սարքավորումների զոդման պատկերը, ինչպես ցույց է տրված ստորև.

Hardwareոդումից հետո, ապարատային մոդուլը հավաքելով ընդերքի վրա, ցուցադրված է ստորև.

Համապարփակ էֆեկտ պատկեր

Խորհուրդ ենք տալիս: