#include <Wire.h>
// LiquidCrystal I2C
// https://www.arduinolibraries.info/libraries/liquid-crystal-i2-c
#include <LiquidCrystal_I2C.h>
// Definición de los pines de los botones
#define SELECT_PIN 2
#define ENTER_PIN 3
#define RESET_PIN 4
#define PUMP_PIN 5
// Definición de las salidas
#define INYECTOR 8
#define PUMP 9
#define BUZZER 10
// Inicialización de la pantalla LCD_I2C
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Variables de estado
int mode = 0;
int tiempo = 0;
bool inModo = false;
bool pumpOn = false;
bool inyectorOn = false;
bool modoLimpieza = false;
unsigned long startTime = 0;
unsigned long tiempos[3] = {1500, 3000, 4500}; // Tiempos en milisegundos para modos 0, 1 y 2
// Custom Chars
byte UDA[8] = {
B10001,
B01010,
B01010,
B10001,
B10001,
B10001,
B10001,
B01110
};
byte Arrow[8] = {
B00000,
B00100,
B00010,
B11111,
B00010,
B00100,
B00000,
B00000
};
byte eMin[8] = {
B01100,
B10010,
B11110,
B10000,
B01110,
B00000,
B00000,
B00000
};
byte JV[8] = {
B00000,
B00000,
B00000,
B00000,
B01101,
B00101,
B10101,
B01010
};
// Definición del array de 2 dimensiones de objetos String
String words[4][4] = {
{"1 Pulso", "50 Pulsos", "100 Pulsos","50 Pulsos"},
{"cada 250ms", "cada 7ms", "cada 3,5ms","cada 1450ms"},
{" ", " ", " "," "}
// {"Line 4 Col1", "Line 4 Col2", "Line 4 Col3","limp4"}
};
// Función para inicializar los pines
void setup() {
pinMode(SELECT_PIN, INPUT_PULLUP);
pinMode(ENTER_PIN, INPUT_PULLUP);
pinMode(RESET_PIN, INPUT_PULLUP);
pinMode(PUMP_PIN, INPUT_PULLUP);
pinMode(INYECTOR, OUTPUT);
pinMode(PUMP, OUTPUT);
pinMode(BUZZER, OUTPUT);
lcd.init();
lcd.backlight();
lcd.createChar(0, UDA);
lcd.createChar(1, Arrow);
lcd.createChar(2, JV);
// Mostrar la Intro
mostrarIntro();
delay(500);
// Mostrar la pantalla principal al inicio
mostrarPantallaPrincipal();
// Encender el buzzer al inicio
buzzerBeepHome();
}
// Función para reiniciar el sistema
void(* resetFunc) (void) = 0; // Función de puntero al inicio de la memoria de programa
void loop() {
// Verificar el botón SELECT_PIN
if (digitalRead(SELECT_PIN) == LOW) {
delay(200); // Debounce
if (inModo && mode != 3) { // No cambiar el tiempo en Modo3
tiempo = (tiempo + 1) % 3; // Solo 3 tiempos para modos 0, 1 y 2
mostrarTiempo();
} else if (!inModo) {
mode = (mode + 1) % 4;
mostrarPantallaPrincipal();
}
while (digitalRead(SELECT_PIN) == LOW); // Esperar hasta que se suelte el botón
}
// Verificar el botón ENTER_PIN
if (digitalRead(ENTER_PIN) == LOW) {
delay(200); // Debounce
if (inyectorOn) {
digitalWrite(INYECTOR, LOW);
inyectorOn = false;
mostrarPantallaPrincipal();
} else if (inModo) {
inyectorOn = true;
digitalWrite(INYECTOR, HIGH);
startTime = millis();
while (inyectorOn) {
if (mode != 3 && millis() - startTime >= tiempos[tiempo]) {
digitalWrite(INYECTOR, LOW);
buzzerBeep();
inyectorOn = false;
mostrarPantallaPrincipal();
}
if (digitalRead(ENTER_PIN) == LOW) {
digitalWrite(INYECTOR, LOW);
buzzerBeepHome();
inyectorOn = false;
mostrarPantallaPrincipal();
}
}
} else {
inModo = true;
if (mode == 3) { // Si se selecciona Modo3
modoLimpieza = true;
mostrarLimpieza();
} else {
mostrarTiempo();
}
}
while (digitalRead(ENTER_PIN) == LOW); // Esperar hasta que se suelte el botón
}
// Verificar el botón PUMP_PIN
if (digitalRead(PUMP_PIN) == LOW) {
delay(200); // Debounce
pumpOn = !pumpOn;
digitalWrite(PUMP, pumpOn ? HIGH : LOW);
while (digitalRead(PUMP_PIN) == LOW); // Esperar hasta que se suelte el botón
}
// Verificar el botón RESET_PIN
if (digitalRead(RESET_PIN) == LOW) {
delay(200); // Debounce
resetFunc(); // Llamar a la función de reinicio
while (digitalRead(RESET_PIN) == LOW); // Esperar hasta que se suelte el botón
}
}
// Función para mostrar la pantalla principal
void mostrarPantallaPrincipal() {
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("1 pulso - 250ms");
lcd.setCursor(1, 1);
lcd.print("50 pulsos - 7ms");
lcd.setCursor(1, 2);
lcd.print("100 pulsos - 3,5ms");
lcd.setCursor(1, 3);
lcd.print("50 pulsos - 1450ms");
for (int i = 0; i < 4; i++) {
if (i == mode) {
lcd.setCursor(0, i);
lcd.write(byte (1)); // Flecha
} else {
lcd.setCursor(0, i);
lcd.print(" ");
}
//lcd.print("Modo");
//lcd.print(i);
}
inModo = false;
modoLimpieza = false;
}
// Función para mostrar el tiempo en el modo seleccionado
void mostrarTiempo() {
lcd.clear();
displayPage(mode);
//lcd.setCursor(0, 0);
//lcd.print("Modo");
//lcd.print(mode);
lcd.setCursor(0, 3);
lcd.print("Tiempo ");
lcd.print(tiempos[tiempo] / 1000);
lcd.print("s");
}
// Función para mostrar la palabra "Limpieza"
void mostrarLimpieza() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Modo");
lcd.print(mode);
lcd.setCursor(0, 3);
lcd.print("Limpieza");
}
// Función para hacer sonar al inicio
void buzzerBeepHome() {
for (int i = 0; i < 2; i++) {
digitalWrite(BUZZER, HIGH);
delay(100);
digitalWrite(BUZZER, LOW);
delay(100);
}
}
// Función para hacer sonar el buzzer al final
void buzzerBeep() {
digitalWrite(BUZZER, HIGH);
delay(1000);
digitalWrite(BUZZER, LOW);
}
// Función para mostrar pantalla Intro
void mostrarIntro() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.write(byte (0));
lcd.setCursor(3, 0);
lcd.print("Universidad del");
lcd.setCursor(3, 1);
lcd.print("Azuay - TSEA - 3A");
lcd.setCursor(0, 2);
lcd.print("Probador/Limpiador");
lcd.setCursor(0, 3);
lcd.print("de Inyectores 2024");
lcd.setCursor(19,3);
lcd.write(byte (2));
}
// Función para mostrar una página en la pantalla LCD
void displayPage(int page) {
// Limpiar la pantalla
lcd.clear();
// Imprimir las líneas de la columna correspondiente
for (int i = 0; i < 4; i++) {
lcd.setCursor(0, i);
lcd.print(words[i][page]);
}
}