Zeitmessung mit Füllstandssensoren, Idee umsetzbar?

Hallo Gemeinde,
ich habe ein paar Fragen zur generellen Machbarkeit eines von mir skizzierten Schemas. Zur groben Orientierung der Aufgabe: Ich möchte mit einem Arduino und dazu angeschlossenem LCD Zeiten messen und zwar auf Millisekunden genau. Das folgende aufgezeichnete Schema dient zur bildlichen Skizzierung der Aufgabe:

Schema Skizze

Bei Betätigung von Startsignal1 ODER Startsignal2 soll die Zeit1 und Zeit2 im Arduino anfangen synchron zu zählen (Stoppuhrprinzip). Wenn dann im Behälter1 der Füllstandssensor1 auslöst, soll die Zeit1 im Arduino stoppen. Wenn dann im Behälter2 der Füllstandssensor2 auslöst, soll die Zeit2 im Arduino stoppen. Dabei kann auch Füllstandssensor2 vor Füllstandssensor1 zuerst auslösen. Beide Zeiten sollen dann im LCD erscheinen.
Während des Zeitstoppens soll die Möglichkeit bestehen über einen „Knopf“ alle laufenden Zeiten im Arduino zu unterbrechen und anschließens auf „Null“ zu resetten.
Anmerkung: Der Arduino und die Behälter mit den Füllstandssensoren stehen in einem Abstand von rund 100m!
Erweiterungsmöglichkeit 1:
Auf einer 7-Segment-Anzeige soll nur die schlechtere Zeit von beiden gemessenen der Bahn 1 stehen, d.h. WENN Zeit1>Zeit2, DANN Zeit1, ANSONSTEN Zeit2. Die 7 Segment-Anzeige soll demnach auch weit lesbar sein.
Erweiterungsmöglichkeit2:
Das ganze System soll für 2 weitere Behälter, also um eine weitere Bahn erweiterbar sein, ebenfalls mit einer eigenen 7-Segment-Anzeige, welche auch nur die schlechtere von beiden ermittelten Zeiten auf Bahn2 anzeigt.

  1. Ich möchte als erstes Wissen ob dies aufgrund von der begrenzten Steckplatzbelegung eines Arduino überhaupt möglich ist. Sind beide Erweiterungsmöglichkeiten mit ein und demselben Arduino realisierbar?
  2. Ich bin Anfänger auf dem Gebiet der Programmierung mit Mikroprozessoren/-controllern, daher möchte ich wissen, was für Bausteine/Sensoren, Kabellage, Arduino-Baustein, Transistoren und Widerstände ich dafür brauche.
  3. Gibt es andere Möglichkeiten dies selbst realiserbar zu machen (z.B. nicht zwingend mit einem Arduino, sondern mit was anderem) und nein, ich möchte kein Fertigprodukt kaufen, wo dies alles schon funktioniert, da dies schlichtweg nicht bezahlbar ist, dazu der Link:
    Zeitmessung: Zeitmessungsset für zwei Laufbahnen | H&V Grunwald - Feuerwehrsportausrüstungen
    7-Segment-Anzeige: Anzeige-Set | H&V Grunwald - Feuerwehrsportausrüstungen

Grüße
BG88KK

Hallo BG88KK

Habe auch nicht die große Ahnung, aber das mit den 100 Meter find ich schon extrem weit (Leistungsverluste).

Stefan

Für die Leitungslänge wirst du einen wandler brauchen.
Von TTL auf bspweise RS232 mit einem MAX3232.

Zumal du auch die sensoren vor ort auslesen müsstest, außer du findest welche die auf dem entsprechenden bus laufen.

Was ich vorschlagen würde ist den Arduino und sensoren vor ort zu verbauen und Anzeige und bedienung abgesetzt zu realisieren.

hi,

machbar ist es auf jeden fall, auch mit 4 oder mehr bahnen, aber ich hab' dazu noch zwei fragen:

