#include <Stepper.h>
#include <LiquidCrystal_I2C.h>
const int stepsPerRevolution = 200;
const int potPin = A0;
const int buttonPin = 2;
const int emergencyButtonPin = 3;
int potValue = 0;
int targetAngle = 0;
int currentPosition = 0;
bool returningToZero = false;
bool motorEnabled = false;
int buttonPressCount = 0;
Stepper myStepper(stepsPerRevolution, 11, 10, 9, 8);
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(emergencyButtonPin, INPUT_PULLUP);
myStepper.setSpeed(60);
lcd.init();
lcd.noBacklight();
lcd.setCursor(0, 0);
lcd.print("Angulo: ");
}
void loop() {
bool buttonState = digitalRead(buttonPin);
bool emergencyButtonState = digitalRead(emergencyButtonPin);
if (emergencyButtonState == LOW) {
motorEnabled = false;
lcd.noBacklight();
buttonPressCount = 0;
}
if (buttonState == LOW) {
delay(50);
if (buttonState == LOW) {
buttonPressCount++;
if (buttonPressCount > 4) {
buttonPressCount = 0;
}
}
delay(200);
}
if (buttonPressCount == 1) {
motorEnabled = true;
myStepper.setSpeed(30); // Baja velocidad
lcd.backlight();
lcd.setCursor(0, 1);
lcd.print("Velocidad baja ");
} else if (buttonPressCount == 2) {
motorEnabled = true;
myStepper.setSpeed(60); // Media velocidad
lcd.backlight();
lcd.setCursor(0, 1);
lcd.print("Velocidad media ");
} else if (buttonPressCount == 3) {
motorEnabled = true;
myStepper.setSpeed(120); // Alta velocidad
lcd.backlight();
lcd.setCursor(0, 1);
lcd.print("Velocidad alta ");
} else if (buttonPressCount == 4) {
motorEnabled = false;
lcd.noBacklight();
lcd.setCursor(0, 1);
lcd.print("Apagado ");
}
if (motorEnabled && buttonPressCount != 0) {
potValue = analogRead(potPin);
targetAngle = map(potValue, 0, 1023, 0, 180);
lcd.setCursor(8, 0);
lcd.print(" ");
lcd.setCursor(8, 0);
lcd.print(targetAngle);
int targetSteps = map(targetAngle, 0, 180, 0, stepsPerRevolution);
if (!returningToZero && currentPosition < targetSteps) {
myStepper.step(1);
currentPosition++;
} else if (!returningToZero && currentPosition > targetSteps) {
myStepper.step(-1);
currentPosition--;
} else if (!returningToZero && currentPosition == targetSteps) {
returningToZero = true;
} else if (returningToZero && currentPosition != 0) {
myStepper.step(-1);
currentPosition--;
} else if (returningToZero && currentPosition == 0) {
returningToZero = false;
}
}
delay(10);
}