Taula de continguts:
- Pas 1: creeu un projecte Blynk
- Pas 2: baixeu programes a FireBeetle Board-ESP32
- Pas 3: connexió de maquinari
Vídeo: Com fer un comptador de passos ?: 3 passos (amb imatges)
2024 Autora: John Day | [email protected]. Última modificació: 2024-01-30 08:11
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
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:
Comptador de freqüències amb Arduino: 8 passos (amb imatges)
Comptador de freqüències amb Arduino: és un comptador de freqüències basat en arduino senzill i barat que costa menys de 4 $, ha estat molt útil per mesurar circuits petits
Comptador de subscriptors de YouTube amb pantalla de paper electrònic i Raspberry Pi Zero W: 5 passos (amb imatges)
Comptador de subscriptors de YouTube mitjançant una pantalla de paper electrònic i Raspberry Pi Zero W: en aquest manual, us mostraré com crear el vostre propi comptador de subscriptors de YouTube mitjançant una pantalla de paper electrònic i un Raspberry Pi Zero W per consultar l'API de YouTube i actualitzeu la pantalla. Les pantalles de paper electrònic són ideals per a aquest tipus de projectes, ja que tenen
Comptador Geiger de treball amb parts mínimes: 4 passos (amb imatges)
Funcionament del comptador Geiger W / Minimal Parts: Heus aquí, que jo sàpiga, el comptador Geiger de funcionament més senzill que podeu construir. Aquest utilitza un tub Geiger de fabricació russa SMB-20, accionat per un circuit de pujada d’alta tensió robat per un fly swatch electrònic. Detecta partícules beta i gam
Comptador de monedes amb Makey-Makey i Scratch: 10 passos (amb imatges)
Comptador de monedes amb Makey-Makey i Scratch: comptar diners és una habilitat pràctica matemàtica molt important que fem servir a la nostra vida diària. Apreneu a programar i construir un comptador de monedes amb Makey-Makey i Scratch
Com fer un comptador amb Microbit ?: 9 passos
Com fer un comptador amb Microbit ?: Quan hem pujat a l’avió, sovint ens trobem amb una situació com aquesta: una bonica hostessa que porta una petita capsa de plata continua pressionant-la mentre passa per allà. Ella està murmurant: 1,2,3,4,5,6 …… Ho heu d’endevinar: està comptant el nombre total de