nicht so wichtig: wieso sind da drei mal 50m und ein mal 25m signalkabel dabei?

sehr wichtig: ich sehe im set keine sensoren. wie wird da was gemessen?

gruß stefan

BG88KK:

  1. Ich möchte als erstes Wissen ob dies aufgrund von der begrenzten Steckplatzbelegung eines Arduino überhaupt möglich ist. Sind beide Erweiterungsmöglichkeiten mit ein und demselben Arduino realisierbar?

Machbar ist es. Die "Steckplatzbelegung" ist nur bedingt begrenzt. Wenn du einen MEGA nimmst, kommst du sicher aus. Auch mit einem UNO und einer Port-Erweiterung ist es realisierbar.

  1. Ich bin Anfänger auf dem Gebiet der Programmierung mit Mikroprozessoren/-controllern, daher möchte ich wissen, was für Bausteine/Sensoren, Kabellage, Arduino-Baustein, Transistoren und Widerstände ich dafür brauche.

Dazu müssen wir schon mehr von dir wissen. Arduino habe ich schon genannt. Sensoren könnten evtl. wasserdichte Ultraschallsensoren sein. Aber bei mehr Infos deiner Seite geht evtl. auch was anderes.
Die Sensoren evtl. mit einem eigenen Controller (ATTiny85) und serieller Schnittstelle (RS232) an den Hauptcontroller (UNO oder MEGA) anbinden.

  1. Gibt es andere Möglichkeiten dies selbst realiserbar zu machen (z.B. nicht zwingend mit einem Arduino, sondern mit was anderem) und nein, ich möchte kein Fertigprodukt kaufen, wo dies alles schon funktioniert, da dies schlichtweg nicht bezahlbar....

An was anderes denkst du. Ohne grundlegende Kenntnisse in der Programmierung ist es schon mit dem Arduino eine Herausforderung.

Hallo,
"Startsignal1 ODER Startsignal2 soll die Zeit1 und Zeit2 im Arduino anfangen synchron zu zählen (Stoppuhrprinzip).

Das funktioniert nicht mit einem Arduino. Hier würde sich aber das (SchleppzeigerPrinzip) anbieten.
Gruß und Spaß
Andreas

Hallo,
Sensoren?

Wenn ich die Preise sehe, dann habe ich wohl den falschen Job.
Gruß und Spaß
Andreas

hi,

ich glaube, er will keine zieleinrichtung, sondern wer zuerst einen behälter auf entfernung füllt. sensoren dafür sind eine knifflige sache, könnte ich mir vorstellen.

gruß stefan

Danke schonmal für eure Antworten @HotSystems, @Stefan und @Andreas

Machbar ist es. Die "Steckplatzbelegung" ist nur bedingt begrenzt. Wenn du einen MEGA nimmst, kommst du sicher aus. Auch mit einem UNO und einer Port-Erweiterung ist es realisierbar.

Danke, erste Frage beantwortet, das setzt einen Startschuss für dieses Projekt.

Dazu müssen wir schon mehr von dir wissen. Arduino habe ich schon genannt. Sensoren könnten evtl. wasserdichte Ultraschallsensoren sein. Aber bei mehr Infos deiner Seite geht evtl. auch was anderes.
Die Sensoren evtl. mit einem eigenen Controller (ATTiny85) und serieller Schnittstelle (RS232) an den Hauptcontroller (UNO oder MEGA) anbinden.

Die Sensoren sind seitlich in den Behälter eingelassen. Ich habe mir für Testzwecke erstmal solche bestellt: Füllstandssensor

An was anderes denkst du. Ohne grundlegende Kenntnisse in der Programmierung ist es schon mit dem Arduino eine Herausforderung.

