Projetos

Assistente de Treino com Arduino

Eletrogate 10 de outubro de 2023

Introdução

No post de hoje, nós vamos fazer um “ajudante” para quem faz exercícios físicos em casa. O projeto consiste em um dispositivo que conta as suas flexões e quantas séries você fez. Ele utiliza um Arduino Uno, um sensor Ultrassônico HC-SR04, um display Oled e um buzzer.


O projeto

Nesse projeto, o sensor HC-SR04 mede a distância em cm, e compara para ver se ela é menor do que 10 centímetros. Se for menor do que 10 cm, ele adiciona 1 número na quantidade de flexões. Quando a quantidade de flexões chegar a 15 flexões, ele encerra uma série e inicia o descanso.


Circuito


Código

O código será o seguinte:

//Aqui incluimos as bibliotecas
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

//aqui configuramos o tamanho do display
#define SCREEN_WIDTH 128 
#define SCREEN_HEIGHT 64 
#define OLED_RESET -1 
#define SCREEN_ADDRESS 0x3C 
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

int flexoes = 15; // aqui você escolhe quantas flexões quer fazer

int contador = 0; //cria uma variável para o contador de flexões
int series = 0; //
int trig = 7; // Pino usado para disparar os pulsos do sensor
int echo = 6; // pino usado para ler a saida do sensor
int buzzer = 5; //pino onde o buzzer está conectado
float TempoEcho = 0;
const float VelocidadeSom_mporus = 0.000340; //velocidade do som
bool flexaobaixo = false;
bool flexaoalto = false;


void setup() {
  Serial.begin(9600);

  pinMode(trig, OUTPUT); //define o pino Trigger como saída
  digitalWrite(trig, LOW);
  pinMode(echo, INPUT); // define pino ECHO como entrada
  pinMode(buzzer , OUTPUT);//define o buzzer como saída

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // declara o endereço do display
  display.clearDisplay();
  
  digitalWrite(buzzer,LOW);
}

void loop() {
 
  DisparaPulsoUltrassonico(); //dispara um pulso 
  TempoEcho = pulseIn(echo, HIGH);

  Serial.println(CalculaDistancia(TempoEcho)*100);

  if((CalculaDistancia(TempoEcho)*100) < 10 ){ //se a distancia lida for menor do que 10 cm
   flexaobaixo = true; //altera o valor da booleana
  }

  if((CalculaDistancia(TempoEcho)*100) > 20 && (CalculaDistancia(TempoEcho)*100) < 30 ){ //se a distancia lida estiver entre 20 e 30 
   flexaoalto = true; //altera o valor da booleana
  }

  if((flexaoalto == true) && (flexaobaixo == true)){ //faz a comparação das duas booleanas para ver se foi uma flexão completa
    contador++;
    display.clearDisplay(); //limpa o display
    display.setTextSize(3); //define o tamanho da letra
    display.setTextColor(1); 
    display.setCursor(0,20); 
    display.print(contador/2); // escreve no display quantas flexões
    display.setTextSize(1);
    display.setCursor(70,20);
    display.print("Series: ");
    display.setCursor(120,20);
    display.print(series); //escreve no display quantas séries feitas
    display.display();
    flexaoalto = false;
    flexaobaixo = false;
  }

  if(contador == flexoes*2){ //se o contador ler 30(equivalente a 15 flexões),chama a função responsável pelo descanso
    descanso();
  }
}

void DisparaPulsoUltrassonico(){
  // Para fazer o HC-SR04 enviar um pulso ultrassonico, nos temos
  // que enviar para o pino de trigger um sinal de nivel alto
  // com pelo menos 10us de duraçao
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
  }

// Função para calcular a distancia em metros
float CalculaDistancia(float tempo_us){
  return((tempo_us*VelocidadeSom_mporus)/2);
}

void descanso(){
 //apita para iniciar o tempo de descanso
 digitalWrite(buzzer,HIGH);
 delay(500);
 digitalWrite(buzzer,LOW);
 delay(500);
 digitalWrite(buzzer,HIGH);
 delay(500);
 digitalWrite(buzzer,LOW);
 display.clearDisplay();
 display.setTextSize(2);
 display.setTextColor(1); 
 display.setCursor(0,32);
 display.print("Descanso!");//escreve na tela o descanso
 display.display();


 delay(30000); // tempo de descanso

 digitalWrite(buzzer,HIGH); //apita o buzzer 5 vezes para indicar o fim do descanso
 delay(300);
 digitalWrite(buzzer,LOW);
 delay(300);
 digitalWrite(buzzer,HIGH);
 delay(300);
 digitalWrite(buzzer,LOW);
 delay(300);
 digitalWrite(buzzer,HIGH);
 delay(300);
 digitalWrite(buzzer,LOW); 
 delay(300);
 digitalWrite(buzzer,HIGH);
 delay(300);
 digitalWrite(buzzer,LOW);
 delay(300);
 digitalWrite(buzzer,HIGH);
 delay(300);
 digitalWrite(buzzer,LOW);
 series++; //adiciona 1 na quantidade de séries
 contador = 0 ; // zera o contador de flexões
}

Nessa parte do código, é possível alterar a quantidade de flexões desejada:

int flexoes = 15; // aqui você escolhe quantas flexões quer fazer

Testes

No vídeo, utilizei a minha mão para simular a aproximação do corpo:

Mudei o tempo de descanso somente para ficar mais rápido do vídeo:

Agora, fica o desafio: bater o meu recorde (4 flexões).

Brincadeiras à parte, agora é só aproveitar o ajudante e não perder mais a conta!


Sobre o Autor


Arthur Almeida

Estudante do Ensino médio , aficionado por criar novos projetos eletrônicos e automações, principalmente com o Arduino. No meu tempo livre eu gosto de pesquisar sobre novas tecnologias e tento criar projetos com elas.


Eletrogate

10 de outubro de 2023

A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.

Conheça a Metodologia Eletrogate e Lecione um Curso de Robótica nas Escolas da sua Região!

Eletrogate Robô

Cadastre-se e fique por
dentro de novidades!