/* Codigo para o projeto final dos alunos da turma de mecatronica I do ano de 2024 seguintes:
* Cassiano Nunes, Cauã Salvaro, Gabriel Vitorio
* Versão do codigo: 4.1.2
* Mudanças da versão 4.1.1: Retirado interrutor pois sua lógica sera implementada pelo circuito e não pelo codigo
*/
// Importa as bibliotecas para usar o sensor
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>
const int bzr = 0b1101; // pino do buzzer (13)
const int led = 0b111; // pino do led (7)
//const int motor = 0b0; // pino do motor (DEFINIR)
const float MAX_DEG = 10.3; // Define Angulo maximo
const float MIN_DEG = 8.8; // Define Angulo minimo
Adafruit_MPU6050 mpu; // Cria um instancia do sensor como 'mpu'
void setup() {
Serial.begin(9600); // Inicia a serial
// Pausa o programa enquanto a Serial abre
while (!Serial)
delay(10);
// Tenta iniciar
if (!mpu.begin()) { // Se não conseguir
Serial.println("Falha ao encontrar o chip MPU6050");
while (1) // Pausa a Serial pra sempre
delay(10);
}
Serial.println("MPU6050 encontrado");
// configura as entradas e saidas
pinMode(led, OUTPUT);
digitalWrite(led, 1);
// Define o alcance como 16 graus
mpu.setAccelerometerRange(MPU6050_RANGE_16_G);
Serial.println("");
delay(100);
}
void loop() {
logic();
}
void logic() {
sensors_event_t a, g, t; // define eventos do sensor
mpu.getEvent(&a, &g, &t); // passa referencias dos eventos para a funcão getEvent
// Imprime os valors conseguidos
print_accel(a);
// Checa se o angulo esta fora dos definidos
if (checkDeg(MIN_DEG, MAX_DEG, a.acceleration.y)) {
bzrsong(); // Se esta fora, apita e vibra o motor
}
else { silence(); } // Senão, não apita nem vibra
Serial.println("");
delay(500);
}
// Funcão para imprimir os valores do envento de acelerção dados
void print_accel(sensors_event_t a) {
Serial.print("Acceleration X: ");
Serial.print(a.acceleration.x);
Serial.print(", Y: ");
Serial.print(a.acceleration.y);
Serial.print(", Z: ");
Serial.print(a.acceleration.z);
Serial.println(" m/s^2");
}
// Função para checar se os graus concedidos são validos
bool checkDeg(float mindeg, float maxdeg, float curr) {
if (curr > maxdeg || curr < mindeg) {
Serial.print("In checkDeg :: curr =");
Serial.println(curr);
return true; // Retorna verdadeiro se o angulo é maior que o maximo ou menor que o minimo (ou seja, se não é aceitavel)
}
return false; // Retorna falso se o angulo esta entre o maximo e o minimo
}
void silence() {
noTone(bzr);
//analogWrite(motor, 0);
}
// Função para tocar o buzzer
void bzrsong() {
for (int i = 0; i <= 5; i++) {
tone(bzr, 100);
digitalWrite(led, not digitalRead(led));
// analogWrite(motor, 255)
delay(250);
noTone(bzr);
}
}