Gute Frage, ich bin da nicht sonderlich versiert was das angeht. Mein Studium hat mir nur Grundlagen in SPS, JavaScript und HTML mitgegeben, ich habe mir aber ein Arduino-Starter-Set bestellt, um grundlegende Kenntisse zu erwerben. Bisher habe ich nur die Behälter aus Metall mit Konstruktionsberechnungen zusammengeschustert, dass fiel mir als Maschinenbauingenieur auch deutlich leichter. Aber ich stelle mich gerne neue Aufgaben.

hi,
machbar ist es auf jeden fall, auch mit 4 oder mehr bahnen, aber ich hab' dazu noch zwei fragen:
nicht so wichtig: wieso sind da drei mal 50m und ein mal 25m signalkabel dabei?
sehr wichtig: ich sehe im set keine sensoren. wie wird da was gemessen?
gruß stefan

Das Problem bei der mir aufgezeigten Originalvariante von grunwald-firesport ist, dass dieser Verein eine Monopolstellung bezieht was die Zeitmessung im Feuerwehrsport betrifft, die geben auch keine Antworten auf die Fragen, was die für Sensoren oder gar Mikroprozessoren verwenden, deswegen fuchs ich mich da jetzt alleine in die Sache rein und will das für nen Bruchteil von der ihrem Preis nachbauen. Ich weiß auch nicht, warum die dort verschiedene Kabellängen benutzen.

Danke auch für edn Hinweis, das ich da Erweiterungsmodule/Wandler brauchen werde, hoffe, ich bekomm das irgendwie mal hin.

Gruß Tony

100m sind kein problem, wenns nur ein Schaltsignal ist.

Klingelkabel 0,34mm² hat auf 100m Länge einen Widerstand von 1Ohm. Pro Ampere verliere ich also 1V. Wenn also nur 10mA fliesen für die Sensorversorgung und 1mA Schaltstrom zum Arduino Eingang wird es gerade mal 0,01V Spannungsabfall geben.

Das Problem wird wohl eher sein, das EMV-Störungen in ein so langes Kabel einschleifen. Allerdings auch nur in Gebäuden. Wenn das ein Outdoor-Event ist, reicht ein Abschlusswiderstand von 1KOhm bei 5V um 5mA fliesen zu lassen. Über den Widerstand einen 10nF Kondensator drüber um HF-Störungen wegzubügeln. Das Schaltsignal bei 5mA verliert also gerade mal 5mV.

Die Leitungslänge dürfte also kaum eine Rolle spielen in diesem Fall. Der Sensor sollte halt keine 100mA Eigenstrom benötigen. Als Sensor würde einen Schwimmerschalter bauen. Wasser ist leitend. Folglich reicht es, wenn man eine Plus-Elektrode ins Gefäss bringt und eine höhenverstellbare Elektrode die zum Arduino zurück führt. Pluselektrode könnte ein Alustreifen sein den man an den Behälterrand klebt. Oder ein aluumwickelter Stab. An diesem Stab könnte man dann auch die Füllstandshöhe einstellen, indem man die Mess-Elektrode dran befestigt.

Lediglich beim Aufbau des ganzen drauf achten, das ein zugelassenes Netzteil verwendet wird, damit keine 220V im Wasser anliegen können.

Edit: OK, der Schwimmerschalter erledigt das problem. Reedkontakt ist super, da nur der Eingangsstrom des Arduinos fliest. Trotzdem mit Widerstand und Kondensator abschliessen. Und du solltest zwar den Zeitpunkt des Schaltens merken, aber trotzdem entprellen. Man könnte den Schwimmerschalter "manipulieren" indem man das Wasser so reinkippt, das der Schalter sich bewegt ohne das der Füllstand schon erreicht ist.

Ebenfalls bedenken: die Zeitbasis des Arduinos ist nicht besonders gut. Sie leitet sich von einem Quarz ab, der in sich schon +-1% Abweichung haben kann, unter Wärmeeinfluss auch mehr. Die absolute Genauigkeit ist also nicht berauschend. Aber da alle von der selben Abweichung betroffen sind, ist der Vergleichswert völlig korrekt. Also beide Bahnen werden die selbe Abweichung haben 1Minute sind 60.000 Millisekunden. 1% Abweichung wären 600msec.

Hallo,
als Zeitbasis würde ich eine ChronoDot(RTC) benutzen. Die hat einen Ausgang
den Du als Zeitbasis benutzen kannst. Der SQW-Ausgang liefert Dir ein
Signal als Referenz. Ich würde mir die ZeitQuelle auf alle Fälle extern
liefern lassen.
Kaufe Dir einen originalen Mega 2560 R3, dann geht nichts schief.
Wenn es Dir tatsächlich gelingen sollte, an dessen Monopol zu kratzen, dann
verwende bestes Material- man wird versuchen Dir Deine Anlage schlecht zu
quatschen. Keine so einfache Geschichte, die Du da vorhast.
Viel Spaß dabei
Andreas

hi,

einen mega halt ich da zwar für die kanone auf die spatzen, aber schadet ja nicht. und falls man wirklich mal serielle verbindungen zu den sensoren braucht, ist er mit 4 seriellen optimal.

das problem sehe ich immer noch in den sensoren. vielleicht aber auch nur, weil ich immer noch nicht weiß, was gemessen werden soll. wenn ein behälter einfach nur vollläuft, sind die schwimmer ok, aber wenn da mit feuerwehrschläuchen in was reingespritzt wird, isses im ziel ganz schön turbulent. da könnten die auch schon beim ersten schwall auslösen.

idee zur ausschaltung von störungen wegen der leitungslänge: man könnte doch beim sensor einen MAX485 verbauen, der aber dann kein serielles signal überträgt, sondern nur die 0V/5V des schaltzustandes in ein differentielles signal umsetzt. auf der anderen seite dasselbe umgekehrt und das ergebnis auf einen digitalen input des arduino.

gruß stefan

Das mit dem unkontrollierten Auslösen lässt sich doch über eine Zeitverzögerung bzw. Hysteresis lösen.
Wenn die für alle gleich ist, sollte das doch funktionieren.

Und Störungen bedingt durch die Leitungslänge lässt sich doch bei den Sensoren schon mit einem Optokoppler verhindern.

Hallo,
den Mega nur als EntwicklungsUmgebung, es mangelt an nichts.
Schnittstellen, Pin´s und Speicher ohne Ende. "Kleiner" kann man dann immer
noch werden.
Gruß und Spaß
Andreas

Gut also hätten wir schonmal den Arduino Mega2560 R3 als Steuereinheit, dazu einen Chronodot um eine zuverlässige Zeiteinheit zu haben, auch der Sensor ist damit gebongt und habt keine Angst wegen dem unzuverlässigen Auslösen des Sensors durch Schwall von Wasser, denn die Behälter, in denen das wasser hineingespritzt wird, haben 2 Kammern, die vordere bekommt das wasser ab und unterflutet dann in die zweite hintere Kammer, dort wo auch der Sensor (Reedkontakt) sitzt. das wasser wird also langsam steigen und den sensor zuverlässig auslösen, wenn genau 10Liter im Behälter sind.
An sich noch sehr viele Fachbegriffe für mich, gerade das mit den Kondensatoren um HF-Störungen zu Glätten, Abschlusswiderstände von 1k Ohm, für mich noch alles böhmische Dörfer, denn Elektrotechnik bekommt man als Maschinenbauer nicht so eingetrichtert wie man es sich wünscht. Hat jemand ein gutes Buch zur Empfehlung um mir solche grundlegenden Kenntnisse für E-Technik/Sensortechnik/Steuerungstechnik ect. anzueignen? Ich werde nämlich schon beim Verkabeln der ganzen Sache in Probleme geraten so wie ich mich kenne. Aber ich finde es gut, dass einem hier so akkurat geholfen wird. Mit Sicherheit werde ich mich bei dem ein oder anderen mal über PN melden wenn es bei mir nicht mehr weiter geht.

