Índice:

Como fazer um contador de passos ?: 3 etapas (com imagens)
Como fazer um contador de passos ?: 3 etapas (com imagens)

Vídeo: Como fazer um contador de passos ?: 3 etapas (com imagens)

Vídeo: Como fazer um contador de passos ?: 3 etapas (com imagens)
Vídeo: Programador Sênior VS júnior #short #shorts 2024, Junho
Anonim
Image
Image
Crie um Projeto Blynk
Crie um Projeto Blynk

Eu costumava ter um bom desempenho em muitos esportes: caminhar, correr, andar de bicicleta, jogar badminton etc.

Eu amo andar para viajar em pouco tempo. Bem, olhe para a minha barriga corpulenta …

Bem, de qualquer maneira, decido recomeçar a me exercitar. Que equipamento devo preparar? Além das instalações esportivas, sim! Eu preciso de um instrumento! Acredito que com isso, posso manter a quantidade adequada de exercícios. Aqui o instrumento passa a existir. Vamos começar com um vídeo ~

O instrumento não só pode registrar etapas (e calorias) em tempo real, mas mostrar o tempo. O que é especial é que o formato de exibição é ponteiro ~ tão legal! Eu realmente gosto disso!

Você pode enviar seus registros para a Internet

apenas por um clique. Todos os registros podem ser exibidos pelo Blynk (um software para smartphone apresentado anteriormente). Da mesma forma que um relógio inteligente vestível, o instrumento obtém a hora on-line (portanto, você não precisa ter medo do poder e da atualização da hora).

Hardware em meed:

FireBeetle Board-ESP32

Capas para FireBeetle - Proto Board

Tela de exibição OLED12864

Módulo de aceleração

Bateria de 3,7 V (comprada online, o volume é em torno de 600mAH)

3 bottons (comprados online)

É muito conveniente construir este projeto por Blybk.

Etapa 1: Criar um Projeto Blynk

Adicione dois controles:

Exibição de valor * 1

Relógio em tempo real * 1

O nome do Value Display deve ser definido em etapas, mas nenhuma configuração para as propriedades do relógio em tempo real. Escolha V1 como o pino de entrada para ajustar o layout dos controles, mostrado abaixo.

Etapa 2: Baixe programas para FireBeetle Board-ESP32

Clique aqui para baixar o código-fonte do esp32. O código-fonte consiste em arquivos de biblioteca e arquivos de impressão 3D. Você deve salvar o arquivo da biblioteca na lib do Arduino. E os arquivos 3D podem imprimir crostas diretamente.

Abaixo está o programa principal

