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.
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.

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
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!
|
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.
Tenha a Metodologia Eletrogate dentro da sua Escola! Conheça nosso Programa de Robótica nas Escolas!