//CASO COMPLETO CON TECLADO MATRICIAL, DISPLAY DE 20X4 Y CONTROLADOR DVR8825, reemplazar por DMA860E es puramente descriptivo peor no cambia lo funcional.

#include <AccelStepper.h>
#include <LiquidCrystal.h>
#include <Keypad.h>

// Configura los pines para el controlador DRV8825
const int stepPin = 10; // Pin para el pulso (STEP)
const int dirPin = 11;  // Pin para la dirección (DIR)

// Configura los pines para el controlador ULN2003
//const int In1 = 10
//const int In1 = 11
//const int In1 = 12
//const int In1 = 13

// Crea una instancia de AccelStepper
AccelStepper stepper(AccelStepper::DRIVER, stepPin, dirPin);

//Comentar la línea anterior y Activar la línea siguiente si se va usar ULN2003
//AccelStepper stepper(AccelStepper::FULL4WIRE, In1, In3, In2, In4); 
//(Keep in mind that the step sequence for these motors is IN1-IN3-IN2-IN4)

// Usamos display I2C
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 20, 4);

// Configura el teclado matricial (ajusta según tu conexión)
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; //Conecta los pines del teclado a estos pines digitales
byte colPins[COLS] = {5, 4, 3, 2};

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

//Variable para el nuevo ángulo
//int oldAngle = 0; //variable pensada para implementar un movimiento incremental

void setup() {
  lcd.begin(20, 4); // Inicializa el display LCD (20 columnas x 4 filas)
  lcd.print("Control de Corona"); // Muestra instrucciones en la primera línea
  lcd.setCursor(0, 1);
  lcd.print("Ingrese Angulo:"); // Instrucciones en la segunda línea

  // Configura la velocidad máxima y la aceleración
  stepper.setMaxSpeed(1000); // Ajusta la velocidad máxima según tus necesidades
  stepper.setSpeed(1000);

  stepper.setAcceleration(100); // Ajusta la aceleración según tus necesidades

  
}

void loop() {
  // Espera a que se ingrese el ángulo desde el teclado
  int angle = readAngleFromKeypad();
  
  // Calcula los pasos necesarios para el ángulo ingresado
  int totalSteps = 200; // Ejemplo: motor NEMA 17 con 1.8 grados por paso (200 pasos por revolución)
  int stepsNeeded = calculateStepsForAngle(angle, totalSteps);

 
  // Muestra el resultado en el display
  lcd.clear();
  lcd.print("Angulo:");
  lcd.print(angle);
  //lcd.setCursor(0, 1);
  lcd.print(" Pasos:");
  lcd.print(stepsNeeded);

 // Mueve la corona al ángulo deseado
  //stepper.moveTo(stepsNeeded);
 //  stepper.run();
  
// Set the target position:
  stepper.moveTo(stepsNeeded);
  // Run to target position with set speed and acceleration/deceleration:
  stepper.runToPosition();

  // Espera un tiempo para mostrar la posición final (opcional)
  delay(2000); // Puedes ajustar el tiempo según tus necesidades
  lcd.setCursor(0, 1);
  lcd.print("Pos. final: ");
  //lcd.setCursor(0, 3);
  lcd.print(stepper.currentPosition());
  
  //oldAngle = angle;
  
  lcd.setCursor(0, 2);
  lcd.print("Angulo final: ");
  lcd.print(angle);
  lcd.setCursor(0, 3);  
  lcd.print("Ingrese nuevo Angulo:");
}

// Función para leer el ángulo desde el teclado
int readAngleFromKeypad() {
  String input = "";
  char key;
  while (input.length() < 3) { // Asumimos que el ángulo es de 000 a 360 grados
    key = keypad.getKey();
    if (key) {
      input += key;
      delay(100); // Pequeña pausa para evitar lecturas duplicadas
    }
  }
  return input.toInt();

}


// Función para calcular los pasos necesarios para un ángulo dado

int calculateStepsForAngle(int angle, int totalSteps) {
  // Calcula los pasos necesarios para el ángulo deseado
  // (360 grados = totalSteps pasos)
  return map(angle, 0, 360, 0,totalSteps);

//return map(-angle, 0, 360, 0,totalSteps); //pensada para movimientos incrementales
 
}
Loading chip...chip-scope
A4988