Zeit zwischen Tasterdruck und Spannungsausfall messen

wo er recht hat, hat er recht.
Und ja, ich bin da ganz böse eingestiegen.

Ein vorgesetztes digitalRead wird das auflösen:

if (!digitalRead(tasterPin))

Ja perfekt, danke für eure Hilfe! Es funktioniert, im Serialmonitor bekomme ich nun die Zeitdifferenz raus. Doch sobald ich den Taster alias zukünftiger Optokoppler wieder los lasse, geht auch das Zählen logischer Weise weiter. Gibt es daher eine Möglichkeit, das mit dem Taster auch die "zweite" If-Abfrage unterbrochen wird und mir der Wert ausgegeben wird?

Viele Dank für eure Hilfe und noch einen schönen Abend!

Olf

Es ist leider so, dass ich aus tiefstem Herzen destruktiv bin.
if-schleife

Nur um hier mal den Focus zu setzen um das beklemmende Gefühl loszuwerden:
Nicht jeder Nutzer mag mit der Darlegungsform eines anderen konform gehen.
Der Sprachgebrauch spielt dabei sicher eine entscheidende Rolle.

Dein "konstruktiv" gibt ggfls. eine abwertende Haltung ggü. denjenigen vor, die sich nicht direkt an Dich gewandt haben und einen Code als Lösung präsentierten. Jeder für sich hat aber konstruktiv an der Lösungsfindung teilgenommen.

Das las ich so stehen.

Ok. Wenn es jetzt anläuft, dann suchen wir:

Ja.
Auch das lässt sich verhindern.
Nur als Kurzsketch.
Ich hab reingeschrieben, was ICH da erwarte.

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

void loop()
{
  // in der folgenden Zeile
  // Taste: "gedrückt" UND Taste vorher: "nicht gedrückt" UND Zustand: "nicht gemessen"
  if ((!digitalRead(tasterPin)) && !tasterMerker && !ausloeserMerker)
  {
    startTime = millis();
    tasterMerker = true; // "Taste vorher gedrückt" jetzt wahr
  }
  // in der folgenden Zeile
  // Taste gedrückt UND Wert unterschreitet Grennzwert
  if (tasterMerker && analogRead(ausloeserPin) < 50)
  {
    Serial.println(millis() - startTime);
    ausloesermerker = true;  // setzt Zustand: "gemessen"
  }
}

Egal, ob das so funktioniert oder nicht...
Auch Du wirst um eine Schrittkette nicht herum kommen, denn die if's werden irgendwann so umfangreich und umständlich.....
Aber erstmal machen. Damit klar wird, wohin das geht.
Die Idee dahinter ist, das es so nur einmal durchläuft - danach muss neu gestartet werden. - das lässt sich dann später noch ändern.....

Ach. lass gut sein....
Ich bin von Natur aus egoistisch und böse, das weiß jeder hier.
Selbst dir ist das klar..... wenn du mal in dich hinein horchst....

Das sehe ich nicht so. Es gibt von Dir immer wieder fachlich sehr gute Impulse, die beides nicht sind. Also weiter so.

Gruß Tommy

ups, das war leider etwas missverständlich ausgedrückt und ich wollte nichts unterbewusst implizieren. Ich bin wirklich jedem für seinen Beitrag und vor allem für seine Unterstützung dankbar, auch wenn ich sie nicht auf Anhieb fachlich verstehe, so denke ich, trägt sie doch zur Zielerreichung bei. Deshalb Entschuldigung an alle, die sich auf dem Fuß getreten fühlen... ich nehme das Wörtchen raus.

Ich denke Tommy hat es damit echt gut aufm Punkt gebracht, @combie dein Beitrag war definitiv wichtig und das „konstruktiv“ in keinem Fall ironisch oder herabsetzend zu verstehen. Deshalb nochmals danke speziell auch dann dich für deinen fachlichen Input :smiley:

Ich setze mich morgen an dran und haue es in die Simu rein und probiere den Code zu verstehen.

Danke und schönen Abend

Olf

Das Programm ist für mich soweit verständlich und nachvollziehbar, danke für die hilfreichen Kommentare. Leider liegt der gleiche Fehler wie davor vor, mit dem Drücken des zweiten Tasters, also der Stopp-Bedingung, hält das Programm nur so lange an, wie ich den Taster auch drücke. Beim Loslassen geht das Gezähle dann sukzessiv weiter... :frowning:

