Índice:
- Etapa 1: Criar um Projeto Blynk
- Etapa 2: Baixe programas para FireBeetle Board-ESP32
- Etapa 3: Conexão de Hardware
Vídeo: Como fazer um contador de passos ?: 3 etapas (com imagens)
2024 Autor: John Day | [email protected]. Última modificação: 2024-01-30 11:35
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
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:
Faça você mesmo como fazer um relógio legal - StickC - Fácil de fazer: 8 etapas
DIY Como fazer um relógio legal - StickC - Fácil de fazer: neste tutorial, aprenderemos como programar ESP32 M5Stack StickC com Arduino IDE e Visuino para exibir uma hora no LCD e também definir a hora usando os botões StickC
Como fazer um contador de moedas: 3 etapas
Como fazer um contador de moedas: Este manual irá descrever como criar um contador de moedas de cofrinho com um GreenPAK ™. Este contador de cofrinho utilizará três componentes principais: GreenPAK SLG46531V: O GreenPAK serve como o intérprete entre os sensores e displa
Como fazer um contador com micróbio ?: 9 etapas
Como fazer um contador com micróbios ?: Quando embarcamos no avião, muitas vezes nos deparamos com uma situação como esta: uma bela aeromoça carregando uma pequena caixa de prata continua pressionando-a enquanto passa. Ela está murmurando: 1,2,3,4,5,6 …… Você deve adivinhar - ela está contando o número total de
Como fazer um robô jogador de basquete autônomo usando um IRobot Crie como base: 7 etapas (com imagens)
Como fazer um robô jogador de basquete autônomo usando um IRobot Create como base: Esta é a minha entrada para o desafio iRobot Create. A parte mais difícil de todo esse processo para mim foi decidir o que o robô faria. Eu queria demonstrar os recursos interessantes do Create, ao mesmo tempo em que adicionava um toque de robo. Todo o meu
Como fazer um calendário para os avós & Álbum de recortes (mesmo que você não saiba fazer recortes): 8 etapas (com imagens)
Como fazer um calendário para os avós & Álbum de recortes (mesmo que você não saiba fazer): Este é um presente de Natal muito econômico (e muito apreciado!) Para os avós. Fiz 5 calendários este ano por menos de US $ 7 cada. Materiais: 12 ótimas fotos de seu filho, filhos, sobrinhas, sobrinhos, cachorros, gatos ou outros parentes12 peças diferentes