#include #include // Necessário apenas para Arduino 1.6.5 e anterior #include "SSD1306.h" // alias para `#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; Display SSD1306 (0x3c, 18, 0); OLEDDisplayUi ui (& display); Temporizador SimpleTimer; WidgetRTC rtc; tela intW = 128; tela interna H = 64; int clockCenterX = screenW / 2; int clockCenterY = ((telaH-16) / 2) +16; // parte superior amarela tem 16 px de altura int clockRadius = 23; #define DEVICE (0x53) // endereço de dispositivo ADXL345 #define TO_READ (6) // número de bytes que vamos ler a cada vez (dois bytes para cada eixo) byte buff [TO_READ]; // buffer de 6 bytes para salvar os dados lidos do dispositivo char str [100]; // buffer de string para transformar os dados antes de enviá-los à porta serial int regAddress = 0x32; // primeiro registro de dados de aceleração de eixo no ADXL345 int xx, yy, zz; // dados de aceleração de três eixos static int currentValue = 0; etapas longas não assinadas estáticas Soma = 0; char auth = "YourAuthToken"; // Suas credenciais de WiFi. // Defina a senha para "" para redes abertas. char ssid = "YourNetworkName"; char pass = "SuaSenha"; const char running_Logo_bits PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x03, 0x00, 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, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xF8, 0x01, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0x60, 0x60, 0xF1, 0x07, 0x00, 0x00, 0x20, 0xF8, 0x17, 0x00, 0x00, 0xC0, 0xF8, 0x0F, 0x00, 0x00, 0xE0, 0xFB, 0x17, 0x00, 0x00, 0xC0, 0xFF, 0x13, 0x00, 0x00, 0x00, 0xFF, 0x03, 0x00, 0x00, 0x80, 0xFE, 0x03, 0x00, 0x00, 0x00, 0xF9, 0x03, 0x00, 0x00, 0x00, 0xFA, 0x03, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x03, 0x00, 0x00, 0x00, 0xF0, 0x07, 0x00, 0x00, 0x00, 0xF4, 0x07, 0x00, 0x00, 0x00, 0xF4, 0x0F, 0x00, 0x00, 0x00, 0xF9, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x00, 0x00, 0x80, 0xFE, 0x1F, 0x00, 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, 0xE0, 0x05, 0xF8, 0x01, 0x00, 0xC0, 0x01, 0xF0, 0x03, 0x00, 0xC0, 0x03, 0xE8, 0x07, 0x00, 0xC0, 0x03, 0x88, 0x6F, 0x00, 0x80, 0x03, 0x40, 0x1E, 0x00, 0xA0, 0x03, 0x40, 0xFC, 0x00, 0x80, 0x03, 0x00, 0xF8, 0x01, 0x00, 0x07, 0x00, 0xF4, 0x00, 0x00, 0x07, 0x00, 0xE8, 0x00, 0x80, 0x0F, 0x00, 0xE8, 0x00, 0x90, 0x0F, 0x00, 0xE0, 0x00, 0xE8, 0x0F, 0x00, 0xE8, 0x00, 0xF0, 0x09, 0x00, 0x60, 0x01, 0xF0, 0x04, 0x00, 0x00, 0x00,}; // função de utilidade para a exibição do relógio digital: imprime 0 à esquerda String twoDigits (int digits) {if (digits <10) {String i = '0' + String (digits); return i; } else {return String (dígitos); }} void clockOverlay (display OLEDDisplay *, estado OLEDDisplayUiState *) {if ((hora () == 0) && (minuto () == 0) && (segundo () == 0)) stepsSum = 0; } void analogClockFrame (display OLEDDisplay *, estado OLEDDisplayUiState *, int16_t x, int16_t y) {display-> drawCircle (clockCenterX + x, clockCenterY + y, 2); // horas marcadas para (int z = 0; z drawLine (x2 + x, y2 + y, x3 + x, y3 + y);} // exibe o ponteiro dos segundos ângulo de flutuação = segundo () * 6; ângulo = (ângulo / 57.29577951); // Converter graus em radianos int x3 = (clockCenterX + (sin (ângulo) * (clockRadius - (clockRadius / 5)))); int y3 = (clockCenterY - (cos (ângulo) * (clockRadius - (clockRadius / 5)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // exibir o ângulo do ponteiro dos minutos = minuto () * 6; ângulo = (ângulo / 57,29577951); // Converter graus em radianos x3 = (clockCenterX + (sin (ângulo) * (clockRadius - (clockRadius / 4)))); y3 = (clockCenterY - (cos (ângulo) * (clockRadius - (clockRadius / 4)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); // exibir ângulo do ponteiro das horas = hora () * 30 + int ((minuto () / 12) * 6); ângulo = (ângulo / 57,29577951); // Converter graus em radianos x3 = (clockCenterX + (sin (angle) * (clockRadius - (clockRadius / 2)))); y3 = (clockCenterY - (cos (ângulo) * (clockRadius - (clockRa dius / 2)))); display-> drawLine (clockCenterX + x, clockCenterY + y, x3 + x, y3 + y); } void digitalClockFrame (OLEDDisplay * display, OLEDDisplayUiState * estado, int16_t x, int16_t y) {String date = String (year ()) + "/" + twoDigits (month ()) + "/" + twoDigits (day ()); String timenow = String (hora ()) + ":" + 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 dispositivo, endereço de byte, byte val) {Wire.beginTransmission (dispositivo); // inicia a transmissão para o dispositivo Wire.write (endereço); // enviar endereço de registro Wire.write (val); // envia valor para escrever Wire.endTransmission (); // fim da transmissão} // lê num bytes começando do registro de endereço no dispositivo para o array buff void readFrom (int dispositivo, endereço de byte, int num, byte buff ) {Wire.beginTransmission (dispositivo); // inicia a transmissão para o dispositivo Wire.write (endereço); // envia o endereço para leitura de Wire.endTransmission (); // final da transmissão Wire.beginTransmission (device); // inicia a transmissão para o dispositivo Wire.requestFrom (device, num); // solicita 6 bytes do dispositivo int i = 0; while (Wire.available ()) // dispositivo pode enviar menos do que o solicitado (anormal) {buff = Wire.read (); // recebe um byte i ++; } Wire.endTransmission (); // fim da transmissão} void runningFrame (OLEDDisplay * display, OLEDDisplayUiState * estado, 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 (exibição OLEDDisplay *, estado OLEDDisplayUiState *, int16_t x, int16_t y) {display-> setFont (ArialMT_Plain_16); display-> drawString (60, 45, "upload de dados …"); } // Este array mantém ponteiros de função para todos os quadros // os quadros são as visualizações únicas que deslizam nos quadros FrameCallback = {analogClockFrame, digitalClockFrame, runningFrame, uploadFrame}; // quantos quadros existem? int frameCount = 4; // As sobreposições são desenhadas estaticamente no topo de um quadro, por exemplo. um relógio OverlayCallback se sobrepõe = {clockOverlay}; int overlaysCount = 1; void uploadToBlynk (void) {if (upload == true) {Blynk.virtualWrite (V0, stepsSum); Blynk.virtualWrite (V1, etapasSum); }} 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 (overlays, overlaysCount); ui.disableAutoTransition (); ui.switchToFrame (2); ui.init (); display.flipScreenVertically (); } void adxl345Init (void) {writeTo (DEVICE, 0x2D, 0); writeTo (DEVICE, 0x2D, 16); writeTo (DEVICE, 0x2D, 8); } void updateAdxl345 (void) {readFrom (DEVICE, regAddress, TO_READ, buff); // leia os dados de aceleração do ADXL345 xx = (((int) buff [1]) << 8) | buff [0]; yy = (((int) buff [3]) << 8) | lustre [2]; zz = (((int) buff [5]) << 8) | lustre [4]; if (xx 80) {if (xx <valor atual) {stepsSum ++; } currentValue = xx; } sprintf (str, "% d", stepsSum); } int getKeys (void) {if (digitalRead (D2) == LOW) {delay (5); if (digitalRead (D2) == LOW) {while (digitalRead (D2) == LOW); return POWER_KEY; }} if (digitalRead (D3) == LOW) {delay (5); if (digitalRead (D3) == LOW) {while (digitalRead (D3) == LOW); return MENU_KEY; }} if (digitalRead (D4) == LOW) {delay (5); if (digitalRead (D4) == LOW) {while (digitalRead (D4) == LOW); return UPLOAD_KEY; }} return 0; } void doKeysFunction (void) {static int uiFrameIndex = 2; chaves int = getKeys (); if (keys == POWER_KEY) {estático char i = 0; if (i) {ui.init (); display.flipScreenVertically (); 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 {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); } void loop () {int restanteTimeBudget = ui.update (); static int testSum = 0; if ((testSum 0) {delay (restanteTimeBudget);} doKeysFunction (); timer.run ();}

Cuidado: você deve modificar a configuração de Wi-Fi, passaporte e AUTHTOKENS para você mesmo.

char auth = "YourAuthToken"; // Suas credenciais de WiFi. // Defina a senha para "" para redes abertas. char ssid = "YourNetworkName"; char pass = "SuaSenha";

Etapa 3: Conexão de Hardware

Conexão de Hardware
Conexão de Hardware
Conexão de Hardware
Conexão de Hardware
Conexão de Hardware
Conexão de Hardware

Conecte o OLED12864 e o módulo de aceleração a I2C, os fundos a D2, D3, D4. Além disso, adicione resistores pull-up de 51k aos fundos para alcançar 3,3 V, mostrado abaixo.

Cuidado: É errado conectar resistores pull-up a AREF, o certo é a 3,3V

A imagem de soldagem do hardware, mostrada a seguir:

Após a solda, montagem do módulo de hardware na crosta, conforme abaixo:

Imagem de efeito abrangente ~

Recomendado: