#include <Wire.h>
#include <MPU6050.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>
#include "Button.h"
// Definir o pino ao qual o sensor DHT22 está conectado
#define DHTPIN 15 // Ajuste conforme a sua conexão
#define DHTTYPE DHT22
// Inicializa o objeto DHT
DHT dht(DHTPIN, DHTTYPE);
// Inicializa o objeto MPU6050
MPU6050 mpu;
// Variável para controlar o estado dos sensores
bool sensorsActivated = false;
// Instância da classe Button
const int buttonPin = 19; // Pino ao qual o botão está conectado
Button btn(buttonPin);
#define SOUND_SPEED 0.034
#define CM_TO_INCH 0.393701
const int trigPin = 4;
const int echoPin = 5;
long duration;
float distanceCm;
float distanceCm_Prev;
float caminhoRodado;
float miniCaminho;
#define LED_RED_PIN 2
#define LED_YELLOW_PIN 0
#define VIBRATION_PIN 13 // Define o pino para o motor de vibração
void setup() {
Serial.begin(115200); // Inicializa a comunicação serial
Serial.println(F("Iniciando Programa..."));
Wire.begin();
Serial.println(F("Iniciando Sensor de Temperatura (DHT22)"));
dht.begin();
Serial.println(F("Iniciando Sensor de Pressão (MPU6050)"));
mpu.initialize();
// Validando a conexão do MPU6050
if (!mpu.testConnection()) {
Serial.println(F("Falha ao conectar ao MPU6050"));
while (1); // loop infinito na condição
}
Serial.println("MPU6050 conectado!");
pinMode(LED_RED_PIN, OUTPUT);
pinMode(LED_YELLOW_PIN, OUTPUT);
pinMode(VIBRATION_PIN, OUTPUT); // Configura o pino de vibração como saída
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop() {
btn.update();
if (btn.wasClicked()) {
// Alterna o estado dos sensores
sensorsActivated = !sensorsActivated;
// Feedback de vibração ao ativar/desativar sensores
digitalWrite(VIBRATION_PIN, HIGH);
delay(200);
digitalWrite(VIBRATION_PIN, LOW);
if (sensorsActivated) {
Serial.println("Sensores ativados!");
} else {
Serial.println("Sensores desativados!");
}
}
if (sensorsActivated) {
digitalWrite(LED_YELLOW_PIN, HIGH);
// Leitura de temperatura e umidade do DHT22
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// Verifica se a leitura falhou e tenta novamente
if (isnan(humidity) || isnan(temperature)) {
Serial.println(F("Falha na leitura do sensor DHT!"));
} else {
Serial.print(F("Umidade: "));
Serial.print(humidity);
Serial.println(F("%"));
Serial.print(F("Temperatura: "));
Serial.print(temperature);
Serial.println(F("°C"));
}
// Leitura de aceleração e giroscópio do MPU6050
int16_t ax, ay, az;
int16_t gx, gy, gz;
mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
Serial.print(F("Acelerômetro: "));
Serial.print(F("X: ")); Serial.print(ax);
Serial.print(F(" | Y: ")); Serial.print(ay);
Serial.print(F(" | Z: ")); Serial.println(az);
Serial.print(F("Giroscópio: "));
Serial.print(F("X: ")); Serial.print(gx);
Serial.print(F(" | Y: ")); Serial.print(gy);
Serial.print(F(" | Z: ")); Serial.println(gz);
// Condição de alerta de vibração
if(temperature > 60) {
digitalWrite(LED_RED_PIN, HIGH);
digitalWrite(VIBRATION_PIN, HIGH); // Vibra enquanto a temperatura estiver alta
} else {
digitalWrite(LED_RED_PIN, LOW);
digitalWrite(VIBRATION_PIN, LOW); // Vibração desligada
}
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distanceCm = duration * SOUND_SPEED/2;
Serial.print("Distancia(cm): ");
Serial.println(distanceCm);
miniCaminho = distanceCm_Prev - distanceCm;
if(miniCaminho < 0){
miniCaminho = miniCaminho * (-1);
}
if(miniCaminho > 5) {
caminhoRodado += miniCaminho;
Serial.print("Distancia(cm): ");
Serial.println(distanceCm);
Serial.print("Distancia Percorrida(cm): ");
Serial.println(caminhoRodado);
}
distanceCm_Prev = distanceCm;
} else {
digitalWrite(LED_YELLOW_PIN, LOW);
}
// Atraso de 1000 milissegundos entre leituras para melhor responsividade do botão
delay(1000);
}