Tacometro no baja revoluciones a 0 progresivamente

Hola que tal pasa que debemos de entregar un tacometro hecho con arduino 1 , motor amarillo , iman, pwm, diodo, potenciometro, sensor de efecto hall, pantalla LSD 1602A, ya lo pusimos a prueba y hasta ahi todo bien mide las revoluciones y numero de vueltas pero el unico problema es que al tener revoluciones bajas no decrementa la cuenta hasta 0, se queda en un numero de revoluciones por arriba de 25 , ya buscamos 1001 formas y no nos ha funcionado , estaria bastante agradecido si nos pudieran ayudar , cabe recalcar que mi profesor no acepta que de 25 revoluciones pasa a 0 cuando deje de detectar campo magnetico, les paso el codigo.

#include <LiquidCrystal.h>

const int sensorPin = 9;
unsigned long tiempoActual = 0;
unsigned long tiempoAnterior = 0;
int vueltaCount = 0;
int currentSensorValue;
int previousSensorValue = HIGH;
double velocidad = 0;
int rpm = 0;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Pines para el LCD

void setup() {
lcd.begin(16, 2);
pinMode(sensorPin, INPUT);
Serial.begin(9600);
}

void loop() {
currentSensorValue = digitalRead(sensorPin);
// Detectar transición de HIGH a LOW (imán detectado)
if (currentSensorValue == LOW && previousSensorValue == HIGH) {
vueltaCount++;
calcularRPM();
mostrarLCD();
previousSensorValue = LOW;
} else if (currentSensorValue == HIGH && previousSensorValue == LOW) {
previousSensorValue = HIGH;
}
}

void calcularRPM() {
tiempoActual = micros();
unsigned long tiempoDiferencia = tiempoActual - tiempoAnterior;

if (tiempoDiferencia > 0) {
rpm = 60000000 / tiempoDiferencia; // Calcular RPM directamente
tiempoAnterior = tiempoActual;
}
}

void mostrarLCD() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("RPM: ");
lcd.print(rpm);
lcd.setCursor(0, 1);
lcd.print("Vuelta: ");
lcd.print(vueltaCount);
delay(500);
}

He trasladado su tema de una categoría de idioma inglés del foro a la categoría International > Español @hugo051002.

En adelante por favor usar la categoría apropiada a la lengua en que queráis publicar. Esto es importante para el uso responsable del foro, y esta explicado aquí la guía "How to get the best out of this forum".
Este guía contiene mucha información útil. Por favor leer.

De antemano, muchas gracias por cooperar.

Por favor edita tu post y adjunta el código de acuerdo a las Normas del Foro en Español, punto 7.

El problema es el delay() en mostrarLCD().
Esos 500 ms amplían la diferencia real entre pulsos entonces tiempoDiferencia es mayor de lo que debería.
Quita ese delay()

Otra cosa es que la medición de los pulsos se hace con interrupciones.
La presentación de las RPM requiere que tengas una ventana de tiempo (generalmente 1 seg) que muchos hace usando delay pero tmb puede hacerse con millis().
cada vez que se cumple la ventana, pones a 0 el contador de pulsos, calculas, presentas las RPM y vuelves a ajustar el timer para la siguiente lectura.
Te dejo un ejemplo

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.