/*
Forum: https://forum.arduino.cc/t/unterscheidung-dauer-und-rechtecksignal/1157204
Wokwi: https://wokwi.com/projects/373346939661441025
*/
constexpr int ledPin = 12; // Soll leuchten, wenn Eingang blinkt
constexpr int leddau = 11; // Soll leuchten, wenn Eingang DAUER-an ist
constexpr int button = 13; // Simulationstaster
constexpr int signalOut = 8; //
int mode = 0;
bool doReset = true;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(leddau, OUTPUT);
pinMode(button, INPUT_PULLUP);
pinMode(signalOut, OUTPUT);
Serial.begin(115200);
Serial.println("Eingabe: ");
Serial.println("0 für LOW Signal an Pin 13 ");
Serial.println("1 für HIGH Signal an Pin 13 ");
Serial.println("2 für Rechteck an Pin 13 ");
}
void loop() {
handleSerial();
createSignal();
if (signalIstRechteck(400)) {
rechteckErkannt();
} else {
keinRechteckErkannt();
}
}
void handleSerial(){
if (Serial.available()) {
char c = Serial.read();
switch (c) {
case '0' : mode = 0;
doReset = true;
break;
case '1' : mode = 1;
doReset = true;
break;
case '2' : mode = 2;
doReset = true;
break;
}
}
}
void createSignal(){
switch (mode) {
case 0 : digitalWrite(signalOut, LOW);
break;
case 1 : digitalWrite(signalOut, HIGH);
break;
case 2 : signalRechteck(400);
break;
}
}
void rechteckErkannt() {
digitalWrite(ledPin, HIGH);
digitalWrite(leddau, LOW);
}
void keinRechteckErkannt() {
digitalWrite(ledPin, LOW);
byte buttonState = digitalRead(button);
digitalWrite(leddau, buttonState);
}
// Erzeugt Rechtecksignale, die interval [ms] Periodendauer aufweisen
void signalRechteck(unsigned long interval) {
static unsigned long lastChange;
if (millis() - lastChange >= interval) {
lastChange = millis();
byte sig = digitalRead(signalOut);
digitalWrite(signalOut, !sig);
}
}
// Erkennt Rechtecksignale, die maximal Dauer [ms] Periodendauer aufweisen
boolean signalIstRechteck(unsigned long Dauer) {
static unsigned long lastSignalChange;
static byte lastValue;
boolean static istRechteck = false;
unsigned long diff;
byte actValue = digitalRead(button);
if (doReset) {
doReset = false;
lastValue = actValue;
istRechteck = false;
}
if (actValue != lastValue) {
diff = millis() - lastSignalChange;
lastSignalChange = millis();
lastValue = actValue;
if (diff <= Dauer) {
istRechteck = true;
} else {
istRechteck = false;
}
}
return istRechteck;
}