Habe hier einen Gerät welches beim gleichen Pin, bei zwei unterschiedlichen Funktionen eine 5V+ Puls folge rausgibt.
Bei Funktion1 15 Pulses
Bei Funktion2 30 Pulses
Ausgelesen habe ich dies an Pin 2 vom Uno mit diesem Sketch
Serial.print("Pulses per second: ");
Serial.println(pulse);
}
void count_pulse()
{
pulse++;
}
——————
Jetzt benötige ich einen Sketch welcher mir auf einem Pin das Signal ausliest und dann einen Ausgang High schaltet bei Input Pulse 15
und den gleichen Ausgang LOW (ausschaltet) bei Input Pulse 30
Die gesamte Pluskette erfolgt ab dem ersten High puls innerhalb einer Zeit von 1,2 Sek
Habe das hier gefunden wo der Rest vom Sketch fehlt.
Eine Serial Ausgabe zusätzlich zum Ausgang schalten wäre cool.
Sollte der Strom wegfallen muss der Zustand nicht gespeichert werden sondern mit Ausgang off begonnen werden.
Das ist deine Wartefunktion.
Du kannst da jetzt 1200 rein schreiben ...
Oder den Code kopieren:
void loop()
{
const unsigned long ablaufZeit = 1200; // Zeit in ms
if ((detectPulse) && (millis() - lastmillis >= ablaufZeit))
{
switch (pulseCount)
{
case 12 ... 18:
{
digitalWrite(LED_BUILTIN, HIGH);
Serial.print("on");
}
break;
case 26 ... 32:
{
digitalWrite(LED_BUILTIN, LOW);
Serial.print("off");
}
break;
default:
{
Serial.print("Unknown");
}
break;
}
pulseCount = 0;
detectPulse = false;
}
}
Das ist dann auch geklärt.
Alles gut. Hier ist in meinem Beitrag ein gutes .pdf angehangen.
Lesen von vorn bis hinten jeden Abend zur guten Nacht ein paar Seiten.
Nur wissen was drin steht - nicht auswendig lernen.
Jetzt hätte ich noch eine Verbesserung wenn das was möglich ist.
pulseCount 15 ist on - hier dauert es bedingt natürlich die 1500 Ablaufzeit bis LED_BUILTIN schaltet.
diese kann ich nicht mehr als auf 1200 zu reduzieren.
pulseCount 30 ist definitiv off das kann auch so bleiben mit 1200 Ablaufzeit.
Könnte man es so machen das wenn ein high Signal kommt (vorher pulseCount 15) -> einschaltet ohne auf die Ablaufzeit zu warten
und sobald es ein pulseCount30 innerhalb Ablaufzeit 1200 ist wie gehabt LED_BUILTIN ausschaltet.
Wie soll das funktionieren? Du weißt doch erst nach der Auswertung, was für ein Signal ankommt. So wie du es im Moment willst, würde die LED bei jedem Empfang angehen und wenn das Signal Aus bedeutet wieder ausgehen. Sprich LED ist aus, du sendest aus, LED geht an und nach der Auswertung wieder aus.
Einzig sinnvolle Weg wäre die Auswertung zu beschleunigen. In welchen Zeitfenster kommen die Pulse? Bestimmt im Millisekunden Bereich.
Vielleicht habe ich es aber auch nur falsch verstanden.
Also das ist wirr.
Wenn count15 durch ist, ist die LED an.
Wenn Du möchtest, das nach einem count30 die LED angeht, wenn der nächste Impuls kommt, geht das.
ABER!
Du weisst doch gar nicht, ob da 15 oder 30 Pulse kommen.
Ein Versuch:
void loop()
{
const unsigned long ablaufZeit = 1200; // Zeit in ms
if (detectPulse)
{
if (!digitalRead(LED_BUILTIN))
{
digitalWrite(LED_BUILTIN, HIGH);
Serial.print("on");
}
else if (millis() - lastmillis >= ablaufZeit)
{
switch (pulseCount)
{
case 26 ... 32:
{
digitalWrite(LED_BUILTIN, LOW);
Serial.print("off");
}
break;
default:
{
Serial.print("Unknown");
}
break;
}
pulseCount = 0;
detectPulse = false;
}
}
}
Wenn Du das nicht willst, dann mach es weg und prüfe wieder auf die genaue Zahl.
Und ja, ich habe das verstanden, was on und was off ist.
Ich habe Dich gefragt, ob Du sicherstellen kannst, das immer nach einem off ein on kommt. Wenn das so ist, dann kannst Du das so wie oben machen.
Wenn zweimal off kommen kann, dann hast Du ein Problem.
Also als erstes, mach mal STRG-T, damit Du den Code vernünftig formatiert bekommst.
Dann als nächstes gehe in Dein Post, und markiere den Code und drücke die Schaltfläche </>
Ah.. dann kann das auch vernüftig rauskopiert und weiterverarbeitet werden. Und vor allem gut lesbar.
So und Deine Fehlermeldung ist eine Warnung:
warning: statement will never be executed [-Wswitch-unreachable]
if (pulseCount == 63)
~~~~~~~~~~~^~~~~
Und der Kompiler hat recht.
Du kannst das switch nicht mit einem if auswerten.
Das switch-Konstrukt kann komplett raus.
Es bleibt das if übrig. Dann musst Du nur noch die Bedingungen anpassen.
Unbedingt das pdf lesen.
void loop()
{
const unsigned long ablaufZeit = 1200; // Zeit in ms
if (detectPulse)
{
if (!digitalRead(LED_BUILTIN))
{
digitalWrite(LED_BUILTIN, HIGH);
Serial.print("on");
}
else if (millis() - lastmillis >= ablaufZeit)
{
if (pulseCount == 30)
{
digitalWrite(LED_BUILTIN, LOW);
Serial.print("off");
}
else if (pulseCount != 15)
{
Serial.print("Unknown");
}
pulseCount = 0;
detectPulse = false;
}
}
}