Zeit zwischen Tasterdruck und Spannungsausfall messen

Guten Abend zusammen,

ich habe bereits mehrere Threads zum Zeitmessen zwischen zwei Signalen gelesen, doch leider konnte ich keines auf mein spezifisches Problem adaptieren und hoffe hier auf eure Hilfe bzw. Expertise.

Zum Vorhaben: Ich möchte nach Betätigen eines Taster die Zeit bis zum Spannungsausfall messen. Die Werte werden im Millisekunden Bereich liegen. Soweit so gut :smiley:

Ich hatte es erst über einen Code aus einem Thread von Sept. 2013 probiert:

unsigned long Startzeit = 0;
unsigned long Dauer = 0;
float Spannung = 0;

...

void loop() {
  
  if (digitalRead(Taster)==HIGH){
    Startzeit = millis();
  }
   if ( Spannung==0.00){
    Dauer =  millis() - Startzeit;
  }  
}

Doch die Zeit stoppt erst, wenn ich von 230V auf 0V und dann hier auf 230V gehe.
[Ich simuliere das bei Thinkcad über ein Poti, welches ich dann über den map-Befehl von 0-1023 auf 0 - 230 rechne]. Teilweise musste ich auch erst von 0V auf 230V und dann wieder auf 0V gehen, dass die Dauer festgehalten wird.

Ich hoffe jemand hat eine Alternative oder eine Anpassung, dass mein Projekt doch noch Realität werden kann :upside_down_face:

Viele Grüße

Olf

i'm confused. by "power failure" do you mean when the arduino loses power or some other device while the arduino still has power?

i don't believe there is a need to proportionally translate your power voltage to something within range an arduino. or is there?

with an appropriate resistance and voltage limiting diodes, an opto-coupler can be driven and safely sensed by an arduino if there is sufficient voltages at the the input

Es ist selten eine gute Idee float auf Gleichheit zu testen.

Wie ist der Taster angeschlossen? Das ist wichtig zu wissen und fehlt in Deinem Schnipsel.
Bei Zeiträumen im ms-Bereich spuckt Dir das prellen des Tasters dazwischen.

Du merkst Dir nicht, das die Taste gedrückt wurde. Bei jedem Umlauf wird bei gedrückter Taste Startzeit neu gesetzt.

Moin,

@my_xy_projekt den Taster speise ich über die 5V vom Board und gebe sie einfach auf einen digitalen Eingang. Da ich zur Zeit noch in Thinkercad simuliere bin ich aber noch weit entfernt von Millisekunden und eher im Sekundenbereich und habe trotzdem diese Probleme, dass die Zeit nicht richtig erfasst wird. In der Realität wird die Dauer in etwa 0,4s betragen, ist dass dann schon ein Problem mit dem prellen?

@combie alles klar, passe ich an. Welche Hintergrund hat das? Das ich evt. 0,01 habe und dann nicht stoppe? Ich hatte aber teilweise auch <= 1 probiert und ebenfalls keinen Erfolg gehabt :frowning:

Das funktioniert nicht.
Der Pegel muss auch wieder LOW werden.
Dazu einen Widerstand zwischen GND und PIN - irgendwas zwischen 2 und 5 Kohm der Wert ist unkritisch - dann kannst Du HIGH auswerten.
Oder was einfacher ist:
im Setup den PULLup aktivieren mit INPUT_PULLUP und dann den Taster ggn. GND schalten.
Und dann auch noch einen Merker, das Du die Taste gedrückt hast und schon geht das in die richtige Richtung.

1 Like

Die Spannung wird nie 100% auf null, null null absinken. Je nach Innenwiderstand des Meßgerätes mißt Du mehr oder weniger Spannung.
Da Du von den Werten her, die Netzspannung messen willst hast Du auch noch das Problem daß diese 50 Hz Wechselspannung ist die mehr oder weniger sinusförmig ist. Wenn Du diese gleichrichtest und glättest hast Du schon von der Glättung her Verspätungen von einigen 50 bis weit über 100mS bis die Spannung auf Werte absinkt, die man als "keine Spannung" ansehen kann.
Ich sehe bei Netzspannung nur die Möglichkeit die Sinuskurve aufzunehmen und diese zu analisieren. Diese muß nicht 230V sein sondern kann auch über einen Transformator (Nicht Netzteil) auf verträgliche und ungefährliche Werte gebracht werden.

Wie schon erwähnt kommt dann in der realen Welt auch noch das Tasterprellen dazu.

Grüße Uwe

1 Like

Vielen Dank @my_xy_projekt, ich glaube das hilft mir bei der Startbedingung für das Zählen enorm. Mir war diese Problematik gar nicht bewusst, dass geht dann ja in die Richtung von Flanke etc. . Wird auf jeden Fall gleich angepasst ^^

Hast du eine Idee weshalb die Stopp-Bedingung nicht so funktioniert wie sie sollte? Nicht mal bei Thinkercad... Diese If-Schleife soll "einfach" unterbrochen werden, wenn die Spannung 0 ist, natürlich erst nachdem der Taster gedrückt wurde.

