Taula de continguts:

Com fer un comptador de passos ?: 3 passos (amb imatges)
Com fer un comptador de passos ?: 3 passos (amb imatges)

Vídeo: Com fer un comptador de passos ?: 3 passos (amb imatges)

Vídeo: Com fer un comptador de passos ?: 3 passos (amb imatges)
Vídeo: Сложный случай 😰 Аллергия на гель лак 🤯 Онихолизис ногтей 2024, Juny
Anonim
Image
Image
Creeu un projecte Blynk
Creeu un projecte Blynk

Jo solia tenir un bon rendiment en molts esports: caminar, córrer, anar en bicicleta, jugar a bàdminton, etc.

M’encanta viatjar poc després. Bé, mira el meu ventre corpulent ……

Bé, de totes maneres, decideixo reiniciar per fer exercici. Quin equip he de preparar? A més de les instal·lacions esportives, sí! Necessito un instrument! Crec que amb això puc mantenir la quantitat adequada d'exercici. Aquí es crea l’instrument. Comencem amb un vídeo ~

L’instrument no només pot enregistrar els passos (i les calories) en temps real, sinó que els mostra. El que és especial és que el format de mostrar és punter ~ tan genial! M’agrada molt, molt!

Podeu penjar els vostres registres a Internet

només amb un clic. Blynk (un programari de telèfon intel·ligent introduït abans) pot mostrar tots els registres. Igual que el rellotge intel·ligent que es pot utilitzar, l’instrument posa temps en línia (per tant, no us cal tenir por de l’actualització de la potència i del temps).

Maquinari a meed:

FireBeetle Board-ESP32

FireBeetle Covers-Proto Board

Pantalla desplegable OLED12864

Mòdul d’acceleració

Bateria de 3,7 V (comprada en línia, el volum ronda els 600 mAH)

3 botons (comprats en línia)

És molt convenient construir aquest projecte de Blybk.

Pas 1: creeu un projecte Blynk

Afegiu dos controls:

Visualització de valor * 1

Rellotge en temps real * 1

El nom de Visualització de valors s'ha d'establir en passos, però no s'ha de configurar les propietats del rellotge en temps real. Trieu V1 com a pin d'entrada per ajustar el disseny dels controls, tal com es mostra a continuació.

Pas 2: baixeu programes a FireBeetle Board-ESP32

Feu clic aquí per descarregar el codi font a esp32. El codi font consta de fitxers de biblioteca i fitxers d'impressió 3D. Heu de desar el fitxer de la biblioteca a lib de arduino. I els fitxers 3D poden imprimir crostes directament.

A continuació es mostra el programa principal

