Reed Kontakt lesen und mit Timer vergleichen ?

Hallo Leute,

ich wollte einen Reedkontakt einlesen (könnte man ja als Taster) machen.

Beispiel der Funktion: Der Reedkontakt soll mit einer Zeit verglichen werden und dann eine Funktion Auslösen.

Also zb. wenn der Reedkontakt 3 mal pro Sekunde high war, soll Ausgang x auf high gesetzt werden ansonsten soll er low bleiben.

Hat jemand eine einfache Idee dafür oder schonmal etwas ähnliches gemacht?

Gruß Marc

Reedkontakt mit Zeit vergleichen ist ungefähr wie Birnen mit Transistoren vergleichen ...
Ich versteh nicht was Du willst , aber was Du andeutest ist recht trivial umzusetzen.

Schau dir "Blink Without Delay" an und lerne mit millis() umzugehen.

  1. Wenn (millis() -lastMillis >= 1000) ist, setzte lastMillis mit millis() gleich und setzte Counter auf 1
  2. Wenn (millis() -lastMillis < 1000) ist, setzte Counter + 1
  3. Wenn Counter >= 3 ist, setzte deinen Ausgang

Ich habe im anderen Thread von dir auch schon mitgelesen. Es macht Sinn, sich erst einmal mit der Materie bekannt zu machen. Dazu ist mindestens das Playground zu lesen. Besser noch, mit einem Arduino Anfänger Buch Schritt für Schritt durchzuarbeiten.

@ Klaus_ww

Ich habe das evtl. etwas ungenau ausgedrückt....
Ich wollte mit einem Reedkontakt feststellen ob der Magnet (der den Reedkontakt auslöst) innerhalb einer bestimmten Zeit das auch getan hat, und dann entweder den Ausgang auf "high" oder "low" setzen.

Das hat nichts mit trivial zu tun ! Es war einfach nur viel zu ungenau von mir beschrieben....

@ sschultewolter