Vielleicht hat ja noch wer einen einfallsreichen Gedanken, wenn nicht ist auch nicht schlimm :smiley: Die Suche nach einem geeignete Optokoppler (230V, max. 80A + passen für den Arduino) stellt sich als schwierig raus, aber das soll mein Sorge bleiben.
Ich möchte daher den Ehrgeiz des einzelnen nicht unterbinden, bedanke mich aber herzlich bei allen, die hier bei dem Thread mitgewirkt haben - Danke-

Viele Grüße

Olf

Naja, wenn Du den auch anhalten willst, dann musst Du einfach die Bedingung erweitern:

// Taste gedrückt UND Wert unterschreitet Grennzwert UND bisher nicht ausgelöst
  if (tasterMerker && analogRead(ausloeserPin) < 50 && !ausloesermerker)

Wozu soll der OK 80A?
Das soll doch nur ein Verbindungsglied werden und kein Stromsensor.

Hatte Dir geschrieben daß ein kleiner Trafo mit 3V Ausgangsspannung auch geeignet dazu ist. Brückengleichrichter dran und schon hast Du einen Spannung zum Messen.

zB Block VB 2,3/1/24 Printtransformator 1 x 230 V/AC 1 x 24 V/AC 2.30 VA kaufen oder ein sehr altes Händyladenetzteil wo das Händy noch NiMH Akkus hatte und das Netzteil schwerer als das Händy war. Wenn Die Spannung zu hoch ist dann eventuell einen Spannungsteiler.

Grüße Uwe

Klasse, das funktioniert ausgezeichnet!!! :grin:

Der Hintergrund des ganzen Projektes war, die Zeit zu detektieren, die eine Sicherung zum Auslösen benötigt. Mit dem ersten Tasterdruck schließe ich über ein Schütz L1 und N kurz, der Optokoppler sollte dann die Ausschaltbedingung liefern, also wenn die Sicherung ausgelöst hat und 0V anliegen. Da die Steckdosen aber i.R. mit dem B16 LS abgesichert sind, beträgt der Kurzschlussstrom je nach Schleifenimpendanz bis zu 80A für ein sicheres Auslösen. Und diese Stromspitze würde dann im Idealfall für 0,4sec über die eine Seite vom Optokoppler fließen...

Ist definitiv auch einen Gedanken wert, ich muss nochmal die genauen Eckdaten raus arbeiten und drüber sinnieren. Doch es freut mich erstmal, dass das Programm danke eurer tatkräftigen Hilfe läuft :smiley:

Der Optokoppler (ein normaler) geht in weniger als 0,0001s vollständig in Rauch auf.

Ja das hatte ich auch vermutet, allein die Querschnitte des Optokoppler oder die ganze Elektronik dessen sind dafür einfach nicht ausgelegt. Ich vermute deshalb, dass es der Gnadenstoß für das kleine "Projekt" ist. Ich denke ich werde dann Richtung S7 in Kombination mit nem Simocode gehen... :shushing_face:

Auch eine S7 geht in 0,0001s vollständig in Rauch auf.
Damit ist dir nicht geholfen.

Ja, dafür ist aber der Simocode, mit dem kann ich ja die wichtigsten Kenndaten von zum Beispiel einem Motors berührungslos feststellen, also z.B Frequenz und Strom. Ich nutze diesen dann wie ein Zangenampermeter um den Strom statt der Spannung als Stoppbedingung zu detektieren. Die Startbedingung bleibt ja unverändert und geht dann einfach auf den digitalen Eingang der SPS :smiley:

Wieso kommst du auf die Idee, dass dein Arduino das nicht könnte?
(ich verstehe dich immer weniger)

Das Problem ist ja nicht das nicht-können des Arduinos sondern eher die Umsetzung dessen.
Wenn ich schon Fragen bei diesem "einfacheren" Code habe, wird mir denke ich eine Implementierung von Profibus oder MODBUS RTU beim Arduino etwas schwerer fallen. Bei der SPS bin ich sozusagen im bekannten Terrain...

Nö.
Die Fragestellung bestimmt die Antwort.

Schau, wie lange ich gebraucht habe um Dein 'Problem' zu erkennen.
Trotzdem freue ich mich darüber Dein Ausgangsproblem gelöst zu haben.
:wink:

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.