#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Definición de pines de botones
#define BUTTON_1_PIN 2
#define BUTTON_2_PIN 0
#define BUTTON_3_PIN 4
#define BUTTON_4_PIN 16
#define BUTTON_RESET_PIN 18
// Dirección I2C de la pantalla LCD
#define LCD_ADDRESS 0x27
// Creación de instancia de la pantalla LCD
LiquidCrystal_I2C lcd(LCD_ADDRESS, 16, 2);
// Variables para el conteo
volatile int count1 = 0;
volatile int count2 = 0;
volatile int count3 = 0;
volatile int count4 = 0;
// Variables para el estado de los botones
volatile bool button1State = false;
volatile bool button2State = false;
volatile bool button3State = false;
volatile bool button4State = false;
volatile bool buttonResetState = false;
// Variables para el enclavamiento de botones
volatile bool button1Locked = false;
volatile bool button2Locked = false;
volatile bool button3Locked = false;
volatile bool button4Locked = false;
volatile bool buttonResetLocked = false;
void setup() {
// Inicialización de la pantalla LCD
lcd.init();
lcd.backlight(); // Enciende la luz de fondo
// Mostrar mensaje de bienvenida
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Bienvenido!");
delay(2000); // Espera 2 segundos antes de continuar
lcd.clear();
// Inicialización de los pines de botones como entrada
pinMode(BUTTON_1_PIN, INPUT_PULLUP);
pinMode(BUTTON_2_PIN, INPUT_PULLUP);
pinMode(BUTTON_3_PIN, INPUT_PULLUP);
pinMode(BUTTON_4_PIN, INPUT_PULLUP);
pinMode(BUTTON_RESET_PIN, INPUT_PULLUP);
}
void loop() {
// Leer el estado actual de los botones
button1State = digitalRead(BUTTON_1_PIN) == LOW;
button2State = digitalRead(BUTTON_2_PIN) == LOW;
button3State = digitalRead(BUTTON_3_PIN) == LOW;
button4State = digitalRead(BUTTON_4_PIN) == LOW;
buttonResetState = digitalRead(BUTTON_RESET_PIN) == LOW;
// Botón 1
if (button1State && !button1Locked) {
button1Locked = true;
while (button1State) {
for (int i = 0; i <= 3; i++) {
count1 = i; // Ciclo entre 0 y 3
displayCount("conteo 0-3:", count1);
delay(1000); // Retardo para mostrar el siguiente número
}
}
button1Locked = false;
}
// Botón 2
if (button2State && !button2Locked) {
button2Locked = true;
while (button2State) {
for (int i = 0; i <= 6; i++) {
count2 = i; // Ciclo entre 0 y 6
displayCount("conteo 0-6:", count2);
delay(1000); // Retardo para mostrar el siguiente número
}
}
button2Locked = false;
}
// Botón 3
if (button3State && !button3Locked) {
button3Locked = true;
while (button3State) {
for (int i = 0; i <= 9; i++) {
count3 = i; // Ciclo entre 0 y 9
displayCount("conteo 0-9:", count3);
delay(1000); // Retardo para mostrar el siguiente número
}
}
button3Locked = false;
}
// Botón 4 (Paro de emergencia)
if (button4State && !button4Locked) {
button4Locked = true;
// Detener todos los conteos
count1 = 0;
count2 = 0;
count3 = 0;
count4 = 0;
// Desbloquear todos los botones
button1Locked = false;
button2Locked = false;
button3Locked = false;
buttonResetLocked = false;
// Mostrar mensaje de paro de emergencia
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Paro de");
lcd.setCursor(0, 1);
lcd.print("Emergencia");
while(button4State); // Espera a que se suelte el botón
}
// Botón de reinicio
if (buttonResetState && !buttonResetLocked) {
// Restablecer variables de conteo
count1 = 0;
count2 = 0;
count3 = 0;
count4 = 0;
// Desbloquear todos los botones
button1Locked = false;
button2Locked = false;
button3Locked = false;
button4Locked = false;
buttonResetLocked = true;
// Mostrar mensaje de reinicio
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Simulacion");
lcd.setCursor(0, 1);
lcd.print("reiniciada");
delay(2000); // Espera 2 segundos antes de continuar
lcd.clear();
}
}
// Función para mostrar el conteo en la pantalla LCD
void displayCount(String label, int value) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(label);
lcd.setCursor(0, 1);
lcd.print(value);
}