Мазмұны:

Қадамдық есептегішті қалай жасауға болады?: 3 қадам (суреттермен)
Қадамдық есептегішті қалай жасауға болады?: 3 қадам (суреттермен)
Anonim
Image
Image
Blynk жобасын жасаңыз
Blynk жобасын жасаңыз

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

Мен көп ұзамай саяхаттауды жақсы көремін. Ал, менің қарынға қарашы …….

Қалай болғанда да, мен жаттығуды қайта бастауды шештім. Мен қандай жабдықты дайындауым керек? Спорт кешенінен басқа, иә! Маған құрал керек! Менің ойымша, мен жаттығулардың тиісті мөлшерін сақтай аламын. Мұнда құрал пайда болады. Бейнеден бастайық ~

Құрал нақты уақыт режимінде қадамдарды (және калорияларды) жазып қана қоймайды, сонымен қатар уақытты көрсетеді. Ерекшелігі - көрсету форматы көрсеткіш - өте керемет! Маған шынымен, қатты ұнайды!

Сіз жазбаларды Интернетке жүктей аласыз

тек бір шерту арқылы. Барлық жазбаларды Blynk (бұрын енгізілген смартфондық бағдарламалық жасақтама) көрсете алады. Тақиялы ақылды сағаттар сияқты, құрал да уақытты алады (сондықтан қуат пен уақытты жаңартудан қорқудың қажеті жоқ).

Аппараттық құралдар:

FireBeetle тақтасы-ESP32

FireBeetle қақпақтары-Proto тақтасы

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

Жеделдету модулі

3.7В аккумулятор (Интернет арқылы сатып алынады, көлемі 600 мАч шамасында.

3 бөтелке (Интернеттен сатып алынды)

Бұл жобаны Blybk құру өте ыңғайлы.

1 -қадам: Blynk жобасын жасаңыз

Екі басқару элементін қосыңыз:

Мәнді көрсету * 1

Нақты уақыттағы сағат * 1

Мәнді көрсету атауы қадамдарға орнатылуы керек, бірақ нақты уақыттағы сағаттардың параметрлері жоқ. Төменде көрсетілген басқару элементтерінің орналасуын реттеу үшін кіріс түйреуіші ретінде V1 таңдаңыз.

2-қадам: Бағдарламаларды FireBeetle Board-ESP32-ге жүктеңіз

Бастапқы кодты esp32 -ге жүктеу үшін мына жерді басыңыз. Бастапқы код кітапхана файлдарынан және 3D басып шығару файлдарынан тұрады. Кітапхана файлын arduino lib -ге сақтау керек. Ал 3D файлдар қабықты тікелей басып шығара алады.

Негізгі бағдарлама төменде

#include #include // Arduino 1.6.5 және одан бұрынғы нұсқалар үшін ғана қажет қосу #қосу #қосу #қосу #қосу #анықтау POWER_KEY 1 #MENU_KEY 2 анықтау #ЖҮКТЕУ_КІЛТІН анықтау 3 логикалық жүктеу = жалған; SSD1306 дисплейі (0x3c, 18, 0); OLEDDisplayUi интерфейсі (& көрсету); 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]; // char str [100] құрылғысынан оқылған деректерді сақтауға арналған 6 байтты буфер; // int regAddress = 0x32 сериялық портқа жібермес бұрын деректерді түрлендіру үшін жол буфері; // ADXL345 int xx, yy, zz бойынша бірінші ось-акселерация-мәліметтер регистрі; // үш осьтік жеделдету деректері static int currentValue = 0; статикалық белгісіз ұзақ қадамдарSum = 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 0xF8, 0x01, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xFC, 0x01, 0x00, 0x00, 0x00, 0xFC, 0x05, 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, 0x00, 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'+Жол (цифрлар); қайтару i; } else {return String (цифрлар); }} 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 + (sin (бұрыш) * (clockRadius - (clockRadius / 5)))))); int y3 = (clockCenterY - (cos (бұрыш)) * (clockRadius - (clockRadius / 5)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // дисплейдің минуттық бұрышы = минут () * 6; бұрыш = (бұрыш / 57.29577951); // Дәрежелерді радиандарға түрлендіру 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 = Жол (сағат ())+«:»+екі сан (минут ())+«:»+екі сан (екінші ()); 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 () жазу үшін мән жіберіңіз; // беруді аяқтау} // құрылғыдағы мекенжай регистрінен бастап сан байттарын оқиды: readFrom void массивіне (int device, byte address, int num, byte buff ) {Wire.beginTransmission (құрылғы); // 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 сағаттары = {clockOverlay}; int overlaysCount = 1; void uploadToBlynk (void) {if (upload == true) {Blynk.virtualWrite (V0, stepsSum); Blynk.virtualWrite (V1, stepsSum); }} 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 (кадрлар, frameCount); ui.setOverlays (қабаттасулар, қабаттасулар саны); 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) | буф [2]; zz = (((int) buff [5]) << 8) | буф [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); қайтару MENU_KEY; }} if (digitalRead (D4) == LOW) {delay (5); if (digitalRead (D4) == LOW) {while (digitalRead (D4) == LOW); UPLOAD_KEY қайтару; }} қайтару 0; } void doKeysFunction (void) {static int uiFrameIndex = 2; int пернелері = getKeys (); if (key == POWER_KEY) {static char i = 0; егер (i) {ui.init (); display.flipScreenVertically (); display.displayOn (); } басқа {display.displayOff (); } i = ~ i; } if (key == MENU_KEY) {if (upload == false) {uiFrameIndex ++; егер (uiFrameIndex == 3) uiFrameIndex = 0; ui.switchToFrame (uiFrameIndex); } басқа {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 параметрін, төлқұжатты және авторлық құқықтарды өзіңіз өзгертуіңіз керек.

char auth = «YourAuthToken»; // Сіздің WiFi тіркелгі деректеріңіз. // Ашық желілер үшін құпия сөзді «» қойыңыз. char ssid = «Сіздің желі атыңыз»; char pass = «YourPassword»;

3 -қадам: аппараттық қосылым

Аппараттық қосылым
Аппараттық қосылым
Аппараттық қосылым
Аппараттық қосылым
Аппараттық қосылым
Аппараттық қосылым

OLED12864 пен үдеткіш модулін I2C -ке, төменгі бөлігін D2, D3, D4 -ке қосыңыз. Сонымен қатар, төменде көрсетілгендей 3.3В жету үшін түбіне 51k тартылатын резисторларды қосыңыз.

Абайлаңыз: тартқыш резисторларды AREF-ке қосу дұрыс емес, дұрыс 3.3В

Аппараттық дәнекерлеу кескіні төменде көрсетілген:

Дәнекерлеуден кейін аппараттық модульді қыртысқа жинау, төменде көрсетілген:

Кешенді әсерлі сурет ~

Ұсынылған: