Мазмуну:

Кантип кадам эсептегич жасоо керек?: 3 кадам (сүрөттөр менен)
Кантип кадам эсептегич жасоо керек?: 3 кадам (сүрөттөр менен)

Video: Кантип кадам эсептегич жасоо керек?: 3 кадам (сүрөттөр менен)

Video: Кантип кадам эсептегич жасоо керек?: 3 кадам (сүрөттөр менен)
Video: Айымдар үчүн презерватив кандай болот🤔? Видеообзор 2024, Ноябрь
Anonim
Image
Image
Blynk долбоорун түзүү
Blynk долбоорун түзүү

Мен көптөгөн спортто жакшы аткарчумун: жөө басуу, чуркоо, велосипед тебүү, бадминтон ойноо ж.

Көп өтпөй айланып саякаттаганды жакшы көрөм. Мейли, менин ичимдеги карынды карачы ….

Кандай болбосун, мен машыгуу үчүн кайра баштоону чечтим. Кандай жабдууларды даярдоо керек? Спорттук базадан тышкары, ооба! Мага аспап керек! Мен ишенем, мен көнүгүүлөрдү тиешелүү өлчөмдө сактай алам. Бул жерде инструмент пайда болот. Видео менен баштайлы ~

Курал реалдуу убакытта кадамдарды (жана калорияларды) гана жаза албайт, бирок убакытты көрсөтөт. Өзгөчөлүгү - көрсөтүүнүн форматы көрсөткүч ~ абдан сонун! Мен, чынында эле, абдан жагат!

Сиз жазууларды интернетке жүктөй аласыз

бир чыкылдатуу менен гана. Бардык жазууларды Blynk (мурда киргизилген смарт-телефон программасы) көрсөтө алат. Кийиле турган акылдуу саат сыяктуу эле, инструмент убактысын алат (Андыктан күчтөн жана убакыттын жаңырышынан коркуунун кереги жок).

Техникалык жабдыктар:

FireBeetle Board-ESP32

FireBeetle Covers-Proto Board

OLED12864 дисплей экраны

Ылдамдануу модулу

