Der gewünschte Zustand wäre, dass die LED an PIN 12 nur leuchtet, wenn am PIN 13 ein Rechtecksignal anliegt.
Wenn PIN 13 auf dauer-HIGH ist, soll nur LED an PIN 11 leuchten.
Habe mal unter den o.a. Anforderungen einen Sketch geschrieben:
/*
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;
}

Zum Ausprobieren: https://wokwi.com/projects/373346939661441025
Die Funktion void signalRechteck(unsigned long interval) erzeugt ein simples Rechtecksignal auf Pin 8, das auf Pin 13 durchgeschleift wird und eine Periodendauer von interval ms hat.
Der Zustand des Signals wird von der blauen Led angezeigt.
Die rote Led entspricht "Rechteck erkannt".
Die grüne Led leuchtet, wenn kein Rechteck erkannt, das Signal aber auf HIGH ist.
Beim Umschalten auf Rechteck leuchtet die grüne Led zunächst auf, bis das Rechteck-Signal erkannt wird.
Zwischen Signal LOW, Signal HIGH und Signal Rechteck lässt sich per serieller Eingabe von 0,1 oder 2 im Betrieb umschalten.
Die Funktion boolean signalIstRechteck(unsigned long Dauer) liest den Pin button aus und prüft bei einem Wechsel des Pegels, ob die Zeit kürzer oder gleich der Dauer [ms] war. Der Wert "Dauer" erlaubt das Eingeben einer maximal gewünschten Rechteckdauer, die noch zu einer Erkennung führen soll. Alles was dann länger dauert, wird nicht mehr als Rechteckfunktion bewertet.
Viel Erfolg!