/*
Wokwi | questions
Maquina expendedora
IanVsGaming - Thursday, February 12, 2026 10:20 AM
Project Link: https://wokwi.com/projects/455667190298274817?gh=1
*/
#include <LiquidCrystal.h>
#include <ESP32Servo.h> //Se utilizan las librerías correspondientes al lcd y al servo
//Se definen las entradas de los leds
int led1 = 21;
int led2 = 18;
int led3 = 17;
int led4 = 4;
int led5 = 13;
//Se definen las entradas de los botones
int btnCocaCola = 22;
int btnPepsi = 19;
int btn7Up = 5;
int btnMountainDew = 16;
int btnBlanco = 15;
int btnVb = 23;
// Se definen los estados de la FSM
enum states {
REPOSO, //Sucede cuando la máquina no ha empezado a trabajar
BIENVENIDA, //Da la bienvenida al usuario
DINERO, //El usuario "ingresa dinero" presionando un botón, la máquina solo permite Q10.00
SELECCION, //El usuario escoge la bebida
DISPENSANDO, //Se dispensa la bebida y se simula con el servo
DISPENSADO, //La bebida ha sido dispensada
VUELTO, //El lcd manda un mensaje con el vuelto correspondiente, todas las bebidas valen Q5.00
DESPEDIDA //Se despide del usuario y le agradece por su compra
};
//Registra que bebida ha sido seleccionada y el tiempo que es dispensada
states currentState = BIENVENIDA;
int selectedDrink = 0; //selección
int dispenseTime = 0; //tiempo
//Se definen las entradas de la pantalla y el servo motor
LiquidCrystal lcd(14, 27, 26, 25, 33, 32);
Servo servoMotor;
void setup() {
//Se declara la función de cada componente
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT); //Este led es una entrada ya que se debe realizar una acción para que se apague
pinMode(btnCocaCola, INPUT_PULLUP);
pinMode(btnPepsi, INPUT_PULLUP);
pinMode(btn7Up, INPUT_PULLUP);
pinMode(btnMountainDew, INPUT_PULLUP);
pinMode(btnBlanco, INPUT_PULLUP);
pinMode(btnVb, INPUT_PULLUP);
lcd.begin(16, 2); //Se inicia el lcd
Serial.begin(9600); //Se inicia el servo
servoMotor.attach(12); //Pin correspondiente al servo
}
void loop() {
//Se programa la máquina de estados finitos (Máquina Expendedora de Bebidas)
switch (currentState) {
case BIENVENIDA:
digitalWrite(led5, HIGH); //Indica que no se ha ingresado dinero
lcd.clear(); //Limpia cualquier mensaje previo en el LCD
lcd.print("Bienvenido!");
delay(2000); //Espera 2 segundos antes de cambiar de mensaje
lcd.clear();
lcd.print("Ingrese dinero:");
delay(1000); // 1 seg
currentState = DINERO; //Cambia al estado DINERO
break;
case DINERO:
break;
}
}