Danke für den Tipp.
Ich habe schon einiges gelesen und auch schon einige Programme geschrieben aber ganz ehrlich nur dass was ich auch zum jeweiligen Zeitpunkt benötigt habe, ich habe noch etwas Probleme mit Vergleichen und welche Variablen man wann und wo wie einsetzen und nutzen kann. Deswegen sagte ich ich bin noch ein "Anfänger".
Ich habe mich bevor ich mich hier angemeldet habe und meine 2 Thread´s eröffnet habe ausführlich mit der "Google Suche" und auch in Youtube umgeschaut ob jemand schon etwas ähnliches gemacht oder beschrieben hat. Damit ich evtl. aus einem bereits bestehendem Projekt Anregungen für meines abgreifen kann. Allerdings gibt es weder ein Projekt das sich auf meinen ersten Thread bezieht ( PWM Ausgang über 1 oder 2 Taster ändern ( +/- PWM Wert). Genauso wie es kein Projekt gibt das einen Reedkontakt (der ja auch ein beliebiger anderer Eingang oder Sensor sein kann) abfragt und mit einer Zeit vergleicht wobei "vergleichen" evtl. das falsche Wort ist, es geht mir im großen und ganzen darum. An einem Fahrrad die Umdrehungen zu erkennen und bei überschreiten einen bestimmten Anzahl von Umdrehungen im Verhältnis zur Zeit einen Ausgangsstatus zu wechseln (high/low). Beispiel: Rad dreht sich schneller als X km/h = Motor aus / Rad dreht sich langsamer als X km/h Motor AN.

Ich hoffe Ich habe mich jetzt deutlicher ausgedrückt :wink:

Wenn ich mich nicht täusche ist der Sinn eines Forum´s sich auszu tauschen und zu helfen oder Projekte gemeinsam zum Erfolg zu bringen sowie Erfahrungen auszutauschen. Und ich denke hier hat nicht gleich jeder als 100% iger Pro angefangen...

Gruß Marc

Natrülich sind hier die meisten keine "Pro". Der Sinn besteht aber nicht, jemanden der fragt, einen voll funktionsfähigen Sketch zu liefern. Da ist der Lerneffekt = 0! Klaus hat schon Recht. Die beiden Projekte sind trivial und leicht lösbar sein, der sich etwas mit dem Arduino beschäftigt hat. Meist geht der Weg an einem richtigen Buch nicht vorbei.

Du brauchst auch nicht genau das gleiche Projekt.

Lass mal mit millis() eine LED alle Sekunde blinken. Das ist schon das Grundgerüst für die Abfrage ob innerhalb dieses Zeitraums ein Schalter x mal ausgelöst wurde. Einfach den Schalter unabhängig von der Zeit zählen und dann alle x Zeiteinheiten den Wert abfragen. Du musst lediglich am Anfang des Intervalls den Wert immer auf 0 setzen.
Da bietet es sich auch an den Wert von mehreren Messungen zu mitteln, da das nicht synchron läuft und der errechnete Wert etwas schwanken wird.

Und ein PWM Signal per Taster zu verstellen ist nicht anders als irgendwas anderes per Taster zu verstellen. Du hast eine Variable und änderst diese per Tastendruck. Das kann man auch erst mal mit der seriellen Ausgabe simulieren.

Letztlich geht's so:

  • nimm die Zeitstempel wenn der Magnet das Relais schließt, also Zeit merken, siehe millis()
  • beim nächsten Zeitstempel nimmst Du die Zeitdifferenz und schwupps, schon fertig

Die Berechnung drumherum, was bei welchem Wert passieren soll ist ja dann wieder ein anderes Thema.

Soweit klar?

Edit: sieh Dir auch gleich das Thema "Debounce" an, sonst hast Du keinen Spaß

@ sschultewolter

Ich wollte auch keinen fertigen code :wink: nur Tipps, Anregungen , Meinungen, Beispiele.

@ Serenifly

Vielen Dank, ich habe mir das ganze mal angeschaut, wusste vorher noch nichts davon und werde damit weiter testen
was ich so anstellen kann. :slight_smile:

@ Klaus_ww

ja mittlerweile glaube ich habe ich verstanden was du meintest. Das Thema "Debounce" war auch hilfreich. Danke :slight_smile:

@ all

Ich habe das ganze jetzt doch anders gelöst ist zu 90% fertig, ich hatte noch ein GPS Modul hier mit dem ich die aktuelle Geschwindigkeit aus den Rohdaten Filter und dann mit der maximalen Geschwindikeit (x) vergleiche. War mir dann so lieber, da es genauer ist und ich noch ein paar andere Daten (Bsp. Zeit usw.) gleich mit auf meinem I2C LCD anzeigen lasse.

Vielen Dank an alle.

Marc2014:
@ sschultewolter

Ich wollte auch keinen fertigen code :wink: nur Tipps, Anregungen , Meinungen, Beispiele.

Die Anregungen, Tipps etc waren ja da :wink:

Ja stimmt :wink: Ich wollte nur klarstellen das ich nicht die ganze Arbeit euch überlassen wollte und auch nicht einen fertigen "code" haben wollte, sondern wie gesagt: Meinungen und Unterstützung :wink:

Danke an alle :slight_smile:

Marc2014:
An einem Fahrrad die Umdrehungen zu erkennen und bei überschreiten einen bestimmten Anzahl von Umdrehungen im Verhältnis zur Zeit einen Ausgangsstatus zu wechseln (high/low). Beispiel: Rad dreht sich schneller als X km/h = Motor aus / Rad dreht sich langsamer als X km/h Motor AN.

Ich hoffe Ich habe mich jetzt deutlicher ausgedrückt smiley-wink

Bei diesem Anwendungsfall sind die Schließzeiten des Reed-Kontakts extrem kurz.

Deshalb wertest Du die Reedkontakte am besten mit einer Interrupt-Serviceroutine über einen Hardware-Interrupt aus, um keinen Impuls vom Reedkontakt zu verpassen.

Das mit der Interrupt-Programmierung ist kein typisches Anfängerthema.

So wie Du es vorhast "drei Kontaktschließungen pro Sekunde" erkennen zu wollen, ist übrigens auch viel zu ungenau.

Beispiel: Ein Rad dreht sich gleichmäßig alle 400 ms einmal und gibt demzufolge alle 400 ms einen Impuls.
Frage: Wieviele Impulse erhältst Du pro Sekunde?

Antwort: Zwei oder drei, es kommt ganz darauf an, wann Deine Sekunde beginnt und wann die Impulse innerhalb der Sekunde auftreten.

Beispiel: Der erste Impuls tritt 50 nach Beginn der Messung auf:
Dann hast Du drei Impulse in einer Sekunde: nach 50, 450 und 850 ms

Beispiel: Der erste Impuls tritt erst 300 ms nach Beginn der Messung auf.
Dann hast Du zwei Impulse in einer Sekunde: nach 300 und 700 ms

Ob Du 2 oder 3 Impulse in einer Sekunde mißt, macht bei einer Geschwindigkeitsberechnung einen Fehler von 50% aus.

Du kannst nun natürlich anfangen, über 5 oder 10 Sekunden zu mitteln, um den Fehler zu verkleinern, aber vom Prinzip her ist das Mist, wenn Du die aktuelle Geschwindigkeit haben möchtest.

Einen recht gut funktionierenden Fahrradtacho-Sketch habe ich zum Beispiel mal hier gepostet:
http://forum.arduino.cc/index.php?topic=172506.msg1289260#msg1289260

Die Geschwindigkeit wird zwar auch einmal pro Sekunde aktualisiert, aber das Problem, dass in einer Sekunde unterschiedlich viele Kontakte gezählt werden können trotz gleichbleibender Geschwindigkeit, wird in diesem Sketch dadurch umgangen, dass sowohl die Reedkontakt-Schließung als auch die Zeit einzeln mitgezählt wird. So dass am Ende immer dieselbe Geschwindigkeit dabei herauskommt, egal ob es innerhalb einer Sekunde zwei Impule vom Reedkontakt gab mit einer Gesamtdauer von 800 seit dem letzten Impuls zuvor, oder ob es drei Impulse gab mit einer Gesamtdauer von 1200 ms seit den letzten Impuls zuvor.

Du kannst Dir den Code ja mal ansehen, aber wegen der Verwendung von Hardware-Interrupts ist der Sketch allerdings kein typisches Anfängerprogramm, womit man als Anfänger einsteigen sollte.