Sommario:

Come fare un contapassi?: 3 passaggi (con immagini)
Come fare un contapassi?: 3 passaggi (con immagini)

Video: Come fare un contapassi?: 3 passaggi (con immagini)

Video: Come fare un contapassi?: 3 passaggi (con immagini)
Video: Il CONTAPASSI (Ranger Beads): utilizzo di base | Land Navigation 2024, Dicembre
Anonim
Image
Image
Crea un progetto Blynk
Crea un progetto Blynk

Mi esibivo bene in molti sport: camminare, correre, andare in bicicletta, giocare a badminton ecc.

Mi piace andare in giro per viaggiare in poco tempo. Bene, guarda la mia pancia corpulenta……

Bene, comunque, decido di ricominciare ad allenarmi. Che attrezzatura devo preparare? Oltre all'impianto sportivo, sì! mi serve uno strumento! Credo che con esso, posso mantenere una quantità adeguata di esercizio. Qui nasce lo strumento. Cominciamo con un video~

Lo strumento non solo può registrare passi (e calorie) in tempo reale, ma mostra il tempo. La cosa speciale è che il formato di visualizzazione è il puntatore~ così bello! Mi piace davvero molto!

Puoi caricare i tuoi record su Internet

solo con un clic. Tutti i record possono essere visualizzati da Blynk (un software per smartphone introdotto in precedenza). Lo stesso dell'orologio intelligente indossabile, lo strumento ottiene il tempo in linea (quindi non devi aver paura della potenza e dell'aggiornamento dell'ora).

Hardware in media:

FireBeetle Board-ESP32

FireBeetle Covers-Proto Board

Schermo di visualizzazione OLED12864

Modulo di accelerazione

Batteria da 3,7 V (acquistata online, il volume è di circa 600 mAH)

3 bottoni (acquistati online)

È molto conveniente costruire questo progetto di Blybk.

Passaggio 1: crea un progetto Blynk

Aggiungi due controlli:

Visualizzazione valore * 1

Orologio in tempo reale * 1

Il nome di Visualizzazione valore deve essere impostato su passi, ma nessuna impostazione per le proprietà dell'orologio in tempo reale. Scegli V1 come pin di input per regolare il layout dei controlli, mostrato come di seguito.

Passaggio 2: scarica i programmi su FireBeetle Board-ESP32

Fare clic qui per scaricare il codice sorgente su esp32. Il codice sorgente è costituito da file di libreria e file di stampa 3D. Dovresti salvare il file della libreria nella lib di arduino. E i file 3D possono stampare direttamente le croste.

Di seguito il programma principale

#include #include // Necessario solo per Arduino 1.6.5 e versioni precedenti #include "SSD1306.h" // alias per `#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 booleano upload = false; Display SSD1306 (0x3c, 18, 0); OLEDDisplayUi ui (&display); Timer semplice; WidgetRTC rtc; int schermoW = 128; int schermoH = 64; int clockCenterX = schermoW/2; int clockCenterY = ((screenH-16)/2)+16; // la parte gialla superiore è di 16 px di altezza int clockRadius = 23; #define DEVICE (0x53) //ADXL345 device address #define TO_READ (6) //num di byte che andremo a leggere ogni volta (due byte per ogni asse) byte buff[TO_READ]; //6 byte buffer per il salvataggio dei dati letti dal dispositivo char str[100]; //stringa buffer per trasformare i dati prima di inviarli alla porta seriale int regAddress = 0x32; //primo registro dati di accelerazione dell'asse sull'ADXL345 int xx, yy, zz; //dati di accelerazione a tre assi static int currentValue = 0; statico senza segno lungo stepsSum=0; char auth = "YourAuthToken"; // Le tue credenziali WiFi. // Imposta la password su "" per le reti aperte. char ssid = "NomeRete"; char pass = "Password"; 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, 0x 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, 0x03, 0x00 0xFE, 0x03, 0x00, 0x00, 0x00, 0xF9, 0x03, 0x00, 0x00, 0x00, 0xFA, 0x03, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x 0xF4, 0x07, 0x00, 0x00, 0x00, 0xF4, 0x0F, 0x00, 0x00, 0x00, 0xF9, 0x0F, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x80, 0xFE, 0x1F, 0x 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, 0xF0,0 0x00, 0xC0, 0x01, 0xF0, 0x03, 0x00, 0xC0, 0x03, 0xE8, 0x07, 0x00, 0xC0, 0x03, 0x88, 0x6F, 0x00, 0x80, 0x03, 0x40, 0x1E, 0x00, 0xA, 0, 0x00, 0x80, 0x03, 0x00, 0xF8, 0x01, 0x00, 0x07, 0x00, 0xF4, 0x00, 0x00, 0x07, 0x00, 0xE8, 0x00, 0x80, 0x0F, 0x00, 0xE8, 0x00, 0x90, 0xE 0x00, 0xE8, 0x0F, 0x00, 0xE8, 0x00, 0xF0, 0x09, 0x00, 0x60, 0x01, 0xF0, 0x04, 0x00, 0x00, 0x00, }; // funzione di utilità per la visualizzazione dell'orologio digitale: stampa lo 0 iniziale String twoDigits(int digits){ if(digits <10) { String i = '0'+String(digits); ritorno io; } else { return String(cifre); } } 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); //scatti orari for(int z=0; z drawLine(x2 + x, y2 + y, x3 + x, y3 + y); } // visualizza l'angolo mobile della lancetta dei secondi = second() * 6; angolo = (angolo / 57.29577951; //Converti gradi in radianti 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); // visualizza la lancetta dei minuti angolo = minute() * 6; angolo = (angolo / 57.29577951); //Converti gradi in radianti x3 = (clockCenterX + (sin(angle) * (clockRadius - (clockRadius / 4)))); y3 = (clockCenterY - (cos(angle) * (clockRadius - (clockRadius / 4)))); display->drawLine(clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // visualizza l'angolo della lancetta delle ore = hour() * 30 + int((minute() / 12) * 6); angle = (angle / 57.29577951); //Converti gradi in radianti 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(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()); 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(int device, byte address, byte val) { Wire.beginTransmission(device); //avvia la trasmissione al dispositivo Wire.write(address); // invia l'indirizzo del registro Wire.write(val); // invia il valore per scrivere Wire.endTransmission(); //fine trasmissione } //legge num byte a partire dal registro degli indirizzi sul dispositivo nell'array buff void readFrom(int device, byte address, int num, byte buff) { Wire.beginTransmission(device); //avvia la trasmissione al dispositivo Wire.write(address); //invia l'indirizzo da leggere da Wire.endTransmission(); //fine trasmissione Wire.beginTransmission(device); //avvia la trasmissione al dispositivo Wire.requestFrom(device, num); // richiedi 6 byte dal dispositivo int i = 0; while(Wire.available()) //il dispositivo può inviare meno di quanto richiesto (anormale) { buff= Wire.read(); // riceve un byte i++; } Wire.endTransmission(); //fine trasmissione } void runningFrame(OLEDDisplay *display, OLEDDisplayUiState* stato, 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 *display, OLEDDisplayUiState* state, int16_t x, int16_t y) { display->setFont(ArialMT_Plain_16); display->drawString(60, 45, "carica dati …"); } // Questo array mantiene i puntatori funzione a tutti i frame // i frame sono le singole viste che scorrono nei frame FrameCallback = { analogClockFrame, digitalClockFrame, runningFrame, uploadFrame}; // quanti frame ci sono? int frameCount = 4; // Le sovrapposizioni sono disegnate staticamente sopra una cornice, ad es. un overlay di clock OverlayCallback = { clockOverlay }; int overlayCount = 1; void uploadToBlynk(void){ if(upload == true){ Blynk.virtualWrite(V0, stepsSum); Blynk.virtualWrite(V1, StepSum); } } 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.setOverlays(overlay, overlayCount); ui.disableAutoTransition(); ui.switchToFrame(2); ui.init(); display.flipScreenVerticalmente(); } void adxl345Init(void){ writeTo(DEVICE, 0x2D, 0); writeTo(DISPOSITIVO, 0x2D, 16); writeTo(DISPOSITIVO, 0x2D, 8); } void updateAdxl345(void){ readFrom(DEVICE, regAddress, TO_READ, buff); //leggi i dati di accelerazione dall'ADXL345 xx = (((int)buff[1]) << 8) | buff[0]; aa = (((int)buff[3])<< 8) | buff[2]; zz = (((int)buff[5]) << 8) | buff[4]; if(xx 80){ if(xx < valorecorrente){ StepSum++; } valorecorrente = xx; } sprintf(str, "%d", StepSum); } int getKeys(void){ if(digitalRead(D2) == LOW){ delay(5); if(digitalRead(D2) == BASSO){ while(digitalRead(D2) == BASSO); ritorna POWER_KEY; } } if(digitalRead(D3) == BASSO){ ritardo(5); if(digitalRead(D3) == BASSO){ while(digitalRead(D3) == BASSO); ritorna MENU_KEY; } } if(digitalRead(D4) == LOW){ delay(5); if(digitalRead(D4) == BASSO){ while(digitalRead(D4) == BASSO); restituisce UPLOAD_KEY; } } restituisce 0; } void doKeysFunction(void){ statico int uiFrameIndex = 2; int chiavi = getKeys(); if(keys == POWER_KEY){ static char i = 0; if(i){ ui.init(); display.flipScreenVerticalmente(); display.displayOn(); }else{ display.displayOff(); } io = ~ io; } 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{ carica = vero; ui.switchToFrame(3); } } } void setup() { pinMode(D2, INPUT); pinMode(D3, INGRESSO); pinMode(D4, INGRESSO); Blynk.begin(auth, ssid, pass); rtc.begin(); uiInit(); adxl345Init(); timer.setInterval(30, updateAdxl345); timer.setInterval(100, uploadToBlynk); } void loop() { int rimanenteTimeBudget = ui.update(); statico int testSum = 0; if((testSum 0) { delay(remainingTimeBudget); } doKeysFunction(); timer.run(); }

Attenzione: devi modificare le impostazioni Wi-Fi, il passaporto e gli AUTHTOKENS per te stesso.

char auth = "YourAuthToken"; // Le tue credenziali WiFi. // Imposta la password su "" per le reti aperte. char ssid = "NomeRete"; char pass = "Password";

Passaggio 3: connessione hardware

Connessione hardware
Connessione hardware
Connessione hardware
Connessione hardware
Connessione hardware
Connessione hardware

Collegare OLED12864 e il modulo di accelerazione a I2C, in basso a D2, D3, D4. Inoltre, aggiungi resistori pull-up da 51k ai minimi per raggiungere 3,3 V, come mostrato di seguito.

Attenzione: è sbagliato collegare i resistori di pull-up ad AREF, quello giusto è a 3.3V

L'immagine della saldatura hardware, mostrata come di seguito:

Dopo la saldatura, assemblando il modulo hardware sulla crosta, mostrato come di seguito:

Immagine dell'effetto completo~

Consigliato: