Buenas trades
Estoy realizando un proyecto de un contador de piezas con arduino, estoy usando un tecldo matricial par ingresar la cantidad a contar una pantalla lcd 16x2 con interfaz i2c y un sensor infrarojo coar contar las piezas y quiero agregarle un motor paso a paso que gire una banda cuando inicie el contador y se detenga cuando el sensor temine de contar las piezas ingrsadas con el teclado.
la cuestion es que no logro que el motor gire y el sensor cuente a la vez
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <Stepper.h>
// Inicializar el LCD
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Definir el teclado matricial
const byte ROWS = 4;
const byte COLS = 3;
char keys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// Definir el pin del sensor infrarrojo
const int sensorPin = 2;
// Definir los pines del motor paso a pas
#define STEPS 2038 // Número de pasos para una vuelta completa (28BYJ-48)
#define IN1 10
#define IN2 11
#define IN3 12
#define IN4 13
// Crear un objeto de la clase Stepper
Stepper stepper(STEPS, IN1, IN3, IN2, IN4);
int cantidadPiezas = 0;
int piezasContadas = 0;
bool nuevoConteo = false;
void setup() {
// Inicializar el LCD
lcd.init();
lcd.backlight();
// Inicializar el motor paso a paso
stepper.setSpeed(15); // Velocidad baja para 28BYJ-48
// Mostrar instrucciones iniciales en el LCD
lcd.setCursor(0, 0);
lcd.print("Ingrese cantidad");
lcd.setCursor(0, 1);
lcd.print("de piezas:");
}
void loop() {
// Leer la entrada del teclado
char key = keypad.getKey();
// Si se presiona un número, actualizar la cantidad de piezas
if (key >= '0' && key <= '9') {
// Convertir el carácter numérico a un entero y sumarlo a la cantidad actual
int numero = key - '0';
cantidadPiezas = cantidadPiezas * 10 + numero;
// Actualizar el LCD con la cantidad ingresada
lcd.setCursor(0, 1);
lcd.print(" "); // Limpiar la línea anterior
lcd.setCursor(0, 1);
lcd.print("Ingresada: ");
lcd.print(cantidadPiezas);
delay(200); // Pequeño retardo para evitar rebotes del botón
} else if (key == '#') { // Si se presiona '#', comenzar a contar con el sensor infrarrojo
// Limpiar el LCD
lcd.clear();
//
// Mostrar mensaje de inicio de conteo en el LCD
lcd.setCursor(0, 0);
lcd.print("Ingresada: ");
lcd.print(cantidadPiezas);
lcd.setCursor(0, 1);
lcd.print("Contando...");
//Iniciar el motor paso a paso
stepper.step(STEPS * cantidadPiezas);
// Establecer la cantidad contada como cero
piezasContadas = 0;
// Iniciar el conteo de piezas
while (piezasContadas < cantidadPiezas) {
if (digitalRead(sensorPin) == HIGH) {
// Si se detecta una pieza, incrementar el contador de piezas contadas
piezasContadas++;
// Actualizar el LCD con la cantidad contada
lcd.setCursor(0, 1);
lcd.print("Contando: ");
lcd.print(piezasContadas);
delay(100); // Retardo para evitar contar varias veces la misma pieza
}
// Verificar si se ha solicitado un nuevo conteo
if (nuevoConteo) {
nuevoConteo = false;
break;
}
}
// Detener el motor paso a paso
stepper.step(0);
// Mostrar mensaje de finalización en el LCD
lcd.clear();
lcd.print("Conteo completo!");
// Esperar un momento antes de mostrar la cantidad contada
delay(2000);
// Mostrar la cantidad contada en el LCD
lcd.clear();
lcd.print("Contadas: ");
lcd.print(piezasContadas);
// Esperar hasta que se presione una tecla para volver a ingresar la cantidad
while (keypad.getKey() != '#');
// Limpiar el LCD y reiniciar la cantidad de piezas
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Ingrese cantidad");
lcd.setCursor(0, 1);
lcd.print("de piezas:");
cantidadPiezas = 0;
} else if (key == '*') { // Si se presiona '*', solicitar nuevo conteo
nuevoConteo = true;
}
}