Aus meiner Version musste ich noch ein paar Fehler beseitigen.
- das Runden der Frequenz war falsch
- die Dauer eines Zyklus erfasste nur einen Halbzyklus.
const byte pulsePin = 2;
const byte outPin = 3;
volatile unsigned long duration;
volatile bool newDurationAvailable;
volatile bool gleicheFrequenz;
unsigned long edgeUp;
unsigned long edgeDown;
unsigned long downDuration;
unsigned long upDuration;
void takeEdges() {
static byte currCycle;
byte currState = digitalRead(pulsePin);
if (gleicheFrequenz || currCycle & 1) {
digitalWrite(outPin, currState);
}
if (currState) {
edgeUp = micros();
downDuration = edgeUp - edgeDown;
} else {
edgeDown = micros();
upDuration = edgeDown - edgeUp;
if (!newDurationAvailable) {
duration = upDuration + downDuration;
currCycle++;
newDurationAvailable = true;
}
}
}
void setup() {
Serial.begin(115200);
//pinMode(pulsePin, INPUT_PULLUP);
pinMode(outPin, OUTPUT);
attachInterrupt(digitalPinToInterrupt(pulsePin), takeEdges, CHANGE);
}
unsigned long lastPrint;
void loop() {
unsigned long topLoop = millis();
if (newDurationAvailable) {
unsigned long frequency = 1000000L / duration;
gleicheFrequenz = frequency < 3;
if (topLoop - lastPrint >= 100) {
Serial.print(F("duration: "));
Serial.print(duration);
Serial.print(F(" frequency: "));
Serial.print(frequency);
Serial.print(gleicheFrequenz ? F(" gleiche") : F(" halbe"));
Serial.println(F(" Ausgabefrequenz"));
lastPrint = topLoop;
}
newDurationAvailable = false;
}
}