Spisu treści:

Jak zrobić licznik kroków?: 3 kroki (ze zdjęciami)
Jak zrobić licznik kroków?: 3 kroki (ze zdjęciami)

Wideo: Jak zrobić licznik kroków?: 3 kroki (ze zdjęciami)

Wideo: Jak zrobić licznik kroków?: 3 kroki (ze zdjęciami)
Wideo: Jak regulować ogrzewanie podłogowe 2024, Czerwiec
Anonim
Image
Image
Utwórz projekt Blynk
Utwórz projekt Blynk

Dobrze wypadałem w wielu sportach: chodzeniu, bieganiu, jeżdżeniu na rowerze, grze w badmintona itp.

Uwielbiam jeździć i podróżować po okolicy. Cóż, spójrz na mój korpulentny brzuch……

Cóż, w każdym razie postanawiam wznowić ćwiczenia. Jaki sprzęt powinienem przygotować? Poza obiektem sportowym tak! Potrzebuję instrumentu! Wierzę, że dzięki temu uda mi się utrzymać odpowiednią ilość ruchu. Tutaj instrument powstaje. Zacznijmy od wideo~

Przyrząd nie tylko może rejestrować kroki (i kalorie) w czasie rzeczywistym, ale także pokazywać czas. Wyjątkowe jest to, że format pokazu jest wskaźnikowy~ tak fajny! Naprawdę, naprawdę to lubię!

Możesz przesłać swoje rekordy do Internetu

tylko jednym kliknięciem. Wszystkie rekordy mogą być wyświetlane przez Blynk (oprogramowanie na smartfony wprowadzone wcześniej). Tak samo jak inteligentny zegarek do noszenia, instrument otrzymuje czas online (więc nie musisz się obawiać aktualizacji mocy i czasu).

Sprzęt w meed:

Płyta FireBeetle-ESP32

FireBeetle Covers-Proto Board

Ekran wyświetlacza OLED12864

Moduł przyspieszenia

Bateria 3,7 V (kupiona online, objętość wynosi około 600 mAh)

3 guziki (kupione online)

Budowanie tego projektu przez Blybk jest bardzo wygodne.

Krok 1: Utwórz projekt Blynk

Dodaj dwie kontrolki:

Wyświetlanie wartości * 1

Zegar czasu rzeczywistego * 1

Nazwa wyświetlania wartości powinna być ustawiona na kroki, ale bez ustawień właściwości zegara czasu rzeczywistego. Wybierz V1 jako pin wejściowy, aby dostosować układ elementów sterujących, jak pokazano poniżej.

Krok 2: Pobierz programy na płytkę FireBeetle-ESP32

Kliknij tutaj, aby pobrać kod źródłowy do esp32. Kod źródłowy składa się z plików bibliotek i plików do drukowania 3D. Powinieneś zapisać plik biblioteki do lib arduino. A pliki 3D mogą bezpośrednio drukować skórki.

Poniżej znajduje się główny program

#include #include // Wymagane tylko dla Arduino 1.6.5 i wcześniejszych #include "SSD1306.h" // alias dla `#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; Wyświetlacz SSD1306 (0x3c, 18, 0); Interfejs użytkownika OLEDDisplayUi (&wyświetlacz); Zegar SimpleTimer; WidgetRTC RTC; ekran intW = 128; ekran wewnętrznyH = 64; int clockCenterX = screenW/2; int clockCenterY = ((screenH-16)/2)+16; // górna żółta część ma wysokość 16 px int clockRadius = 23; #define DEVICE (0x53) //adres urządzenia ADXL345 #define TO_READ (6) //liczba bajtów, które będziemy czytać za każdym razem (dwa bajty na każdą oś) byte buff[TO_READ]; //6 bajtów bufor do zapisywania danych odczytanych z urządzenia char str[100]; //bufor łańcuchowy do przekształcenia danych przed wysłaniem ich do portu szeregowego int regAddress = 0x32; //pierwszy rejestr danych przyspieszenia osi na ADXL345 int xx, yy, zz; //dane przyspieszenia w trzech osiach static int currentValue = 0; static unsigned long stepsSum=0; char auth = "TwójTokenAuth"; // Twoje dane logowania do Wi-Fi. // Ustaw hasło na „” dla otwartych sieci. char ssid = "NazwaTwojejSieci"; char pass = "TwojeHasło"; 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, 0x 0xFC, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x60, 0xF1, 0x07, 0x00, 0x 0xF8, 0x17, 0x00, 0x00, 0xC0, 0xF8, 0x0F, 0x00, 0x00, 0xE0, 0xFB, 0x17, 0x00, 0x00, 0xC0, 0xFF, 0x13, 0x00, 0x00, 0x00, 0xFF, 0x, 003, 0x 0xFE, 0x03, 0x00, 0x00, 0x00, 0xF9, 0x03, 0x00, 0x00, 0x00, 0xFA, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x 0xF4, 0x07, 0x00, 0x00, 0x00, 0xF4, 0x0F, 0x00, 0x00, 0x00, 0xF9, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x80, 0xFE, 0x1F, 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, 0xE01 0x00, 0xC0, 0x01, 0xF0, 0x03, 0x00, 0xC0, 0x03, 0xE8, 0x07, 0x00, 0xC0, 0x03, 0x88, 0x6F, 0x00, 0x80, 0x03, 0x40, 0x1E, 0x00, 0xA0,0,40 0x00, 0x80, 0x03, 0x00, 0xF8, 0x01, 0x00, 0x07, 0x00, 0xF4, 0x00, 0x00, 0x07, 0x00, 0xE8, 0x00, 0x80, 0x0F, 0x00, 0xE8, 0x00, 0xE0, 0x0F 0x00, 0xE8, 0x0F, 0x00, 0xE8, 0x00, 0xF0, 0x09, 0x00, 0x60, 0x01, 0xF0, 0x04, 0x00, 0x00, 0x00, }; // funkcja narzędziowa do wyświetlania zegara cyfrowego: wypisuje początek 0 String twoDigits(int digitals){ if(digits <10) { String i = '0'+String(digits); powrót ja; } else { return String(cyfry); } } void clockOverlay(OLEDDisplay *display, OLEDDisplayUiState* state) { if((hour()==0) && (minute()==0) && (second()==0)) stepsSum = 0; } void analogClockFrame(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { display->drawCircle(clockCenterX + x, clockCenterY + y, 2); //godzina tyka for(int z=0; z drawLine(x2 + x, y2 + y, x3 + x, y3 + y); } // wyświetl z drugiej ręki float angle = second() * 6; angle = (angle / 57.29577951); //Konwertuj stopnie na radiany int x3 = (clockCenterX + (sin(angle) * (clockRadius - (clockRadius / 5)))); int y3 = (clockCenterY - (cos(angle) * (clockRadius - (clockRadius / 5)))); display->drawLine(clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // wyświetl kąt wskazówki minutowej = minuta() * 6; kąt = (kąt / 57.29577951); //Konwertuj stopnie na radiany x3 = (clockCenterX + (sin(angle) * (clockRadius - (clockRadius / 4)))); y3 = (clockCenterY - (cos(angle) * (clockRadius - (clockRadius / 4)))); display->drawLine(clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // wyświetl kąt wskazówki godzinowej = hour() * 30 + int((minute() / 12) * 6); angle = (angle / 57.29577951); //Konwertuj stopnie na radiany x3 = (clockCenterX + (sin(angle) * (clockRadius - (clockRadius / 2)))); y3 = (clockCenterY - (cos(angle) * (Promień zegara - (zegarRa dius / 2)))); display->drawLine(ClockCenterX + x, clockCenterY + y, x3 + x, y3 + y); } void digitalClockFrame(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { String date = String(year())+"/"+twoDigits(month())+"/"+twoDigits(day()); String timenow = String(hour())+":"+twoDigits(minute())+":"+twoDigits(second()); wyświetl->setTextAlignment(TEXT_ALIGN_CENTER); wyświetl->setFont(ArialMT_Plain_24); display->drawString(clockCenterX + x, 20, timenow); wyświetl->setFont(ArialMT_Plain_16); display->drawString(60, 45, data); } void writeTo(int device, byte address, byte val) { Wire.beginTransmission(device); //rozpocznij transmisję do urządzenia Wire.write(adres); // wyślij adres rejestru Wire.write(val); // wyślij wartość do zapisu Wire.endTransmission(); //koniec transmisji } //odczytuje liczbę bajtów począwszy od rejestru adresowego na urządzeniu do tablicy buff void readFrom(int device, byte address, int num, byte buff) { Wire.beginTransmission(device); //rozpocznij transmisję do urządzenia Wire.write(adres); //wysyła adres do odczytu z Wire.endTransmission(); //koniec transmisji Wire.beginTransmission(urządzenie); //rozpocznij transmisję do urządzenia Wire.requestFrom(device, num); // zażądaj 6 bajtów od urządzenia int i = 0; while(Wire.available()) //urządzenie może wysłać mniej niż żądano (nienormalne) { buff= Wire.read(); // odbierz bajt i++; } Wire.endTransmission(); //zakończ transmisję } void runningFrame(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { float calValue = stepsSum*0.4487; wyświetl->setTextAlignment(TEXT_ALIGN_CENTER); wyświetl->setFont(ArialMT_Plain_24); display->drawString(ClockCenterX, clockCenterY, str); sprintf(str, "%.2fcal", calValue); wyświetl->setTextAlignment(TEXT_ALIGN_CENTER); wyświetl->setFont(ArialMT_Plain_10); display->drawString(100, 20, str); display->drawXbm(10, 14, 34, 50, running_Logo_bits); } void uploadFrame(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { display->setFont(ArialMT_Plain_16); display->drawString(60, 45, "prześlij dane…"); } // Ta tablica przechowuje wskaźniki funkcji do wszystkich ramek // ramki są pojedynczymi widokami, które przesuwają się w FrameCallback frames = { analogClockFrame, digitalClockFrame, runningFrame, uploadFrame}; // ile jest ramek? int liczba ramek = 4; // Nakładki są rysowane statycznie na górze ramki, np. zegar OverlayCallback overlays = { 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(ramki, liczba ramek); ui.setOverlays(overlays, overlaysCount); ui.disableAutoTransition(); ui.switchToFrame(2); ui.init(); display.flipScreenPionowo(); } void adxl345Init(void){ writeTo(URZĄDZENIE, 0x2D, 0); writeTo(URZĄDZENIE, 0x2D, 16); writeTo(URZĄDZENIE, 0x2D, 8); } void updateAdxl345(void){ readFrom(URZĄDZENIE, regAddress, TO_READ, buff); //odczytaj dane przyspieszenia z ADXL345 xx = (((int)buff[1]) << 8) | wzmocnienie[0]; yy = (((int)wzmocnienie[3])<< 8) | wzmocnienie[2]; zz = (((int)wzmocnienie[5]) << 8) | wzmocnienie[4]; if (xx 80) { if (xx < aktualna wartość) { suma kroków++; } bieżącaWartość = xx; } sprintf(str, "%d", stepsSum); } int getKeys (void) { if (digitalRead (D2) == LOW) { delay(5); if(digitalRead(D2) == NISKA){ while(digitalRead(D2) ==NISKA); powrót POWER_KEY; } } if(digitalRead(D3) == LOW){ delay(5); if(digitalRead(D3) == NISKI){ while(digitalRead(D3) ==NISKI); zwróć MENU_KEY; } } if(digitalRead(D4) == LOW){ delay(5); if(digitalRead(D4) == NISKI){ while(digitalRead(D4) ==NISKI); zwróć UPLOAD_KEY; } } return 0; } void doKeysFunction(void){ static int uiFrameIndex = 2; int klucze = getKeys(); if(keys == POWER_KEY){ static char i = 0; if(i){ui.init(); display.flipScreenPionowo(); display.displayOn(); }else{ display.displayOff(); } i = ~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{ prześlij = prawda; ui.switchToFrame(3); } } } void setup() { pinMode(D2, INPUT); pinMode(D3, WEJŚCIE); pinMode(D4, WEJŚCIE); Blynk.begin(auth, ssid, pass); rtc.początek(); uiInit(); adxl345Init(); timer.setInterval(30, updateAdxl345); timer.setInterval(100, uploadToBlynk); } void loop() { int pozostalyBudgetCzasu = ui.update(); statyczna int sumatestów = 0; if((testSum 0) { delay(remainingTimeBudget); } doKeysFunction(); timer.run(); }

Uwaga: należy zmienić ustawienia Wi-Fi, paszport i AUTOMATYKI dla siebie.

char auth = "TwójTokenAuth"; // Twoje dane logowania do Wi-Fi. // Ustaw hasło na „” dla otwartych sieci. char ssid = "NazwaTwojejSieci"; char pass = "TwojeHasło";

Krok 3: Połączenie sprzętowe

Połączenie sprzętowe
Połączenie sprzętowe
Połączenie sprzętowe
Połączenie sprzętowe
Połączenie sprzętowe
Połączenie sprzętowe

Podłącz OLED12864 i moduł akceleracyjny do I2C, dno do D2, D3, D4. Co więcej, dodaj rezystory podciągające 51k do spodu, aby osiągnąć napięcie 3,3 V, jak pokazano poniżej.

Uwaga: Błędne jest podłączenie rezystorów podciągających do AREF, właściwy to 3,3V

Obraz lutowania sprzętowego, pokazany poniżej:

Po lutowaniu montaż modułu sprzętowego do skorupy, pokazany poniżej:

Kompleksowy obraz efektu~

Zalecana: