Spisu treści:
- Krok 1: Utwórz projekt Blynk
- Krok 2: Pobierz programy na płytkę FireBeetle-ESP32
- Krok 3: Połączenie sprzętowe
Wideo: Jak zrobić licznik kroków?: 3 kroki (ze zdjęciami)
2024 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2024-01-30 11:27
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
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:
Jak odczytać licznik energii elektrycznej za pomocą Arduino: 3 kroki
Jak odczytać licznik energii elektrycznej za pomocą Arduino: Często warto poznać aktualne zużycie energii lub całkowite zużycie energii w domu, aby ograniczyć koszty energii elektrycznej i chronić środowisko. To naprawdę nie jest problem, ponieważ w większości znajdziesz inteligentny cyfrowy el
Licznik kroków - Micro:Bit: 12 kroków (ze zdjęciami)
Licznik kroków - Micro:Bit: Ten projekt będzie licznikiem kroków. Do pomiaru kroków użyjemy czujnika przyspieszenia wbudowanego w Micro:Bit. Za każdym razem, gdy Micro:Bit się trzęsie, dodamy 2 do licznika i wyświetlimy go na ekranie
Jak zrobić licznik monet: 3 kroki
Jak zrobić licznik monet: Ta instrukcja opisuje, jak stworzyć licznik monet skarbonki za pomocą GreenPAK ™. Licznik skarbonki będzie wykorzystywał trzy podstawowe elementy: GreenPAK SLG46531V: GreenPAK służy jako tłumacz między czujnikami a wyświetlaczem
Jak zrobić licznik za pomocą Microbit?: 9 kroków
Jak zrobić ladę z Microbitem?: Kiedy wsiadamy do samolotu, często spotykamy się z taką sytuacją: piękna stewardesa niosąca małe srebrne pudełeczko naciska je, przelatując obok. Ona mruczy: 1,2,3,4,5,6… Musisz się domyślić - liczy całkowitą liczbę
Jak zrobić kalendarz dziadków & Notatnik (nawet jeśli nie wiesz, jak to zrobić): 8 kroków (ze zdjęciami)
Jak zrobić kalendarz dziadków & Notatnik (nawet jeśli nie wiesz jak to zrobić): To bardzo ekonomiczny (i bardzo ceniony!) prezent świąteczny dla dziadków. W tym roku zrobiłem 5 kalendarzy za mniej niż 7 USD każdy.Materiały:12 wspaniałych zdjęć Twojego dziecka, dzieci, siostrzenic, siostrzeńców, psów, kotów lub innych krewnych 12 różnych elementów