#include <Stepper.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
const int stepsPerRevolution = 200; // Número de pasos por revolución (360 grados)
Stepper myStepper(stepsPerRevolution, 11, 10, 9, 8);
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int pinPotenciometro = A0;
const int pinBoton = 2;
const int pinEncenderApagar = 3; // Botón para encender/apagar
const int pinBotonEmergencia = 4; // Botón de emergencia
bool enEjecucion = false;
bool anguloEstablecido = false;
bool velocidadEstablecida = false;
bool ciclosEstablecidos = false;
int angulo = 0;
int velocidadMotor = 60; // Velocidad inicial
int numCiclos = 1;
unsigned long ultimoTiempo = 0;
const unsigned long debounceDelay = 200; // Retardo para debounce
void setup() {
myStepper.setSpeed(velocidadMotor);
Serial.begin(9600);
pinMode(pinBoton, INPUT_PULLUP);
pinMode(pinEncenderApagar, INPUT_PULLUP);
pinMode(pinBotonEmergencia, INPUT_PULLUP); // Configurar el botón de emergencia
lcd.init();
lcd.clear();
lcd.noBacklight(); // Apagar la retroiluminación
}
void loop() {
// Verificar si se presiona el botón de emergencia
if (digitalRead(pinBotonEmergencia) == LOW) {
reiniciarPrograma();
return; // Salir del loop inmediatamente
}
unsigned long tiempoActual = millis();
if (digitalRead(pinEncenderApagar) == LOW && (tiempoActual - ultimoTiempo) > debounceDelay) {
ultimoTiempo = tiempoActual;
if (!enEjecucion) { // Usar el botón para encender
enEjecucion = true;
lcd.backlight(); // Encender la retroiluminación
lcd.setCursor(0, 0);
lcd.print("Presione para");
lcd.setCursor(0, 1);
lcd.print("encender");
} else if (enEjecucion) { // Usar el botón para apagar
reiniciarPrograma();
}
}
if (enEjecucion) {
ejecutarPrograma();
}
}
void ejecutarPrograma() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Defina angulo");
lcd.setCursor(0, 1);
while (!anguloEstablecido) {
if (digitalRead(pinBotonEmergencia) == LOW) {
reiniciarPrograma();
return;
}
int valorPot = analogRead(pinPotenciometro);
angulo = map(valorPot, 0, 1023, 0, 360); // Ajustado a 0-360 grados
lcd.setCursor(0, 1);
lcd.print("Angulo: ");
lcd.print(angulo);
lcd.print(" "); // Para borrar caracteres sobrantes
delay(100);
if (digitalRead(pinBoton) == LOW) {
anguloEstablecido = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Defina velocidad");
lcd.setCursor(0, 1);
while (!velocidadEstablecida) {
if (digitalRead(pinBotonEmergencia) == LOW) {
reiniciarPrograma();
return;
}
int valorPot = analogRead(pinPotenciometro);
velocidadMotor = map(valorPot, 0, 1023, 0, 120); // Ajustado a 0-120 velocidad
myStepper.setSpeed(velocidadMotor);
lcd.setCursor(0, 1);
lcd.print("Velocidad: ");
lcd.print(velocidadMotor);
lcd.print(" "); // Para borrar caracteres sobrantes
delay(100);
if (digitalRead(pinBoton) == LOW) {
velocidadEstablecida = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Defina ciclos");
lcd.setCursor(0, 1);
while (!ciclosEstablecidos) {
if (digitalRead(pinBotonEmergencia) == LOW) {
reiniciarPrograma();
return;
}
int valorPot = analogRead(pinPotenciometro);
numCiclos = map(valorPot, 0, 1023, 1, 5);
lcd.setCursor(0, 1);
lcd.print("Ciclos: ");
lcd.print(numCiclos);
lcd.print(" "); // Para borrar caracteres sobrantes
delay(100);
if (digitalRead(pinBoton) == LOW) {
ciclosEstablecidos = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Listo para");
lcd.setCursor(0, 1);
lcd.print("ejecutar");
while (digitalRead(pinBoton) == HIGH) {
if (digitalRead(pinBotonEmergencia) == LOW) {
reiniciarPrograma();
return;
}
if (digitalRead(pinEncenderApagar) == LOW) { // Verificar si se presiona el botón de apagado
reiniciarPrograma();
return;
}
delay(100);
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Ejecutando...");
lcd.setCursor(0, 1);
lcd.print("Ciclos: ");
lcd.print(numCiclos);
int steps = map(angulo, 0, 360, 0, stepsPerRevolution); // Convertir ángulo a pasos
for (int i = 0; i < numCiclos; i++) {
if (digitalRead(pinBotonEmergencia) == LOW) {
reiniciarPrograma();
return;
}
myStepper.step(steps);
delay(1000);
myStepper.step(-steps);
delay(1000);
if (digitalRead(pinEncenderApagar) == LOW) { // Verificar si se presiona el botón de apagado durante la ejecución
reiniciarPrograma();
return;
}
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Ciclos terminados");
delay(3000); // Esperar 3 segundos
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Presione para");
lcd.setCursor(0, 1);
lcd.print("apagar");
while (digitalRead(pinEncenderApagar) == HIGH) { // Esperar el botón de encendido/apagado
if (digitalRead(pinBotonEmergencia) == LOW) {
reiniciarPrograma();
return;
}
delay(100);
}
reiniciarPrograma();
}
}
}
}
}
}
}
void reiniciarPrograma() {
enEjecucion = false;
anguloEstablecido = false;
velocidadEstablecida = false;
ciclosEstablecidos = false;
lcd.clear();
lcd.noBacklight(); // Apagar la retroiluminación
}