#include #include // Només cal per a Arduino 1.6.5 i versions anteriors #include "SSD1306.h" // àlies de `#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; Pantalla SSD1306 (0x3c, 18, 0); OLEDDisplayUi ui (& display); Temporitzador SimpleTimer; WidgetRTC rtc; int pantallaW = 128; pantalla int H = 64; int clockCenterX = screenW / 2; int clockCenterY = ((screenH-16) / 2) +16; // La part groga superior té una alçada de 16 px int clockRadius = 23; #define DEVICE (0x53) // Adreça del dispositiu ADXL345 #define TO_READ (6) // nombre de bytes que llegirem cada vegada (dos bytes per a cada eix) buff byte [TO_READ]; // Memòria intermèdia de 6 bytes per guardar les dades llegides des del dispositiu char str [100]; // memòria intermèdia de cadenes per transformar les dades abans d'enviar-les al port sèrie int regAddress = 0x32; // primer registre de dades d’acceleració d’eixos a l’ADXL345 int xx, yy, zz; // dades d’acceleració de tres eixos estàtiques int currentValue = 0; passos llargs sense signar estàtics Suma = 0; char auth = "YourAuthToken"; // Les vostres credencials de WiFi. // Estableix la contrasenya a "" per a xarxes obertes. char ssid = "El vostre nom de xarxa"; char pass = "La vostra contrasenya"; 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, 0x00, 0x00, 0x00 0xFC, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x60, 0xF1, 0x0x, 0xF8, 0x17, 0x00, 0x00, 0xC0, 0xF8, 0x0F, 0x00, 0x00, 0xE0, 0xFB, 0x17, 0x00, 0x00, 0xC0, 0xFF, 0x13, 0x00, 0x00, 0x00, 0xFF, 0x0x, 0xFE, 0x03, 0x00, 0x00, 0x00, 0xF9, 0x03, 0x00, 0x00, 0x00, 0xFA, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00 0xF4, 0x07, 0x00, 0x00, 0x00, 0xF4, 0x0F, 0x00, 0x00, 0x00, 0xF9, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x80, 0xFE, 0x00x00, 0x00x, 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, 0x0, 0, 0, 0 0x00, 0xC0, 0x01, 0xF0, 0x03, 0x00, 0xC0, 0x03, 0xE8, 0x07, 0x00, 0xC0, 0x03, 0x88, 0x6F, 0x00, 0x80, 0x03, 0x40, 0x1E, 0x0, 0x0, 0x0 0x00, 0x80, 0x03, 0x00, 0xF8, 0x01, 0x00, 0x07, 0x00, 0xF4, 0x00, 0x00, 0x07, 0x00, 0xE8, 0x00, 0x80, 0x0F, 0x00, 0xE8, 0x00, 0x0, 0x0, 0x0, 0x0, 0x0 0x00, 0xE8, 0x0F, 0x00, 0xE8, 0x00, 0xF0, 0x09, 0x00, 0x60, 0x01, 0xF0, 0x04, 0x00, 0x00, 0x00,}; // funció d’utilitat per a la visualització del rellotge digital: imprimeix la primera cadena 0 String twoDigits (dígits int) {if (dígits <10) {String i = '0' + String (dígits); tornar i; } else {return String (dígits); }} void clockOverlay (pantalla OLEDDisplay *, estat OLEDDisplayUiState *) {if ((hour () == 0) && (minute () == 0) && (second () == 0)) stepsSum = 0; } void analogClockFrame (pantalla OLEDDisplay *, estat OLEDDisplayUiState *, int16_t x, int16_t y) {display-> drawCircle (clockCenterX + x, clockCenterY + y, 2); // horaris per a (int z = 0; z drawLine (x2 + x, y2 + y, x3 + x, y3 + y);} // mostrar l'angle flotant de segona mà = segon () * 6; angle = (angle / 57.29577951); // Converteix els graus en radians 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); // visualització angle minuteta minut = minut () * 6; angle = (angle / 57.29577951); // Converteix els graus en radians x3 = (clockCenterX + (sin (angle) * (clockRadius - (clockRadius / 4)))); y3 = (clockCenterY - (cos (angle) * (clockRadius - (clockRadius / 4)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // display angle de la mà de l’hora = hour () * 30 + int ((minute () / 12) * 6); angle = (angle / 57.29577951); // Converteix els graus en radians x3 = (clockCenterX + (sin (angle) * (clockRadius - (clockRadius / 2)))); y3 = (clockCenterY - (cos (angle) * { clockRadius - (clockRa dius / 2)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); } void digitalClockFrame (pantalla OLEDDisplay *, estat OLEDDisplayUiState *, int16_t x, int16_t y) {Data de cadena = Cadena (any ()) + "/" + twoDigits (month ()) + "/" + twoDigits (day ()); String timenow = String (hour ()) + ":" + twoDigits (minute ()) + ":" + 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, data); } void writeTo (dispositiu int, adreça de byte, byte val) {Wire.beginTransmission (dispositiu); // iniciar la transmissió al dispositiu Wire.write (adreça); // enviar l'adreça de registre Wire.write (val); // enviar valor per escriure Wire.endTransmission (); // finalitzar la transmissió} // llegeix un nombre de bytes a partir del registre d'adreces del dispositiu a la matriu buff buida readFrom (dispositiu int, adreça byte, int num, buff byte ) {Wire.beginTransmission (dispositiu); // iniciar la transmissió al dispositiu Wire.write (adreça); // envia l'adreça per llegir-la des de Wire.endTransmission (); // finalitzar la transmissió Wire.beginTransmission (dispositiu); // iniciar la transmissió al dispositiu Wire.requestFrom (dispositiu, num); // sol·liciteu 6 bytes del dispositiu int i = 0; mentre que (Wire.available ()) // el dispositiu pot enviar menys del que es demana (anormal) {buff = Wire.read (); // rebre un byte i ++; } Wire.endTransmission (); // finalitzar la transmissió} void runningFrame (pantalla OLEDDisplay *, estat 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 (pantalla OLEDDisplay *, estat OLEDDisplayUiState *, int16_t x, int16_t y) {display-> setFont (ArialMT_Plain_16); display-> drawString (60, 45, "puja dades …"); } // Aquesta matriu manté els indicadors de funció a tots els marcs // els marcs són les visualitzacions individuals que es llisquen als marcs FrameCallback = {analogClockFrame, digitalClockFrame, runningFrame, uploadFrame}; // quants fotogrames hi ha? int FrameCount = 4; // Les superposicions es dibuixen estàticament sobre un marc, per exemple. a clock 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 (frames, frameCount); ui.setOloverlays (overlays, overlaysCount); ui.disableAutoTransition (); ui.switchToFrame (2); ui.init (); display.flipScreenVertically (); } void adxl345Init (void) {writeTo (DISPOSITIU, 0x2D, 0); writeTo (DISPOSITIU, 0x2D, 16); writeTo (DISPOSITIU, 0x2D, 8); } void updateAdxl345 (void) {readFrom (DEVICE, regAddress, TO_READ, buff); // llegiu les dades d'acceleració de l'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 <ValorValent) {stepsSum ++; } Valor actual = xx; } sprintf (str, "% d", stepsSum); } int getKeys (void) {if (digitalRead (D2) == BAIX) {delay (5); if (digitalRead (D2) == BAIX) {while (digitalRead (D2) == BAIX); torna POWER_KEY; }} if (digitalRead (D3) == BAIX) {delay (5); if (digitalRead (D3) == BAIX) {while (digitalRead (D3) == BAIX); torna MENU_KEY; }} if (digitalRead (D4) == BAIX) {delay (5); if (digitalRead (D4) == BAIX) {while (digitalRead (D4) == BAIX); torna UPLOAD_KEY; }} retorn 0; } void doKeysFunction (void) {static int uiFrameIndex = 2; claus int = getKeys (); if (keys == POWER_KEY) {static char i = 0; if (i) {ui.init (); display.flipScreenVertically (); display.displayOn (); } else {display.displayOff (); } i = ~ i; } if (claus == MENU_KEY) {if (penjar == fals) {uiFrameIndex ++; if (uiFrameIndex == 3) uiFrameIndex = 0; ui.switchToFrame (uiFrameIndex); } else {ui.switchToFrame (3); }} if (claus == 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); } bucle buit () {int restantTempsBudget = ui.update (); static int testSum = 0; if ((testSum 0) {delay (restantTimeBudget);} doKeysFunction (); timer.run ();}

Precaució: heu de modificar la configuració de Wi-Fi, el passaport i AUTHTOKENS.

char auth = "YourAuthToken"; // Les vostres credencials de WiFi. // Estableix la contrasenya a "" per a xarxes obertes. char ssid = "El vostre nom de xarxa"; char pass = "La vostra contrasenya";

Pas 3: connexió de maquinari

Connexió de maquinari
Connexió de maquinari
Connexió de maquinari
Connexió de maquinari
Connexió de maquinari
Connexió de maquinari

Connecteu OLED12864 i el mòdul d’acceleració a I2C, els fons a D2, D3, D4. A més, afegiu resistències de tracció de 51 k als fons per arribar a 3,3 V, tal i com es mostra a continuació.

Precaució: és incorrecte connectar resistències de tracció a AREF; la correcta és a 3,3 V.

La imatge de soldadura de maquinari, que es mostra a continuació:

Després de la soldadura, muntatge del mòdul de maquinari a l'escorça, que es mostra a continuació:

Imatge d'efecte integral ~

Recomanat: