Hola a todos
Estoy realizando un programa para leer los RPMs de un ventilador de 3 pines, este circuito incluye un pushbutton de inicio y una pantalla LCD (el botón y la pantalla tienen luces led) estoy usando un Arduino Mega 2560.
El programa consiste en que al presionar el botón, se encienda el ventilador, lea los RPMs por 7 seg. aproximadamente, y de una respuesta... Si los rpms estan dentro del valor, la respuesta sera "paso prueba" en LCD, y el LCD y el pushbutton encenderán en verde, en caso contrario de que el valor este por debajo se imprimirá "fallo prueba" y el pushbutton encenderán en rojo, por 4 segundos, y volverá a inicio a estado de "listo para probar"
Todo funciona excepto que los 7 segundos que debería tardar leyendo los RPMs mientras en el LCD dice "probando"... en esos 7 segundos deja de leer los RPM..... Estoy utilizando interrupciones para leer los RPMs es por eso que no funciona el Delay, soy relativamente nueva en programación, me ayudan con algun modo de que me lea los RPM y me haga el delay al mismo tiempo? ya intente con millis y con banderas pero creo que aun no soy buena usándolos porque no logree que quedara ![]()
/*
Filename: RPM Ventilador 3 pines
*/
#include <LiquidCrystal.h>
//Inicializar los pines conectados a la pantalla
LiquidCrystal lcd(53, 37, 39, 41, 43, 45);
static int PulsosFan; // contador de impulsos
const int hallsensor = 18; // pin 2, que está unido a interrupción 0
int Ventilador = 28; // pin de encendido/apagado del ventilador
int Boton = 42; // boton de inicio
// LED indicador de la prueba
int Boton_enable = 36;
int Boton_green = 38;
int Boton_red = 40;
int rpms;
bool banderaint = 1;
bool valor,anterior;
// LCD indicador de la prueba
int LCD_blue = 49;
int LCD_green = 47;
int LCD_red = 51;
void setup()
{
lcd.begin(16, 2); // Inicia la interfaz para el LCD screen, y determina sus dimensiones (ancho,alto) en este caso (16x2)
pinMode(Ventilador, OUTPUT);
pinMode(Boton, INPUT_PULLUP);
pinMode(Boton_enable, OUTPUT);
pinMode(Boton_green, OUTPUT);
pinMode(Boton_red, OUTPUT);
digitalWrite(Boton_enable, HIGH);
pinMode(LCD_green, OUTPUT);
pinMode(LCD_red, OUTPUT);
pinMode(LCD_blue, OUTPUT);
digitalWrite(LCD_blue, HIGH);
lcd.blink(); // Displayamos el Blinking del Cursor sobre el LCD
delay(2000);
lcd.noBlink(); // Apagamos el Blinking del Cursor sobre el LCD
lcd.print("INICIANDO..."); // Imprime "INICIAR PRUEBA" en pantalla
delay(2000);
lcd.clear();
pinMode(hallsensor, INPUT);
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(hallsensor), rpm, RISING);
}
void loop() {
inicio:
banderaint = 1; // empieza la interrupción
lcd.clear();
delay(10);
lcd.print("READY TO TEST");
lcd.setCursor(0,0);
delay(999); // retardo de casi 1 segundo
Serial.print(PulsosFan * 30); // como son dos interrupciones por vuelta (contador * (60/2))
Serial.println("RPM");
rpms = PulsosFan * 30;
PulsosFan = 0;
valor = digitalRead(Boton);
if (!valor && anterior){
delay(50);
digitalWrite(Ventilador, HIGH); // se enciende ventilador
lcd.clear();
delay(50);
lcd.print("Probando..."); // imprime "Probando..." en pantalla
delay(7000);
if ((rpms >= 8800) && (rpms <= 13, 200)) {
digitalWrite(Ventilador, LOW); // se apaga ventilador
lcd.clear();
delay(50);
lcd.print("PASO PRUEBA"); // imprime "PASO PRUEBA" en pantalla
digitalWrite(LCD_blue, LOW); // se apaga pantalla zaul
digitalWrite(Boton_green, HIGH); // se enciende led verde
digitalWrite(LCD_green, HIGH); // se enciende pantalla verde
delay(4000); // se mantiene led verde y mensaje "PASO PRUEBA" durante 4 segundos
digitalWrite(Boton_green, LOW); // se apaga led verde
digitalWrite(LCD_green, LOW); // se apaga pantalla verde
digitalWrite(LCD_blue, HIGH); // se enciende pantalla azul
lcd.clear();
delay(50);
}
else {
digitalWrite(Ventilador, LOW); // se apaga ventilador
lcd.clear();
delay(50);
lcd.print("FALLO PRUEBA"); // imprime "FALLO PRUEBA" en pantalla
digitalWrite(LCD_blue, LOW); // se apaga pantalla zaul
digitalWrite(Boton_red, HIGH); // se enciende led rojo
digitalWrite(LCD_red, HIGH); // se enciende pantalla rojo
delay(4000); // se mantiene led rojo y mensaje "PASO PRUEBA" durante 4 segundos
digitalWrite(Boton_red, LOW); // se apaga led rojo
digitalWrite(LCD_red, LOW); // se apaga pantalla rojo
digitalWrite(LCD_blue, HIGH); // se enciende pantalla azul
lcd.clear();
delay(50);
}
banderaint = 0; // termina interrupción
Serial.println(rpms);
}
anterior = valor;
goto inicio;
}
void rpm() // función que se ejecuta durante cada interrupción
{
if (banderaint == 1) {
PulsosFan++; // se incrementa en uno el contador
}
}
Espero puedan ayudarme
llevo semanas con esto ![]()