Ich hab mal was eingetackert - kompiliert ist aber ungetestet.

const byte tasterPin = 2;
const byte ausloeserPin = A0;
boolean tasterMerker = false;
unsigned long startTime = 0;
void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  pinMode(tasterPin, INPUT_PULLUP);
}

void loop()
{
  if (!tasterPin && !tasterMerker)
  {
    startTime = millis();
    tasterMerker = true;
  }

  if (tasterMerker && analogRead(ausloeserPin) < 50) // Danke Wno158
  {
Serial.println(millis()-startTime);
  }
}

Sag mal, ob das in der Simu läuft.
Hinweis: da ich den Merker nicht zurücksetze, kannst Du nur einmal auslösen und musst dann neu starten.

Nochwas zu der Erkennung ob der Saft weg ist.
Ich würde einen Optokoppler nehmen, bei dem eingangsseitig das Sinus glatt gemacht wird und dann auf der Ausgangsseite den logischen Pegel 0/1 auswerten.

Hallo Uwe, ehrlich gesagt habe ich mir noch nicht richtig Gedanken zum Thema "Spannung messen" gemacht, da ich bereits bei den Start- und Stoppbedinungen der If-Schleife scheiterte... Das diese Problematiken aufkommt dachte ich mir zwar, hatte aber auch gehofft, dass es fertige Module fürn Arduino gibt?! Ich werde mal die Tage nach Lösungen forschen, danke für den Denkanstoß!

Grüße Olf

Da müssen wir aber noch schnell die Klammer verschieben:

analogRead(A0) < 50

Gruß Walter

2 Likes

Mehr noch, die Deklaration auch nutzen.
Danke :wink:

1 Like

Ich habs mal so reingehauen und musste feststellen, dass es nicht so wirklich funktioniert - sorry-. Ich hänge dir noch ein Bild an, vielleicht kannst du mal drüber schauen. Nur mit

analogRead(A0) < 50

ging es leider nicht. Ich hatte dann nochmal probiert die 0 - 1023 vom A0 auf 0 - 230 zu mappen, doch das ging leider auch nicht. Das Programm startet, der Taster gibt zumindest auch das LOW-Signal drauf (Augenscheinlich)-, ich bekomme aber keine Dauer im Serialmonitor raus...

Oder hab ich nen groben Fehler gemacht oder etwas übersehen?

Gruß

Olf

Der Taster muss zwischen PIN2 und GND.
Kein Widerstand da ran. die gesamte rote Leitung ist zuviel.
Dann ersetz mal das:

durch:

  if (tasterMerker)
  {
   
    Serial.println(analogRead(ausloeserPin));
    if (analogRead(ausloeserPin) < 50)
    {
      Serial.println(millis() - startTime);
    }
  }

und las Dir einfach die Werte ausgeben.

Leider verzeichne ich immer noch keinen Erfolg... ich hatte den Code aus eurer "Symbiose" @wno158 @my_xy_projekt mal bei Thinkercad reingehauen, da das Poti aus sonst welchen Gründen nur "14" statt den 10 Bit angezeigt hat, habe ich auf einen Schalter gewechselt.

Ist vielleicht auch in sofern sinnvoll, wenn ich an deinem Gedanke mit dem Optokoppler dranbleibe, aber das hat erstmal Zeit. Ich drücke den Taster und anschließend den Schalter, die Multimeter zeigen auch einen Spannungseinbruch- bzw. anstieg doch im Serialmonitor kommt deine Zeitdifferenz raus :frowning:

Hat wer einen Lösungsansatz? Gibt es Fehler im Code oder der Verdrahtung? Ich stehe momentan leider echt auf dem Schlauch...

Trotzdem bedanke ich mich schonmal bei allen für eure Zeit und Mühe die in euren Antworten steckt :smiley:

Ich hatte jetzt nochmal in die "Startbedinungen" eine Ausgabe für den Serielmonitor gepackt;

{
  if (!tasterPin && !tasterMerker)
  {
    startTime = millis();
    tasterMerker = true;
    Serial.println("Gedrückt");
  }

Doch nicht mal das zeigt er mir im Serielmonitor an... :frowning:
Kann das an am Pullup liegen? Weil laut Multimeter gibt es einen Spannungseinbruch...vielleicht liegt hier der Ursprung des Bösen?

Wenn Deine Variablenbezeichnungen stimmen, sollte tasterPin nicht 0 werden können, wenn Du nicht Pin 0 gewählt hast.

Gruß Tommy

tasterPin ist 2
!tasterPin wird zu false ausgewertet
false && irgendwas wird immer zu false

Also wird der Anweisungsblock des if nie ausgeführt.

Natürlich nicht!
Es tut genau das, was du da programmiert hast.

Ich wäre völlig geschockt, wenn dein Serial.print() ausgeführt werden würde.

Der Fehler liegt wie (fast) immer im OSI Schichten Modell auf Ebene 8.

1 Like

Für Leser, die das OSI-Modell nicht kennen: Der Fehler sitzt meist vorm Monitor :wink:

Gruß Tommy

https://datatracker.ietf.org/doc/html/rfc2321