#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
//==============================
// LCD
//==============================
LiquidCrystal_I2C lcd(0x27, 16, 2);
//==============================
// PINES
//==============================
// Potenciómetros
#define TPS_PIN 26
#define TEMP_PIN 27
// Ultrasonido
#define TRIG_PIN 4
#define ECHO_PIN 2
// Servo
#define SERVO_PIN 13
// LEDs (Temperatura)
#define LED_VERDE 18
#define LED_AMARILLO 19
#define LED_ROJO 23
// Buzzer
#define BUZZER 25
//==============================
// OBJETO SERVO
//==============================
Servo mariposa;
//==============================
// VARIABLES
//==============================
int tps = 0;
int temperatura = 0;
int servoPos = 0;
float distancia = 0;
//==============================
// SETUP
//==============================
void setup() {
Serial.begin(115200);
lcd.init();
lcd.backlight();
// Pantalla de presentación
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Bryan");
lcd.setCursor(0,1);
lcd.print("Chitalogro");
delay(2500);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" MINI ECU ");
lcd.setCursor(0,1);
lcd.print("INICIANDO...");
delay(2000);
lcd.clear();
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LED_VERDE, OUTPUT);
pinMode(LED_AMARILLO, OUTPUT);
pinMode(LED_ROJO, OUTPUT);
pinMode(BUZZER, OUTPUT);
digitalWrite(LED_VERDE, LOW);
digitalWrite(LED_AMARILLO, LOW);
digitalWrite(LED_ROJO, LOW);
digitalWrite(BUZZER, LOW);
mariposa.attach(SERVO_PIN);
mariposa.write(0);
}
//=====================================================
// FUNCION PARA MEDIR DISTANCIA
//=====================================================
float medirDistancia() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(5);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long tiempo = pulseIn(ECHO_PIN, HIGH);
float distancia = tiempo * 0.0343 / 2;
return distancia;
}
//=====================================================
// LOOP PRINCIPAL
//=====================================================
void loop() {
//==============================
// TPS
//==============================
int lecturaTPS = analogRead(TPS_PIN);
tps = map(lecturaTPS, 0, 4095, 0, 100);
servoPos = map(lecturaTPS, 0, 4095, 0, 180);
//==============================
// TEMPERATURA
//==============================
int lecturaTemp = analogRead(TEMP_PIN);
temperatura = map(lecturaTemp, 0, 4095, 0, 120);
// Protección de la mariposa
if (temperatura > 45) {
servoPos = min(servoPos, 45);
}
mariposa.write(servoPos);
//==============================
// ULTRASONICO
//==============================
distancia = medirDistancia();
//==============================
// APAGAR SALIDAS
//==============================
digitalWrite(LED_VERDE, LOW);
digitalWrite(LED_AMARILLO, LOW);
digitalWrite(LED_ROJO, LOW);
noTone(BUZZER);
//==============================
// MINI ECU (TEMPERATURA)
//==============================
if (temperatura < 70) {
digitalWrite(LED_VERDE, HIGH);
}
else if (temperatura <= 90) {
digitalWrite(LED_AMARILLO, HIGH);
}
else {
digitalWrite(LED_ROJO, HIGH);
tone(BUZZER, 2000);
}
//==============================
// SISTEMA DE PARQUEO
//==============================
String estado;
if (distancia > 100) {
estado = "LIBRE";
}
else if (distancia >= 50) {
estado = "PRECAUCION";
}
else if (distancia >= 20) {
estado = "PELIGRO";
}
else {
estado = "DETENER";
// Solo buzzer para detener,
// sin afectar la alarma de temperatura
if (temperatura <= 90) {
tone(BUZZER, 1500);
}
}
//==============================
// LCD
//==============================
lcd.clear();
if (temperatura > 90) {
lcd.setCursor(0,0);
lcd.print("T:");
lcd.print(temperatura);
lcd.print((char)223);
lcd.print("C");
lcd.setCursor(0,1);
lcd.print("PROTEGER MOTOR");
} else {
lcd.setCursor(0,0);
lcd.print("T:");
lcd.print(temperatura);
lcd.print((char)223);
lcd.print(" TPS:");
lcd.print(tps);
lcd.print("%");
lcd.setCursor(0,1);
lcd.print(estado);
}
//==============================
// SERIAL
//==============================
Serial.print("TPS: ");
Serial.print(tps);
Serial.print("% ");
Serial.print("Temp: ");
Serial.print(temperatura);
Serial.print(" C ");
Serial.print("Servo: ");
Serial.print(servoPos);
Serial.print(" ");
Serial.print("Distancia: ");
Serial.print(distancia);
Serial.print(" cm ");
Serial.print("Estado: ");
Serial.println(estado);
delay(300);
}