#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
volatile unsigned long currentTime;
volatile unsigned long startTime;
volatile unsigned long elapsedTime;
volatile float rpm;
volatile int pulses;
int selectedTime = 0;
int motorPin = 7;
int buzzerPin = 8;
int startButtonPin = 9;
int timeSelectButtonPin = 10;
bool motorRunning = false;
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print(" RR&JJ");
lcd.setCursor(0, 1);
lcd.print(" Iniciando...");
pinMode(2, INPUT);
attachInterrupt(0, countPulses, RISING); // Usa la interrupción 0 para el encoder
pinMode(motorPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(startButtonPin, INPUT_PULLUP);
pinMode(timeSelectButtonPin, INPUT_PULLUP);
delay(1000);
lcd.clear();
lcd.print(" SELECCIONAR ");
lcd.setCursor(0, 1);
lcd.print(" TIEMPO");
}
void loop() {
// Verificar si se ha presionado el botón de selección de tiempo
if (digitalRead(timeSelectButtonPin) == LOW) {
delay(200); // Debounce
selectedTime++;
if (selectedTime > 15) {
selectedTime = 0; // Reiniciar el contador de tiempo después de 15 minutos
}
displayTimeSelection();
}
// Verificar si se ha presionado el botón de inicio
if (digitalRead(startButtonPin) == LOW && !motorRunning) {
delay(50); // Debounce
startMotor();
}
// Verificar si el motor está en funcionamiento y actualizar el tiempo restante en el display
if (motorRunning) {
updateDisplay();
checkStopConditions();
}
}
void countPulses() {
pulses++; // Cuenta un pulso
if (pulses >= 8) {
pulses = 0; // Reinicia el contador después de 8 pulsos (una revolución)
}
}
void startMotor() {
lcd.clear();
lcd.print("Starting Motor");
digitalWrite(motorPin, HIGH);
startTime = millis();
motorRunning = true;
}
void updateDisplay() {
currentTime = millis();
elapsedTime = (currentTime - startTime) / 1000 / 60; // Convertir a minutos
rpm = (float) (pulses * 60.0) / 8.0; // Calcula RPM teniendo en cuenta los 8 pulsos por revolución
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("RPM: ");
lcd.print(rpm);
lcd.setCursor(0, 1);
lcd.print("Tiempo -: ");
lcd.print(selectedTime - elapsedTime);
lcd.print(" min");
}
void checkStopConditions() {
if (elapsedTime >= selectedTime) {
stopMotor();
}
}
void stopMotor() {
lcd.clear();
lcd.print("Finalizando");
digitalWrite(motorPin, LOW);
digitalWrite(buzzerPin, HIGH); // Activar el buzzer
delay(1000);
digitalWrite(buzzerPin, LOW);
motorRunning = false;
pulses = 0;
delay(10000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" Fin de");
lcd.setCursor(0,1);
lcd.print(" Centrifugado");
delay(60000);
displayTimeSelection();
}
void displayTimeSelection() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Tiempo: ");
lcd.print(selectedTime);
lcd.print(" min");
}