#include <Stepper.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
const int stepsPerRevolution = 200; // Ajusta esto según tu motor
// Inicializa la biblioteca Stepper en los pines 12, 13, 14 y 27:
Stepper myStepper(stepsPerRevolution, 12, 13, 14, 27);
// Definir los pines de los botones
const int buttonPin = 15; // Botón para avanzar
const int reverseButtonPin = 16; // Botón para retroceder
const int potPin = 34; // Pin donde está conectado el potenciómetro
int buttonState = 0; // Variable para almacenar el estado del botón
int reverseButtonState = 0; // Variable para el estado del botón de retroceso
int lastButtonState = 0; // Último estado del botón
int lastReverseButtonState = 0; // Último estado del botón de retroceso
bool motorMoving = false; // Controla si el motor debe moverse
bool isReversing = false; // Controla si el motor está retrocediendo
// Definir el número máximo de pasos
const int maxSteps = 30;
// Configuración de la pantalla OLED
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
void setup() {
// Configura los pines de los botones como entradas
pinMode(buttonPin, INPUT);
pinMode(reverseButtonPin, INPUT);
// Inicializa el puerto serie para la depuración
Serial.begin(9600);
// Inicializa la pantalla OLED
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Usa 0x3C como la dirección I2C
Serial.println(F("SSD1306 allocation failed"));
for (;;); // No continuar si la pantalla no está conectada
}
display.display();
// Mostrar mensaje principal antes de que inicie el sistema
display.clearDisplay();
display.setTextSize(2); // Tamaño de texto más grande
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(" Excrusor");
display.print("");
display.setTextSize(1); // Tamaño de texto más pequeño
display.setCursor(0, 20);
display.println("Ver: 1.0");
display.setCursor(0, 30);
display.println("Prog: AJ Garcia");
display.setCursor(0, 40); // Mueve el cursor a la siguiente línea
display.println("Accesor: JP Machado");
display.println("");
display.println("Iniciando programa...");
display.display();
delay(7000); // Espera 3 segundos para que el usuario vea el mensaje de entrada
// Inicializa el último estado de los botones a LOW
lastButtonState = digitalRead(buttonPin);
lastReverseButtonState = digitalRead(reverseButtonPin);
}
void loop() {
// Lee el estado de los botones
buttonState = digitalRead(buttonPin);
reverseButtonState = digitalRead(reverseButtonPin);
// Avanza el motor si el botón de avance está presionado
if (buttonState == HIGH && lastButtonState == LOW) {
// Lee el valor del potenciómetro (0-4095)
int potValue = analogRead(potPin);
// Mapea el valor del potenciómetro para obtener el número de pasos
int stepsToMove = map(potValue, 0, 4095, 1, maxSteps); // Mapea a un rango de 1 a maxSteps
// Evita que el número de pasos sea 0
stepsToMove = max(stepsToMove, 1);
// Mueve el motor el número de pasos determinado
myStepper.step(stepsToMove);
motorMoving = true;
isReversing = false; // El motor no está retrocediendo
delay(200); // Espera para evitar rebotes del botón
}
// Retrocede el motor si el botón de retroceso está presionado
if (reverseButtonState == HIGH && lastReverseButtonState == LOW) {
// Lee el valor del potenciómetro (0-4095)
int potValue = analogRead(potPin);
// Mapea el valor del potenciómetro para obtener el número de pasos
int stepsToMove = map(potValue, 0, 4095, 1, maxSteps); // Mapea a un rango de 1 a maxSteps
// Evita que el número de pasos sea 0
stepsToMove = max(stepsToMove, 1);
// Retrocede el motor el número de pasos determinado
myStepper.step(-stepsToMove);
motorMoving = true;
isReversing = true; // El motor está retrocediendo
delay(200); // Espera para evitar rebotes del botón
}
// Si el botón no está presionado, el motor permanece detenido
if (buttonState == LOW && reverseButtonState == LOW) {
motorMoving = false; // El motor está detenido
isReversing = false; // No está retrocediendo
}
// Guarda el estado actual de los botones para compararlos en la siguiente lectura
lastButtonState = buttonState;
lastReverseButtonState = reverseButtonState;
// Muestra el valor del potenciómetro y el número de pasos en la pantalla OLED
display.clearDisplay(); // Borra la pantalla antes de dibujar el nuevo contenido
display.setTextSize(1); // Tamaño del texto
display.setTextColor(SSD1306_WHITE); // Color del texto
// Muestra el valor del potenciómetro y los pasos
display.setCursor(0, 0);
display.print("Valor Pot: ");
display.println(analogRead(potPin)); // Muestra el valor del potenciómetro
display.setCursor(0, 10);
display.print("volumen ml: ");
display.println(map(analogRead(potPin), 0, 4095, 1, maxSteps)); // Muestra los pasos
// Muestra el estado del motor (en movimiento o detenido)
display.setCursor(0, 20);
if (motorMoving) {
if (isReversing) {
display.println("Motor: Reversa");
} else {
display.println("Motor: Avance");
}
} else {
display.println("Dispositivo: Detenido");
}
// Muestra la velocidad
display.setCursor(0, 30);
display.print("Velocidad: ");
display.print(map(analogRead(potPin), 0, 4095, 1, maxSteps)); // Muestra los pasos que el motor avanza por pulsación de botón
display.println(" ml/pas");
// Muestra el mensaje en la 5ª fila si el motor está retrocediendo
display.setCursor(0, 40); // Quinta fila (posición Y=40)
if (isReversing) {
display.println("EMBOLO <-REGRESANDO");
}
// Muestra el mensaje en la 5ª fila si el motor está avanzando
display.setCursor(0, 40); // Sexta fila (posición Y=50)
if (!isReversing && motorMoving) {
display.println("ENBOLO ->DISPENSANDO");
}
// Actualiza la pantalla OLED
display.display();
delay(100); // Pequeño retraso para la actualización visual
}