#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include <AccelStepper.h>
#include <Keypad.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1 // El pin RESET de la pantalla OLED, puede dejarse sin conectar
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Define los pines del motor
#define motorStepPin 25
#define motorDirPin 26
// Define los pines del teclado
const byte ROWS = 4; // Cuatro filas
const byte COLS = 4; // Cuatro columnas
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {4, 5, 18, 19}; // Conecta a los pines de las filas
byte colPins[COLS] = {13, 12, 14, 27}; // Conecta a los pines de las columnas
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
// Define el objeto del motor paso a paso
AccelStepper stepper(1, motorStepPin, motorDirPin);
// Variables globales
int vueltasRealizadas = 0;
void setup() {
// Inicializa la pantalla OLED
Serial.begin(9600);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
while (1);
}
// Inicializa el motor
stepper.setMaxSpeed(500);
stepper.setAcceleration(500);
// Inicializa el teclado
keypad.setDebounceTime(10);
Serial.begin(9600);
}
void loop() {
char key = keypad.getKey();
if (key != NO_KEY) {
int targetPosition = key - '0'; // Convierte el carácter a un número
targetPosition *= 200; // Multiplica por la cantidad de grados que deseas que gire el motor (por ejemplo, 360 grados por número)
// Gira el motor al destino
stepper.moveTo(targetPosition);
while (stepper.distanceToGo() != 0) {
stepper.run();
}
// Actualiza las vueltas realizadas
vueltasRealizadas += targetPosition / 200;
// Actualiza la pantalla OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("Vueltas: ");
display.println(vueltasRealizadas);
display.display();
}
}