Hier sieht man mal die Funktionsweise dieses Aufbaus: Löschangriff Nass Feuerwehr

Grüße, Tony

BG88KK:
Gut also hätten wir schonmal den Arduino Mega2560 R3 als Steuereinheit, dazu einen Chronodot um eine zuverlässige Zeiteinheit zu haben, auch der Sensor ist damit gebongt

So wie ich das jetzt sehe, brauchst du keinen MEGA, da reicht der UNO def. aus.

Naja, Abschlusswiderstand ist einfach erklärt

Du legst den Plus auf den einen Draht zu deinem Sensor. Am zweiten Draht kommt das geschaltete Plus zurück. Soweit ein normaler Ein/Ausschalter. Nun wird ein Widerstand mit 1KOhm vom geschalteten Plus zum Minus verbunden. So sorgt man dafür das ein Strom fliest und sich Störspannungen leichter unterdrücken lassen. Den die Störspannungen müssen nun genug Leistung bekommen um den 1KOhm Widerstand zu durchfliesen UND noch störend zu sein. HF bedeutet Hochfrequenz, je höher Frequenzen sind, desdo schlechter funktioniert das entstören mittels Widerstand. Deswegen lötet man über den Widerstand noch einen kleinen Kondensator. Kondensatoren sind bei DC Nichtleitend, je höher die Frequenz desdo mehr leiten sie. Für HF sind sie dann quasi ein Kurzschluss.

So bekommt man auch die hohen Frequenzen in den Griff.

Und wie der Kollege sagte, eventuell noch über Optokoppler führen, wenn sich Störungen garnicht in den Griff bekommen lassen. Dann kann man einerseits die Spannung erhöhen, zb 24V benutzen am Schwimmerschalter und andererseits auch 20mA fliesen lassen um die LED im Optokoppler zu treiben. Eine Störspannung muss da schon sehr heftig sein um das Nutzsignal dann noch zu übertreffen. Sollte im freien Feld nicht mehr vorkommen.

hi,

das mit dem behälter hab' ich dann schon gehofft, wie ich die zieleinrichtungen gesehen und verstanden hab'. das mit dem schwappen sollte also kein problem sein.

aber dafür kommt ein nächstes: Du brauchst kabel, auf die man auch schon mal draufsteigen kann. vielleicht einfach 2- oder 3-polige normale, wie sie auch auf kabeltrommeln für draußen drauf sind. und dann muß das ganze auch wirklich wasserdicht zusammengesteckt werden. aber dafür habt Ihr als feuerwehr ja vielleicht sogar lösungen...

in einem anfängerbuch wirst Du nichts von optokopplern oder gar HF-störungen lesen, da helfen Dir die berufenen kollegen hier im forum sicher besser.

gruß stefan

So ich melde mich mal wieder zurück. Das Arduino-Set wurde geliefert und ich kann endlich basteln. Aktuell funktioniert die Zeitmessung mit aktuell 2 Reedkontakten eher semioptimal, das liegt aber aktuell im Programmsyntax an sich, den ich hier gleich mal reinschreibe. Ich hab im Prinzip eine fertige Programmstruktur aus dem Internet genommen, auch so verkabelt wie vorgegeben und nur gewisse änderungen vorgenommen, damit das programm mit 2 Stoppsignalen funktioniert (sollte man meinen). Allerdings gibt es da ein Problem: Die Stoppuhr lässt sich starten wenn beide Reedkontakte = HIGH und der Button auf = LOW steht. Die Zeit soll nun stoppen wenn beide Reedkontakte = LOW sind. Das geht allerdings NUR wenn beide Kontakte gleichzeitig auf LOW springen, wenn das nicht so ist, bricht das Programm ab. Warum? Hier mal der Aufbau:

#include <LiquidCrystal.h>

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

