/*
Forum: https://forum.arduino.cc/t/drehzahlmesser-am-auto/1396866/8
Wokwi: https://wokwi.com/projects/437095304399799297
*/
#include <util/atomic.h>
constexpr byte inPin {3};
constexpr uint16_t pulseProRotation {161};
constexpr unsigned long messIntervall {1000};
unsigned long letzteMessung = 0;
uint16_t Drehzahl = 0;
uint16_t impulsZaehler = 0;
uint16_t impulsZaehlerCopy = 0;
void setup() {
Serial.begin(115200);
pinMode(inPin, INPUT);
attachInterrupt(digitalPinToInterrupt(inPin), ImpulsLesen, FALLING);
startSimulation();
}
void ImpulsLesen() {
static unsigned long letzterPuls = 0;
if (micros() - letzterPuls > 2) {
letzterPuls = micros();
impulsZaehler++;
}
}
void loop() {
if (millis() - letzteMessung >= messIntervall) {
letzteMessung = millis();
ATOMIC_BLOCK(ATOMIC_FORCEON)
{
impulsZaehlerCopy = impulsZaehler;
impulsZaehler = 0;
}
Drehzahl = (1.0 * impulsZaehlerCopy / pulseProRotation) * (60000UL / messIntervall) ;
Serial.print(impulsZaehlerCopy);
Serial.print('\t');
Serial.println(Drehzahl);
}
}
/*************************************************************************************/
/* Dieser Teil ist für das Simulieren der Pulse für die Drehzahlmessung erforderlich */
#include <TimerOne.h>
constexpr byte outPin {4};
unsigned long interval;
float zielDrehzahl = 2000;
byte togglePin = 0;
void startSimulation() {
pinMode(outPin, OUTPUT);
togglePin = 1 << outPin;
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;
}
/*************************************************************************************/