/*
Forum: https://forum.arduino.cc/t/drehzahlmesser-am-auto/1396866/8
Wokwi: https://wokwi.com/projects/437099518400803841
Version auf Basis des Originalsketches zzgl.
- der Simulation der Drehzahlpulse per Timer
- der seriellen Ausgabe der Drehzahl
2025/07/22
ec2021
*/
unsigned long myTimeDZMImpuls = 0;
unsigned long myTimeZeitIm = 0;
double Drehzahl = 0;
int impulszz = 0;
int zeitimpuls = 0;
void setup()
{
pinMode(3, INPUT);
attachInterrupt(digitalPinToInterrupt(3), ImpulsLesen, FALLING);
starteSimulation(1000);
}
void ImpulsLesen() {
if (micros() - myTimeDZMImpuls > 2) {
impulszz = impulszz + 1;
myTimeDZMImpuls = micros();
}
}
void loop()
{
if (impulszz > 1610)
{
zeitimpuls = millis() - myTimeZeitIm;
Drehzahl = (60000 / zeitimpuls);
Drehzahl = Drehzahl * 10;
impulszz = 0;
myTimeZeitIm = millis();
Serial.println(Drehzahl);
}
}
/*************************************************************************************/
/* Dieser Teil ist für das Simulieren der Pulse für die Drehzahlmessung erforderlich */
#include <TimerOne.h>
constexpr byte outPin {4};
constexpr unsigned long pulseProRotation {161};
unsigned long interval;
float zielDrehzahl = 1260;
byte togglePin = 0;
void starteSimulation(float ziel) {
Serial.begin(115200);
pinMode(outPin, OUTPUT);
togglePin = 1 << outPin;
zielDrehzahl = ziel;
interval = round(1000000.0 / ((zielDrehzahl / 60.0) * pulseProRotation));
Serial.println(interval);
Timer1.initialize(interval);
Timer1.attachInterrupt(timer_isr);
}
void timer_isr() {
PIND = togglePin;
delayMicroseconds(3);
PIND = togglePin;
}
/*************************************************************************************/