#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int pinMonedero = 2;
const int pinBoton1 = 4;
const int pinBoton2 = 5;
const int pinBoton3 = 6;
const int pinBoton4 = 7;
const int pinRele1 = 8; // Relé para motor 1
const int pinRele2 = 9; // Relé para motor 2 (NUEVO)
const int pinRele3 = 10; // Relé para motor 3 (NUEVO)
const int pinRele4 = 11; // Relé para motor 4 (NUEVO)
int creditos = 0;
unsigned long tiempoInicio = 0;
bool motorEncendido = false;
// Variables para el texto caminante
String mensaje = " Producto A=$1.00 | Producto B=$2.00 | Producto C=$1.00 | Producto D=$2.00 "; // Espacios al inicio y fin para que no se pegue
unsigned long ultimoMovimiento = 0;
int posicion = 0;
void setup() {
pinMode(pinMonedero, INPUT_PULLUP);
pinMode(pinBoton1, INPUT_PULLUP);
pinMode(pinBoton2, INPUT_PULLUP);
pinMode(pinBoton3, INPUT_PULLUP);
pinMode(pinBoton4, INPUT_PULLUP);
pinMode(pinRele1, OUTPUT);
pinMode(pinRele2, OUTPUT); // Configuramos el nuevo relé
pinMode(pinRele3, OUTPUT);
pinMode(pinRele4, OUTPUT); // Configuramos el nuevo relé
digitalWrite(pinRele1, LOW); // Apagado inicial
digitalWrite(pinRele2, LOW); // Apagado inicial
digitalWrite(pinRele3, LOW); // Apagado inicial
digitalWrite(pinRele4, LOW); // Apagado inicial
lcd.init();
lcd.backlight();
actualizarLCD();
}
void loop() {
// 1. Lógica del Monedero: Cada pulso suma 25 centavos
if (digitalRead(pinMonedero) == LOW) {
creditos += 25;
actualizarLCD();
delay(100); //velocidad de lectura del fichero
}
// 2. Lógica Producto A (cuesta 100 centavos / $1.00)
if (digitalRead(pinBoton1) == LOW) {
if (creditos >= 100 && !motorEncendido) {
despachar(100, pinRele1, "Producto A"); // Envia precio y qué relé activar
} else if (creditos < 100) {
mostrarError(100);
}
delay(1000);
}
// 2.1 Lógica Producto B (Cuesta 200 centavos / $2.00)
if (digitalRead(pinBoton2) == LOW) {
if (creditos >= 200 && !motorEncendido) {
despachar(200, pinRele2, "Producto B"); // Envia precio y qué relé activar
} else if (creditos < 200) {
mostrarError(200);
}
delay(1000);
}
// 3. Lógica Producto C (cuesta 100 centavos / $1.00)
if (digitalRead(pinBoton3) == LOW) {
if (creditos >= 100 && !motorEncendido) {
despachar(100, pinRele3, "Producto C"); // Envia precio y qué relé activar
} else if (creditos < 100) {
mostrarError(100);
}
delay(1000);
}
// 3.1 Lógica Producto D (Cuesta 200 centavos / $2.00)
if (digitalRead(pinBoton4) == LOW) {
if (creditos >= 200 && !motorEncendido) {
despachar(200, pinRele4, "Producto D"); // Envia precio y qué relé activar
} else if (creditos < 200) {
mostrarError(200);
}
delay(1000);
}
// 4. Revisión de tiempo ENCENDIDO DEL MOTOR
if (motorEncendido && (millis() - tiempoInicio >= 5000)) {
digitalWrite(pinRele1, LOW); // Apaga ambos por seguridad
digitalWrite(pinRele2, LOW);
digitalWrite(pinRele3, LOW); // Apaga ambos por seguridad
digitalWrite(pinRele4, LOW);
motorEncendido = false;
actualizarLCD();
}
// 5. Efecto de texto caminante cada 300 milisegundos
if (!motorEncendido && millis() - ultimoMovimiento > 300) {
lcd.setCursor(0, 1);
// Mostramos un trozo del mensaje según la posición actual
lcd.print(mensaje.substring(posicion, posicion + 16));
posicion++;
if (posicion > mensaje.length() - 16) posicion = 0; // Reinicia el letrero
ultimoMovimiento = millis();
}
}
// 6. Función actualizada para mostrar "Despachando..."
void despachar(int precio, int pinRel, String nombreProducto) {
creditos -= precio;
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Despachando..."); // ¡Aquí está el mensaje que pediste!
lcd.setCursor(0,1);
lcd.print(nombreProducto); // ¡Aquí está el mensaje que pediste!
digitalWrite(pinRel, HIGH); // Enciende solo el motor seleccionado
tiempoInicio = millis();
motorEncendido = true;
}
void mostrarError(int precio) {
lcd.clear();
lcd.print("INSERTE CREDITO");
lcd.setCursor(0,1);
lcd.print("Necesita: $");
lcd.print(precio / 100.0); // Dividimos por 100 para mostrar en formato $X.XX
delay(500);//tiempo que despliega el mensaje INSERTE CREDITO
actualizarLCD();
}
void actualizarLCD() {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Credito: $");
lcd.print(creditos / 100.0); // Mostramos el total como decimal para el usuario
lcd.setCursor(0,1);
lcd.print("1:$1.00 2:$2.00");
}