/*
* ============================================================
* SISTEMA AUTOMOTIVO INTEGRADO ESP32
* ============================================================
* Disciplina: Arquitetura ARM - CESEB
* Professor: Ronnier Frates Rohrich
* Aluno: Anderson Roberto da Costa
* Atividade: 05 - Sistema Automotivo Integrado
* Data: Novembro 2025
* Plataforma: Wokwi (ESP32 DevKit C V4)
*
* Este projeto implementa um firmware de sistema automotivo
* integrado para ESP32, simulando funcionalidades reais de um
* veículo moderno com múltiplos sensores e atuadores.
* ============================================================
*/
#include <Arduino.h>
#include "config.h"
#include "sensors.h"
#include "actuators.h"
#include "display.h"
#include "systems.h"
// ============ INSTÂNCIAS GLOBAIS ============
SensorManager sensorManager;
ActuatorManager actuatorManager;
DisplayManager displayManager;
SistemaArCondicionado sistemaAC;
SistemaColisao sistemaColisao;
SistemaFaroisAutomaticos sistemaFarois;
SistemaDestravamentoPortas sistemaPortas;
SistemaAssistenteDistancia sistemaDistanciaFrontal;
SistemaEstacionamento sistemaEstacionamento;
// ============ VARIÁVEIS GLOBAIS ============
SensorData sensorData;
unsigned long ultimaAtualizacao = 0;
unsigned long intervaloAtualizacao = INTERVALO_ATUALIZACAO_MS;
// Estados dos botões de ocupação de bancos
bool bancoEsquerdoOcupado = false;
bool bancoDireitoOcupado = false;
// ============ PROTÓTIPOS DE FUNÇÕES ============
void lerpirButtons();
void telemetry();
// ============ SETUP ============
void setup()
{
// Inicializar Serial
Serial.begin(SERIAL_BAUD_RATE);
delay(2000); // Aguardar console serial
Serial.println("\n\n");
Serial.println("╔════════════════════════════════════════╗");
Serial.println("║ SISTEMA AUTOMOTIVO INTEGRADO COM ESP32 ║");
Serial.println("║ Disciplina: Arquitetura ARM - CESEB ║");
Serial.println("║ Professor: Ronnier Frates Rohrich ║");
Serial.println("║ Aluno: Anderson Roberto da Costa ║");
Serial.println("║ Atividade 05 - Novembro 2025 ║");
Serial.println("╚════════════════════════════════════════╝\n");
// Inicializar I2C
Wire.begin(I2C_SDA, I2C_SCL);
Serial.println("[INIT] I2C inicializado (SDA: 21, SCL: 22)");
// Inicializar sensores
if (!sensorManager.inicializarSensores()) {
Serial.println("[ERRO] Falha ao inicializar sensores!");
while (1) {
delay(1000);
}
}
// Inicializar atuadores
actuatorManager.inicializarAtuadores();
// Inicializar display
if (!displayManager.inicializarDisplay()) {
Serial.println("[ERRO] Falha ao inicializar display!");
}
// Configurar pinos dos botões de ocupação de bancos
pinMode(PIN_BOTAO_BANCO_ESQUERDO, INPUT_PULLUP); // FRONT-L - Motorista
pinMode(PIN_BOTAO_BANCO_DIREITO, INPUT_PULLUP); // FRONT-R - Passageiro
Serial.println("\n[OK] Sistema inicializado com sucesso!");
Serial.println("[READY] Aguardando entrada...\n");
delay(2000);
}
// ============ LOOP PRINCIPAL ============
void loop()
{
unsigned long agora = millis();
if (agora - ultimaAtualizacao >= intervaloAtualizacao) {
ultimaAtualizacao = agora;
// 1. Ler todos os sensores
sensorManager.lerSensores(sensorData);
// 2. Ler estados dos botões
lerpirButtons();
// 3. Atualizar sistemas
sistemaAC.atualizar(sensorData.temperatura, actuatorManager);
sistemaColisao.atualizar(sensorData.aceleracaoResultante,
bancoEsquerdoOcupado, bancoDireitoOcupado,
actuatorManager);
sistemaFarois.atualizar(sensorData.ldr, actuatorManager);
sistemaPortas.atualizar(sensorData.pir, actuatorManager);
sistemaDistanciaFrontal.atualizar(sensorData.distanciaFrontal,
actuatorManager);
sistemaEstacionamento.atualizar(sensorData.distanciaTraseira,
actuatorManager);
// 4. Atualizar travamento de cintos (timeout)
if (!actuatorManager.atualizarTravaCinto() &&
sistemaColisao.getNivelColisao() == COLISAO_FRACA) {
Serial.println("[CINTOS] Automaticamente destravados");
}
// 5. Atualizar display
displayManager.atualizarDisplay(
sensorData.temperatura, sistemaAC.estaLigado(),
sistemaFarois.estaoLigados(),
sistemaPortas.portasEstaoDestravadas(), sensorData.distanciaFrontal,
sensorData.distanciaTraseira, bancoEsquerdoOcupado,
bancoDireitoOcupado);
// 6. Telemetria (a cada 2 segundos)
static unsigned long ultimaTelemetria = 0;
if (agora - ultimaTelemetria >= 2000) {
ultimaTelemetria = agora;
telemetry();
}
}
}
// ============ FUNÇÕES AUXILIARES ============
void lerpirButtons()
{
// Botão FRONT-L - Banco do Motorista (Esquerdo)
if (digitalRead(PIN_BOTAO_BANCO_ESQUERDO) == LOW) {
bancoEsquerdoOcupado = true;
}
else {
bancoEsquerdoOcupado = false;
}
// Botão FRONT-R - Banco do Passageiro (Direito)
if (digitalRead(PIN_BOTAO_BANCO_DIREITO) == LOW) {
bancoDireitoOcupado = true;
}
else {
bancoDireitoOcupado = false;
}
}
void telemetry()
{
Serial.println("╔════════════════════════════════════════╗");
Serial.println("║ TELEMETRIA DO SISTEMA ║");
Serial.println("╚════════════════════════════════════════╝");
Serial.print("Temperatura: ");
Serial.print(sensorData.temperatura, 1);
Serial.print("°C | A/C: ");
Serial.println(sistemaAC.estaLigado() ? "ON" : "OFF");
Serial.print("Umidade: ");
Serial.print(sensorData.umidade, 1);
Serial.println("%");
Serial.print("Aceleração Resultante: ");
Serial.print(sensorData.aceleracaoResultante, 2);
Serial.println(" m/s²");
Serial.print("Nível de Colisão: ");
switch (sistemaColisao.getNivelColisao()) {
case SEM_COLISAO:
Serial.println("SEM COLISÃO");
break;
case COLISAO_FRACA:
Serial.println("COLISÃO FRACA");
break;
case COLISAO_FORTE:
Serial.println("COLISÃO FORTE");
break;
}
Serial.print("LDR: ");
Serial.print(sensorData.ldr);
Serial.print(" | Faróis: ");
Serial.println(sistemaFarois.estaoLigados() ? "ON" : "OFF");
Serial.print("PIR: ");
Serial.print(sensorData.pir ? "MOVIMENTO" : "SEM MOVIMENTO");
Serial.print(" | Portas: ");
Serial.println(sistemaPortas.portasEstaoDestravadas() ? "DESTRAVADAS"
: "TRAVADAS");
Serial.print("Distância Frontal: ");
// Verificar se a distância é válida
if (sensorData.distanciaFrontal > 0) {
Serial.print(sensorData.distanciaFrontal, 1);
Serial.print(" cm | Nível: ");
switch (sistemaDistanciaFrontal.getNivel()) {
case DISTANCIA_SEGURA:
Serial.println("SEGURO");
break;
case DISTANCIA_ATENCAO:
Serial.println("ATENÇÃO");
break;
case DISTANCIA_PERIGO:
Serial.println("PERIGO");
break;
}
}
else {
Serial.println("-- cm | Nível: INDISPONÍVEL");
}
Serial.print("Distância Traseira: ");
if (sensorData.distanciaTraseira > 0) {
Serial.print(sensorData.distanciaTraseira, 1);
Serial.println(" cm");
}
else {
Serial.println("-- cm");
}
Serial.print("Banco Esquerdo: ");
Serial.print(bancoEsquerdoOcupado ? "OCUPADO" : "VAZIO");
Serial.print(" | Banco Direito: ");
Serial.println(bancoDireitoOcupado ? "OCUPADO" : "VAZIO");
Serial.println();
}