#include <AccelStepper.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Configuración de la pantalla LCD
LiquidCrystal_I2C lcd(0x27, 16, 2); // Ajusta la dirección I2C según tu pantalla
// Configuración del motor
AccelStepper stepper(AccelStepper::DRIVER, 3, 4); // Pulso en 3, dirección en 4
int stepsPerRevolution = 800;
float rpm = 0; // RPM actual
int maxRPM = 100; // Límite superior de RPM
int encoderIncrement = 5; // Incremento de RPM por paso del encoder
// Variables del encoder
const int encoderCLK = 10;
const int encoderDT = 11;
const int encoderSW = 9;
int lastCLK = HIGH;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 5; // Retraso para evitar rebotes (en ms)
float min;
// Variables para la lógica del encoder
int lastEncoderValue = 0;
bool encoderButtonPressed = false;
void setup() {
// Inicializar pantalla LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("RPM:");
// Configuración de pines del encoder
pinMode(encoderCLK, INPUT_PULLUP);
pinMode(encoderDT, INPUT_PULLUP);
pinMode(encoderSW, INPUT_PULLUP);
// Configuración del motor
stepper.setMaxSpeed(stepsPerRevolution); // Máxima velocidad en pasos por segundo
stepper.setAcceleration(50); // Aceleración en pasos/segundo^2
// Establecer RPM inicial en la pantalla
displayRPM();
}
void loop() {
// Leer el encoder
int currentCLK = digitalRead(encoderCLK);
// Detectar cambios en el encoder (giros)
if ((millis() - lastDebounceTime) > debounceDelay) {
if (currentCLK != lastCLK) {
if (digitalRead(encoderDT) != currentCLK) {
// Giró en sentido horario, aumentar RPM
rpm = min(rpm + encoderIncrement, maxRPM);
} else {
// Giró en sentido antihorario, disminuir RPM
rpm = max(rpm - encoderIncrement, 0);
}
displayRPM(); // Actualizar pantalla LCD con el nuevo valor
lastDebounceTime = millis();
}
}
lastCLK = currentCLK;
// Leer el botón del encoder
if (digitalRead(encoderSW) == LOW) {
encoderButtonPressed = true;
}
// Establecer la velocidad del motor
if (rpm > 0) {
float stepsPerSecond = (rpm / 60.0) * stepsPerRevolution; // Convertir RPM a pasos por segundo
stepper.setSpeed(stepsPerSecond);
stepper.runSpeed(); // Ejecutar el motor
} else {
stepper.stop(); // Detener el motor si la RPM es 0
}
}
// Función para mostrar las RPM en la pantalla LCD
void displayRPM() {
lcd.setCursor(5, 0);
lcd.print(" "); // Limpiar la línea
lcd.setCursor(5, 0);
lcd.print(rpm);
lcd.setCursor(11, 0);
lcd.print("RPM");
}