void setup()
{
  lcd.begin(16, 2);
  lcd.clear();
  
  Serial.begin(9600);
  
  pinMode(8, INPUT);
  digitalWrite(8, HIGH);
  pinMode(9, INPUT);
  digitalWrite(9, HIGH);
  pinMode(10, INPUT);
  digitalWrite(10, HIGH);

}
double i = 0;
double a = millis();
double c ;
void loop()
{
lcd.clear();
lcd.print("Start dr\365cken");
delay(100);
  
 if(digitalRead(8) == LOW)
 {

    lcd.clear();
 a = millis();
   while(digitalRead(9)== HIGH && digitalRead(10)== HIGH)
   {
   
     c = millis();
   i = (c - a) / 1000;
   lcd.print(i);
   lcd.setCursor(11,0);
   lcd.print("Sec's");
   lcd.setCursor(0,0);
   Serial.println(c);
   Serial.println(a);
   Serial.println(i);
   Serial.println("......");
   delay(100);
   }
   
   if(digitalRead(9) == LOW && digitalRead(10) == LOW)
   {
     while(digitalRead(8) == HIGH)
     {
       lcd.setCursor(0,0);
       lcd.print(i);
       lcd.setCursor(8,0);
       lcd.print("Sekunden");
       lcd.setCursor(0,0);
       delay(100);
     }
   }

 }

Zum Verständnis:
digitalRead(8 ) = Startbutton
digitalRead(9) = Reedkontakt 1
digitalRead(10) = Reedkontakt 2

Wenn die beiden Kontakte aber nicht zur gleichen zeit auslösen, bricht das programm ab und springt zu "Start drücken", warum?

Gruß Tony

Hallo Tony,
wie sind deine Eingänge verschaltet? Hast Du PullUp ode PullDown-Widerstände verwendet?
Ich vermute mal, dass die Reed-Schalter und der Taster mit Gnd verbunden sind, da Du auf LOW abfragst. Dann solltest Du auch den internen PullUP einschalten:

 pinMode(8, INPUT_PULLUP);

Die millis() Funktion gibt einen ganzzahlingen Wert zurück, da ist double der falsche Variablentyp, das verursacht nur unnötig Rechenzeit. Verwende lieber 'unsigned long'.

BG88KK:
Zum Verständnis:
digitalRead(8 ) = Startbutton
digitalRead(9) = Reedkontakt 1
digitalRead(10) = Reedkontakt 2

Dafür gibt es die Möglichkeit, im Code Kommentare einzufügen :wink: Zusätzlich kannst Du den Pinnummern auch Namen geben, die Du dann im Programm verwendest.

const byte Startbutton = 8;
const byte Reedkontakt1 = 9;
....

Und Du solltest dir von Anfang an angewöhnen, 'sprechende' Variablennamen zu verwenden. Die Einzelbuchstaben sind ein Relikt aus uralten Basic-Zeiten.
Das macht zwar am Anfang alles etwas mehr Tipparbeit, aber dann verstehst Du dein Programm auch noch nach einem Jahr ( und auch wir verstehen besser, was dein Programm tun soll ).

BG88KK:
Wenn die beiden Kontakte aber nicht zur gleichen zeit auslösen, bricht das programm ab und springt zu "Start drücken", warum?

Sobald der 1. Reedkontakt auslöst und LOW meldet, bricht deine while-Schleife ab. Unmittelbar danach wird deine If-Abfrage ausgeführt. Da fragst Du aber schon ab, ob BEIDE auf LOW sind. Wenn also nicht beide 'gleichzeiteig' auf LOW gegangen sind, wird dein if-Block nicht ausgeführt, und der loop startet wieder von vorn.

Edit: deine Aufgabenstellung ist auch wieder ein Musterbeispiel für einen 'endlichen Automaten', der hier schon öfter als das 'Mittel der Wahl' empfohlen wurde. Wobei die dahinterstehende Logik zunächst noch gar nichts mit Programmieren zu tun hat. Wenn man die aber mal verinnerlicht hat, kann man tatsächlich sehr viele Probleme damit lösen.