3.7V батарейкасы (Интернет аркылуу сатылып алынган, көлөмү 600 мАчтын тегерегинде.

3 бөтөлкө (Интернеттен сатып алынган.

Бул долбоорду Blybk тарабынан куруу абдан ыңгайлуу.

1 -кадам: Blynk долбоорун түзүү

Эки көзөмөлдү кошуу:

Маанини көрсөтүү * 1

Реалдуу убакыт сааты * 1

Наркты көрсөтүүнүн аталышы кадамдарга коюлушу керек, бирок реалдуу убакыт саатынын касиеттери жок. Төмөндө көрсөтүлгөндөй башкаруу элементтеринин жайгашуусун тууралоо үчүн киргизүү пини катары V1ди тандаңыз.

2-кадам: FireBeetle Board-ESP32ге программаларды жүктөө

Esp32ге баштапкы кодду жүктөп алуу үчүн бул жерди басыңыз. Булак коду китепкана файлдарынан жана 3D басып чыгаруу файлдарынан турат. Китепкана файлын arduino libге сактоо керек. Ал эми 3D файлдары кыртышты түз басып чыгара алат.

Төмөндө негизги программа

#include #include // Arduino 1.6.5 жана андан мурунку версия үчүн гана керек #include "SSD1306.h" // alias for `#include" SSD1306Wire.h "" #include "OLEDDisplayUi.h" #include "images.h" # кошуу #кошуу #кошуу #кошуу #кошуу #аныктоо POWER_KEY 1 #аныктоо MENU_KEY 2 #аныктоо ЖҮКТӨӨ_АЧкыч 3 логикалык жүктөө = жалган; SSD1306 дисплейи (0x3c, 18, 0); OLEDDisplayUi ui (& дисплей); SimpleTimer таймер; WidgetRTC rtc; int screenW = 128; int screenH = 64; int clockCenterX = экранW/2; int clockCenterY = (((экранH-16)/2) +16; // жогорку сары бөлүгү 16 пиксель бийиктиги int clockRadius = 23; #DEFINE DEVICE (0x53) // ADXL345 түзмөктүн дареги #define TO_READ (6) // биз окуй турган байттардын саны (ар бир огу үчүн эки байт) байт буфеси [TO_READ]; // 6 байт буфер түзүлүштөн окулган маалыматты сактоо үчүн char str [100]; // string буфери, аны int serA портуна жөнөтүүдөн мурун трансформациялоо үчүн int regAddress = 0x32; // ADXL345 int xx, yy, zz боюнча биринчи огу-акселерация-маалымат реестри; // үч огу ылдамдануу маалыматы static 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x01 0xFC, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x60, 0xF1, 0x20, 0xF8, 0x17, 0x00, 0x00, 0xC0, 0xF8, 0x0F, 0x00, 0x00, 0xE0, 0xFB, 0x17, 0x00, 0x00, 0xC0, 0xFF, 0x13, 0x00, 0x00, 0x00, 0xF, 0x0, 0x00 0xFE, 0x03, 0x00, 0x00, 0x00, 0xF9, 0x03, 0x00, 0x00, 0x00, 0xFA, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x03, 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, 0x00, 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, 0x00, 0x00, 0x00 0x00, 0xC0, 0x01, 0xF0, 0x03, 0x00, 0xC0, 0x03, 0xE8, 0x07, 0x00, 0xC0, 0x03, 0x88, 0x6F, 0x00, 0x80, 0x03, 0x40, 0x1, 0x1, 0x0E, 0x03 0x00, 0x80, 0x03, 0x00, 0xF8, 0x01, 0x00, 0x07, 0x00, 0xF4, 0x00, 0x00, 0x07, 0x00, 0xE8, 0x00, 0x80, 0x0F, 0x00, 0xE8, 0x00, 0x90 0x00, 0xE8, 0x0F, 0x00, 0xE8, 0x00, 0xF0, 0x09, 0x00, 0x60, 0x01, 0xF0, 0x04, 0x00, 0x00, 0x00,}; // санариптик саат дисплейи үчүн пайдалуу функция: 0 String twoDigits (int цифралары) {if (цифралары <10) {String i = '0'+String (цифралар); return i; } else {return String (цифралар); }} бош убактысыOverlay (OLEDDisplay * дисплейи, OLEDDisplayUiState * абалы) {if ((hour () == 0) && (minutes () == 0) && (second () == 0)) stepsSum = 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 + (sin (бурч) * (clockRadius - (clockRadius / 5)))))); int y3 = (clockCenterY - (cos (бурч)) * (clockRadius - (clockRadius / 5)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y);; // Даражаларды радиандарга айландыруу x3 = (clockCenterX + (sin (бурч) * (clockRadius - (clockRadius / 4)))))); y3 = (clockCenterY - (cos (бурч)) * (clockRadius - (clockRadius / 4)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // дисплей сааттын бурчу = саат () * 30 + int ((мүнөт () / 12) * 6); бурч = (бурч / 57.29577951); // Даражаларды радиандарга айландыруу x3 = (clockCenterX + (sin (бурч) * (clockRadius - (clockRadius / 2)))))); y3 = (clockCenterY - (cos (бурч) * *) clockRadius - (clockRa dius / 2)))); display-> 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 ()); String timenow = String (hour ())+":"+twoDigits (minutes ())+":"+twoDigits (second ()); 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, дата); } void writeTo (int device, byte address, byte val) {Wire.beginTransmission (түзмөк); // Wire.write түзмөгүнө өткөрүүнү баштоо (дарек); // катталуу дарегин жөнөтүү Wire.write (val); // Wire.endTransmission () жазуу үчүн маани жөнөтүү; // берүүнү бүтүрүү} // түзмөктөгү даректерди каттоодон башталган сан байттарды окуйт void readFrom (int device, byte address, int num, byte buff ) {Wire.beginTransmission (device); // Wire.write түзмөгүнө өткөрүүнү баштоо (дарек); // Wire.endTransmission () дан окуу үчүн дарек жөнөтөт; // берүүнү токтотуу Wire.beginTransmission (түзмөк); // Wire.requestFrom түзмөгүнө өткөрүүнү баштоо (түзмөк, сан); // int i = 0 түзмөгүнөн 6 байт сураңыз; while (Wire.available ()) // түзмөк суралгандан азыраак жөнөтө алат (анормалдуу) {buff = Wire.read (); // байт i ++ алуу; } Wire.endTransmission (); // өткөрүп берүүнү токтотуу} void runningFrame (OLEDDisplay*дисплейи, 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 * дисплейи, OLEDDisplayUiState * абалы, int16_t x, int16_t y) {display-> setFont (ArialMT_Plain_16); display-> drawString (60, 45, "маалыматтарды жүктөө …"); } // Бул массив бардык кадрларга функция көрсөткүчтөрүн сактайт // фреймдер FrameCallback фреймдеринде = {analogClockFrame, digitalClockFrame, runningFrame, uploadFrame} жылуучу жалгыз көрүнүштөр; // канча кадр бар? int frameCount = 4; // Кабаттар статикалык түрдө рамканын үстүнө тартылган, мис. бир саат OverlayCallback overlays = {clockOverlay}; int overlaysCount = 1; void uploadToBlynk (void) {if (upload == true) {Blynk.virtualWrite (V0, stepsSum); Blynk.virtualWrite (V1, stepsSum); }} жараксыз uiInit (void) {ui.setTargetFPS (30); //ui.setActiveSymbol(activeSymbol); //ui.setInactiveSymbol(inactiveSymbol); ui.setIndicatorPosition (TOP); ui.setIndicatorDirection (LEFT_RIGHT); ui.setFrameAnimation (SLIDE_LEFT); ui.setFrames (кадрлар, frameCount); ui.setOverlays (катмарлар, overlaysCount); ui.disableAutoTransition (); ui.switchToFrame (2); ui.init (); display.flipScreenVertically (); } void adxl345Init (void) {writeTo (DEVICE, 0x2D, 0); writeTo (DEVICE, 0x2D, 16); writeTo (DEVICE, 0x2D, 8); } void updateAdxl345 (void) {readFrom (DEVICE, regAddress, TO_READ, buff); // 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) {кечигүү (5); if (digitalRead (D2) == LOW) {while (digitalRead (D2) == LOW); кайтаруу POWER_KEY; }} if (digitalRead (D3) == LOW) {delay (5); if (digitalRead (D3) == LOW) {while (digitalRead (D3) == LOW); return MENU_KEY; }} if (digitalRead (D4) == LOW) {delay (5); if (digitalRead (D4) == LOW) {while (digitalRead (D4) == LOW); кайтуу UPLOAD_KEY; }} return 0; } void doKeysFunction (void) {static int uiFrameIndex = 2; int баскычтары = getKeys (); if (key == POWER_KEY) {static char i = 0; if (i) {ui.init (); display.flipScreenVertically (); display.displayOn (); } башка {display.displayOff (); } i = ~ i; } if (key == MENU_KEY) {if (upload == 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 kalanTimeBudget = ui.update (); static int testSum = 0; if ((testSum 0) {delay (kalanTimeBudget);} doKeysFunction (); timer.run ();}

Эскертүү: Wi-Fi жөндөөсүн, паспортту жана AUTHTOKENSти өзүңүзгө өзгөртүшүңүз керек.

char auth = "YourAuthToken"; // Сиздин WiFi грамоталары. // Ачык тармактар үчүн сырсөздү "" деп коюңуз. char ssid = "Сиздин тармактын аталышы"; char pass = "YourPassword";

3 -кадам: Аппараттык туташуу

Аппараттык туташуу
Аппараттык туташуу
Аппараттык туташуу
Аппараттык туташуу
Аппараттык туташуу
Аппараттык туташуу

OLED12864 жана ылдамдатуу модулун I2Cге, түбүн D2, D3, D4ке туташтырыңыз. Мындан тышкары, төмөндө көрсөтүлгөн 3.3Vга жетүү үчүн түбүнө 51k тартма каршылыгын кошуңуз.

Эскертүү: АРЕФке тартылуучу резисторлорду туташтыруу туура эмес, туура 3.3V

Аппараттык ширетүүчү сүрөт, төмөндө көрсөтүлгөн:

Лактан кийин, аппараттык модулду кабыкка чогултуу, төмөндө көрсөтүлгөндөй:

Комплекстүү эффект сүрөтү ~

Сунушталууда: