#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#define TFT_DC 2
#define TFT_CS 15
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
// Pines de entrada para botones y microswitch
#define BUTTON_C 32 // Selector de función
#define BUTTON_D 33 // Ajuste hacia arriba
#define BUTTON_E 25 // Ajuste hacia abajo
#define BUTTON_F 26 // Confirmar selección
#define MICROSWITCH_PIN 5 // Microswitch para iniciar el proceso de vacío
// Pines de entrada y salida
const int inputPins[] = {BUTTON_C, BUTTON_D, BUTTON_E, BUTTON_F, MICROSWITCH_PIN}; // Pines de entrada digital
const int numInputs = sizeof(inputPins) / sizeof(inputPins[0]);
const int VACUUM_PUMP_PIN = 12;
const int VACUUM_VALVE_PIN = 13;
const int SEAL_VALVE_PIN = 14;
const int SEAL_HEATER_PIN = 27;
const int outputPins[] = {VACUUM_PUMP_PIN, VACUUM_VALVE_PIN, SEAL_VALVE_PIN, SEAL_HEATER_PIN};
const int numOutputs = sizeof(outputPins) / sizeof(outputPins[0]);
// Variables de tiempo y estado
unsigned long vacuumStartTime = 0;
unsigned long sealStartTime = 0;
unsigned long coolingStartTime = 0;
unsigned long vacuumDuration = 4000; // 4 segundos para el vacío
unsigned long sealDuration = 2000; // 2 segundos para el sellado
unsigned long coolingDuration = 5000; // 5 segundos para el enfriamiento
bool vacuumActive = false;
bool sealActive = false;
bool coolingActive = false;
int currentScreen = 0; // 0: Main, 1: Ajustes, 2: Totalizadores
int selectedVariable = 0; // Variable seleccionada en la pantalla de ajustes
bool isModifying = false; // Si se está modificando la variable seleccionada
// Ajustes de temperatura
int temperatureLevel = 1; // 0: Bajo, 1: Medio, 2: Alto
// Variables de totalizadores
unsigned long totalHoursWorked = 0;
unsigned int maintenanceCount = 0;
unsigned int cycleCount = 0; // Contador de ciclos completos
void setup() {
// Inicialización de la pantalla
tft.begin();
tft.setRotation(1);
// Configuración de pines de entrada
for (int i = 0; i < numInputs; i++) {
pinMode(inputPins[i], INPUT_PULLUP);
}
// Configuración de pines de salida
for (int i = 0; i < numOutputs; i++) {
pinMode(outputPins[i], OUTPUT);
digitalWrite(outputPins[i], LOW);
}
drawHomeScreen();
}
void loop() {
if (digitalRead(BUTTON_C) == LOW) {
if (isModifying) {
isModifying = false;
} else {
currentScreen = (currentScreen + 1) % 3;
}
switch (currentScreen) {
case 0:
drawHomeScreen();
break;
case 1:
drawSettingsScreen();
break;
case 2:
drawTotalizersScreen();
break;
}
delay(300); // Anti-rebote
}
switch (currentScreen) {
case 0:
handleHomeScreen();
break;
case 1:
handleSettingsScreen();
break;
case 2:
handleTotalizersScreen();
break;
}
}
void drawFooter() {
// Dibujar el footer en la parte inferior de la pantalla
tft.fillRect(0, 220, 320, 20, ILI9341_DARKGREY);
// Dibujar el botón de AJUSTES
tft.drawRect(10, 222, 140, 16, ILI9341_WHITE);
tft.setCursor(20, 224);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
tft.println("AJUSTES");
// Dibujar el botón de TOTALIZADORES
tft.drawRect(170, 222, 140, 16, ILI9341_WHITE);
tft.setCursor(180, 224);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
tft.println("TOTALIZADORES");
}
void drawHomeScreen() {
tft.fillScreen(ILI9341_BLACK);
tft.setCursor(0, 0);
tft.setTextColor(ILI9341_RED);
tft.setTextSize(2);
tft.println("SYNERGY GROUP");
tft.println("CEL 3105883746");
tft.setCursor(0, 50);
tft.setTextColor(ILI9341_GREEN);
tft.setTextSize(2);
tft.println("Estado de E/S:");
drawFooter();
}
void handleHomeScreen() {
updateDisplay();
// Iniciar vacío cuando se detecte el microswitch activado (en alto)
if (digitalRead(MICROSWITCH_PIN) == LOW && !vacuumActive && !sealActive && !coolingActive) {
startVacuum();
}
if (vacuumActive && (millis() - vacuumStartTime >= vacuumDuration)) {
stopVacuumAndStartSeal();
}
if (sealActive && (millis() - sealStartTime >= sealDuration)) {
stopSealAndStartCooling();
}
if (coolingActive && (millis() - coolingStartTime >= coolingDuration)) {
stopCooling();
}
delay(100);
}
void drawSettingsScreen() {
tft.fillScreen(ILI9341_BLACK);
tft.setCursor(0, 0);
tft.setTextColor(ILI9341_GREEN);
tft.setTextSize(2);
tft.println("Ajustes de Tiempos");
drawVariable("Vacuum Time: ", vacuumDuration / 1000, 30, selectedVariable == 0, isModifying);
drawVariable("Seal Time: ", sealDuration / 1000, 70, selectedVariable == 1, isModifying);
drawVariable("Cooling Time: ", coolingDuration / 1000, 110, selectedVariable == 2, isModifying);
drawVariable("Temp Level: ", temperatureLevel, 160, selectedVariable == 3, isModifying);
drawFooter();
}
void drawVariable(const char* label, int value, int y, bool selected, bool modifying) {
tft.setCursor(0, y);
tft.setTextSize(2);
if (selected) {
if (modifying) {
tft.setTextColor(ILI9341_RED, ILI9341_WHITE); // Invertido
} else {
tft.setTextColor(ILI9341_YELLOW);
}
} else {
tft.setTextColor(ILI9341_WHITE);
}
tft.print(label);
tft.println(value);
}
void handleSettingsScreen() {
if (!isModifying) {
if (digitalRead(BUTTON_D) == LOW) {
selectedVariable = (selectedVariable + 1) % 4;
drawSettingsScreen();
delay(300); // Anti-rebote
}
if (digitalRead(BUTTON_E) == LOW) {
selectedVariable = (selectedVariable - 1 + 4) % 4;
drawSettingsScreen();
delay(300); // Anti-rebote
}
if (digitalRead(BUTTON_F) == LOW) {
isModifying = true;
drawSettingsScreen();
delay(300); // Anti-rebote
}
} else {
if (digitalRead(BUTTON_D) == LOW) {
adjustVariable(-1);
drawSettingsScreen();
delay(300); // Anti-rebote
}
if (digitalRead(BUTTON_E) == LOW) {
adjustVariable(1);
drawSettingsScreen();
delay(300); // Anti-rebote
}
if (digitalRead(BUTTON_F) == LOW) {
isModifying = false;
drawSettingsScreen();
delay(300); // Anti-rebote
}
}
}
void adjustVariable(int adjustment) {
switch (selectedVariable) {
case 0:
vacuumDuration += adjustment * 1000;
if (vacuumDuration < 1000) vacuumDuration = 1000;
break;
case 1:
sealDuration += adjustment * 1000;
if (sealDuration < 1000) sealDuration = 1000;
break;
case 2:
coolingDuration += adjustment * 1000;
if (coolingDuration < 1000) coolingDuration = 1000;
break;
case 3:
temperatureLevel += adjustment;
if (temperatureLevel < 0) temperatureLevel = 0;
if (temperatureLevel > 2) temperatureLevel = 2;
break;
}
}
void drawTotalizersScreen() {
tft.fillScreen(ILI9341_BLACK);
tft.setCursor(0, 0);
tft.setTextColor(ILI9341_GREEN);
tft.setTextSize(2);
tft.println("Totalizadores");
tft.setCursor(0, 40);
tft.setTextSize(2);
tft.print("Horas Trabajadas: ");
tft.println(totalHoursWorked);
tft.setCursor(0, 80);
tft.setTextSize(2);
tft.print("Mantenimientos: ");
tft.println(maintenanceCount);
tft.setCursor(0, 120);
tft.setTextSize(2);
tft.print("Ciclos Completos: ");
tft.println(cycleCount);
drawFooter();
}
void handleTotalizersScreen() {
// Aquí puedes añadir lógica para actualizar los totalizadores si es necesario
}
void updateDisplay() {
tft.setCursor(0, 80);
tft.setTextColor(ILI9341_WHITE, ILI9341_BLACK);
tft.setTextSize(1);
// Actualizar entradas
tft.println("Entradas:");
for (int i = 0; i < numInputs; i++) {
int state = digitalRead(inputPins[i]);
tft.print("Pin ");
tft.print(inputPins[i]);
tft.print(": ");
tft.println(state == HIGH ? "ALTO" : "BAJO ");
}
// Actualizar salidas
tft.println("\nSalidas:");
for (int i = 0; i < numOutputs; i++) {
int state = digitalRead(outputPins[i]);
tft.print("Pin ");
tft.print(outputPins[i]);
tft.print(": ");
tft.println(state == HIGH ? "ALTO" : "BAJO ");
}
// Mostrar los valores de los temporizadores
tft.setTextSize(3);
if (vacuumActive) {
tft.setCursor(0, 180);
tft.setTextColor(ILI9341_WHITE, ILI9341_BLACK);
tft.print("Vacuum Timer: ");
tft.println((vacuumDuration - (millis() - vacuumStartTime)) / 1000);
}
if (sealActive) {
tft.setCursor(0, 200);
tft.setTextColor(ILI9341_WHITE, ILI9341_BLACK);
tft.print("Seal Timer: ");
tft.println((sealDuration - (millis() - sealStartTime)) / 1000);
}
if (coolingActive) {
tft.setCursor(0, 220);
tft.setTextColor(ILI9341_WHITE, ILI9341_BLACK);
tft.print("Cool Timer: ");
tft.println((coolingDuration - (millis() - coolingStartTime)) / 1000);
}
}
void startVacuum() {
digitalWrite(VACUUM_PUMP_PIN, HIGH);
digitalWrite(VACUUM_VALVE_PIN, HIGH);
vacuumStartTime = millis();
vacuumActive = true;
sealActive = false;
coolingActive = false;
tft.fillScreen(ILI9341_BLACK);
tft.setCursor(0, 0);
tft.setTextColor(ILI9341_GREEN);
tft.setTextSize(2);
tft.println("Vacuum Started");
}
void stopVacuumAndStartSeal() {
digitalWrite(VACUUM_PUMP_PIN, LOW);
digitalWrite(SEAL_VALVE_PIN, HIGH);
digitalWrite(SEAL_HEATER_PIN, HIGH);
sealStartTime = millis();
vacuumActive = false;
sealActive = true;
tft.fillScreen(ILI9341_BLACK);
tft.setCursor(0, 0);
tft.setTextColor(ILI9341_GREEN);
tft.setTextSize(2);
tft.println("Seal Started");
}
void stopSealAndStartCooling() {
digitalWrite(SEAL_HEATER_PIN, LOW);
coolingStartTime = millis();
sealActive = false;
coolingActive = true;
tft.fillScreen(ILI9341_BLACK);
tft.setCursor(0, 0);
tft.setTextColor(ILI9341_GREEN);
tft.setTextSize(2);
tft.println("Cooling Started");
}
void stopCooling() {
digitalWrite(SEAL_VALVE_PIN, LOW);
digitalWrite(VACUUM_VALVE_PIN, LOW); // Cambia el estado de la válvula de vacío al finalizar todo el proceso
coolingActive = false;
cycleCount++; // Incrementa el contador de ciclos
tft.fillScreen(ILI9341_BLACK);
tft.setCursor(0, 0);
tft.setTextColor(ILI9341_GREEN);
tft.setTextSize(2);
tft.println("Cycle Completed");
}