Strom/Wasserzaehler mit Reflex-Lichtschranke auslesen

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Kurze Einleitung: Mit einer Reflex-Lichtschranke möchte ich den Zeiger der Wasseruhr erkennen. Dabei soll die Messung Unabhaengig vom Umgebungslicht werden. Deshalb moechte ich den Wert bei LED aus vom Wert bei LED an abziehen und die Differenz soll diskriminiert und mit einem GPIO eingelesen werden.

    Jetzt kommt das Trickige: Mit Analog-Eingaengen waere es ganz einfach. Der Raspi hat aber nur Digital, also muss die Messung bei LED aus analog zwischengespeichert werden, auf einem Kondensator. Die Differenzbildung kann dann mit einem OPAMP geschehen.

    Meine Beschaltung:
    GPIO1(out) -- 270 Ohm -- LED --GND
    3.3V -- 10kOhm -- A -- Phototransistor -- GND
    a -- GPIO2(in)
    A -- (+)OPAMP(OUT) -- GPIO3(in)
    B -- (-)OPAMP
    B -- Kondensator -- GND
    B -- MOSFET -- A
    MOSFET(basis) -- GPIO4(out)

    Jetzt hab ich 4 GPIOs verwendet. Hat jemand eine Idee, wie es vielleicht mit weniger funktionieren könnte? Leider sind das auch schon recht viele Teile. Vielleicht sollte ich doch einen ADC verwenden und die Differenz dann per Software machen.

    Ich haette noch eine andere Idee, die ggf den Opamp und den MOSFET einsparen wuerde:
    Man schaltet mit 1 kHz zwischen LED and und LED aus und git das SIgnal (bei A) auf einen Tiefpass, dann Gleichrichten.

    Einmal editiert, zuletzt von wend (3. März 2017 um 07:36)

  • Strom/Wasserzaehler mit Reflex-Lichtschranke auslesen? Schau mal ob du hier fündig wirst!


  • Meine Beschaltung:
    GPIO1(out) -- 270 Ohm -- LED --GND

    hast du eine 20mA Dunkel LED?

    Besser für die GPIOs und dem SoC wäre ein Vorwiderstand von 1k und eine hellere LED üblicherweise uh ultra hell ab >3000mCd

    zum Rest können sich vielleicht andere Gedanken machen da sollte mehr gehen

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Nur ein Gedanke: wenn das Umgebungslicht keine störenden Infrarotanteile hat könnte man ja die Lösung im ir Bereich ansiedeln. Vielleicht noch ein getakteter Betrieb des ir Senders und ein darauf abgestimmter ir Empfänger. Das könnte mit 2 gpios laufen.

    Wie gesagt nur ein Erstgedanke :shy:

    VG
    Leroy

    Optimismus ist nur ein Mangel an Informationen?

  • Das mit der SUperhellen LED ist ein guter Tipp- Ich wollte eine gruene verwenden wegen der roten Zeiger. Deshalb ist Infrarot auch nicht so gut, ausserdem weiss ich nicht wegen der Transmission durch ein Plexiglasgehaeuse. Vielleicht ist es mit einem ADC doch am einfachseten, es braucht dann nicht so viel Justieraufwand. Aber ich schaue erstmal noch nach Alternativen. Es soll möglichst einfach sein. Hatte auch schon ueberlegt, eine Art untergrundrauschen per LED auszusenden (also nicht bloss an und aus, sondern auch mit zwischenwerten, PWM ueber einen Glaetter). Dann muss man die GPIOs zwar schneller abfragen aber vielleicht reicht ein einfacher Digitaler EIngang.


  • .....Hatte auch schon ueberlegt, eine Art untergrundrauschen per LED auszusenden (also nicht bloss an und aus, sondern auch mit zwischenwerten, PWM ueber einen Glaetter).

    dann mache es wie die Fernbedienungen, gepulste LED mit einigen kHz, ist dann leichter zu filtern, Rauschen ist ja unbestimmt.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Meine bisher einfachste Idee:
    GPIO1(out) -- 1kOhm -- LED (hell, gruen) -- A -- Kondensator -- GND
    A -- 10kOhm -- GND

    3.3V -- 10kOhm --B-- Phototransistor -- GND
    B--GPIO(in)

    Dann komme ich mit nur zwei GPIOs aus und sehr wenigen diskreten Bauteilen.

    Mit GPIO1-high wird der Kondensator geladen, gleichzeitig leuchet die LED, am anfang heller, dann abnehmend hell.
    bei GPIO1-low erlischt die LED und der Kondensator wird entladen.

    Ueber GPIO2 bekomme ich sofort ein low-signal, wenn die LED an geht, aber wenn die LED helligkeit unter eine schwelle faellt, dann wieder ein high.

    Ich messe nun die Zeit des low-Signals auf GPIO2 im Verhaeltnis zur laenge des high Signals auf GPIO1. Das ist ein Mass fuer die reflektivitaet. Wenn der Zeiger vobeikommt, wird die gemessene Zeit am GPIO2 leicht sinken.

    Die Umgebungslichtkompensation mache ich wie folgt: Die laenge des GPIO1-Pulses, der die LED zum leuchten bringt und die dann kommende (entlade-) Pause variiere ich so, dass der an GPIO2 gemessene Puls im langzeitmittel immer gleich lang ist.

  • Ich habs ausprobiert: Das Problem ist das einstellen des EIngangssignals. Man trifft die Schwelle nicht richtig, wann der eingang von LOW auf HIGH detektiert. Das ist ziemlich fummelig und funktioniert nicht richtig. Der GPIO EIngang scheint nicht hochohmig genug zu sein. DIe Phototransitoren, welche ich habe haben einen WIderstand von ca 100k. Gibt es auch welche mit niedrigerem Durchschaltwiderstand?

  • In der Literatur wird der Fototransistor immer auf VCC beschaltet. Ich hab das nun auf GND gemacht. Macht das einen Unterschied? Es ist doch vertrackter als ich dachte.

    Habe jetzt folgende Schaltung fuer die Lichtstaerkemessung (ohne ADC) gefunden (Siehe Schaltplan im Anhang).

    Eine Lichtstaerkemessung soll nun so funktionieren:
    1. GPIO auf Ausgang schalten
    2. GPIO auf HIGH
    3. 1 ms warten
    4. GPIO auf eingang schalten, Zeit merken
    5. solange warten wie HIGH auf dem GPIO gemessen wird.
    6. Laenge des HIGH-Pulses ermitteln

    Je heller, desto kuerzer der Puls.
    Das sollte im Prinzip mit jeden Typ Phototransistor funktionieren. Man kann ggf. den Kondensator anpassen.
    Die Aufloesung der Pulslaengenmessung ist theoretisch 1 mus (1MHz Timer des Raspberry Pis).

    Mit zwei Messungen (bei LED an und aus) sollte eine Untergrundbereinigung möglich sein.
    Mit 10 Hz kann kann man dann Reflexmessungen laufen lassen. Das sollte für Wasaseruhr und Ferraris-Zaehler reichen.

    Meinr Schaltung hat nun:
    1. helle gruene LED
    2. Vorwiderstand für LED 1kOhm
    3. Kondensator 22 nF
    4. Phototransistor (irgendein Typ aus der Bastelkiste)
    5. Ladewiderstand 1kOhm

    Also nur 5 Bauteile. ist das noch zu toppen?


  • In der Literatur wird der Fototransistor immer auf VCC beschaltet.

    mit etwas Überlegung könnte man darauf kommen,
    mehr Licht bedeutet so höhere Spannung am Teiler


    Ich hab das nun auf GND gemacht. Macht das einen Unterschied?

    nu rate mal.....

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Naja, gut, dann invertiert er. Ich dachte aber eher an Unterschiede duch die Dioden-Spannung, also fehlen mit 0.7 V entweder unterhalb von VCC oder oberhalb von GND. Aber wahrscheinlich sind es heutzutage gar keine 0.7V mehr....

  • Was soll ich sagen: DIe einfache Reflexlichtschranke funktioniert. Es gibt ein sehr sauberes Signal, der kleine Spiegel auf dem Wasserzählerraedchen ist gut zu erkennen. Allerdings habe ich eine Schwierigkeit: Der Untergrund/Umgebungslicht, messe ich zwar wie beschrieben, aber ein einfaches subtrahieren der Pulslaengen oder deren Kehrwert tut es nicht. Der SIgnalunterschied bei LED aus durch das Umgebungslicht ist viel Kleiner als bei LED an. Das Ganze ist ziemlich nichtlinear und ich suche nun nach einer guten Formel, die das Abziehen des Umgebungslichtes ermöglicht. Beim Wasserzaehlerist das zwar nicht nötig, aber ich will dasselbe nun auch beim Stromzaehler aufbauen und dort ist das Nutzsignal ja viel kleiner und noch anfaelliger für Umgebungslicht.

    Bei Dunkelheit ist meine Pulslaenge uebrigens ca 3 Millisekunden. Mit der LED-Beleuchtung sinkt sie auf unter 1 millisekunde. Der verwendetetw Kondensator hat nun doch 68 nF statt 22nF.

    Einmal editiert, zuletzt von wend (1. März 2017 um 22:30)

  • Hier mal eine Probe der Signale von der Wasseruhr. Es werden 10 Messungen pro Sekunde ausgefuehrt, die CPU-Load auf dem Raspi B+ ist dann bei 30 %. Das Messinterval kann man noch erhöhen. Muss ich erstmal sehen, wie schnell sich das Raedchen der Wasseruhr schlimmstenfalls dreht.

    Fuer die Verbrauchszaehlung diskriminiere ich bei der Schwelle -1400 mus, mit 100 Hysterese.

    Ach so: Das Signal ergibt sich aus der Differenz von Pulslaenge mit LED an (A) zu Pulslaenge mit LED aus (B), also A-B.
    B ist immer ca 3100 Mikrosekunden, deshalb das negative Vorzeichen.

    Als naechstes versuche ich das ganze für den Ferraris-Zähler. Wenn das klappt, ist es die ultimative Low-Cost-Loesung. Aehnliche Projekte haben immer zusaetzlich (!) einen Arduino verbaut, oder mindestens einen externen ADC fuer den raspi.


  • ....Allerdings habe ich eine Schwierigkeit: Der Untergrund/Umgebungslicht, messe ich zwar wie beschrieben, aber ein einfaches subtrahieren der Pulslaengen oder deren Kehrwert tut es nicht. Der SIgnalunterschied bei LED aus durch das Umgebungslicht ist viel Kleiner als bei LED an.

    ich würde es mit gepulster 36kHz IR oder Rot LED probieren und einem TSOP 31236 Empfänger ob es klappt weiss ich nicht bei der rot LED

    Damit hast du Umgebungslicht rausgefiltert, jede IR FB funktioniert so.

    Du wolltest ja die LED sehen deswegen der Versuch mit roter LED in der Hoffnung da ist etwas IR drin.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Ich habe jetzt gerüchteweise im Internet gefunden, dass die GPIOs bem Raspberry Pi einen eingangswiderstand von 50 KiloOhm haben sollen.
    Das wuerde die beobachtete Nichtlinearität der Schaltung erklären. Kleine Lichtstaerken (Umgebungslicht bei LED aus) können so nicht richtig gemessen werden. Das macht die DIfferenzmessung schwierig.

    Einmal editiert, zuletzt von wend (1. März 2017 um 22:31)

  • Die kleinen Pulse des Ferrariszaehlers werden nun gefiltert und ausgewertet. Fertig ist die Verbrauchsgrafik fuer den Strom. Es bleibt zwar noch was zu verbessern, insbesondere die Umgebungslicht-Kompensation, aber mit geschlossenem Verteilerkasten funktioniert es stabil.
    Automatisch zusammengefügt:
    Es fragt sich jetzte, wo eigentlich der ganze Stromverbrauch so herkommt....
    Übrigens: Diesen Thread könnte man in die Projekte-Abteilung verschieben. Wie?

  • Fazit Stomzaehlerauslese: Es laeuft bis heute ziemlich gut, trotz der rech schwachen Signalqualitaet. Bin begeistert, wie einfach das ging. Wenn Interesse besteht, lade ich auch die Software hier hoch.

    Verbesserungsbedarf besteht noch in der Umgebungslichtkompensation. Hierzu muss man das Verfahren etwas genauer vestehen, damit man die Korrekturen in der Software vornehmen kann. DIe gemessene Pulslaenge ist Proportional zum Produkt aus C und R. R setzt sich aber aus zwei (paralel geschalteten) Anteilen zusammen. EInmal der Phototransistor, das ist ja das was man messen will und parallel dazu den Eingangswiderstand des GPIOs (plus die 1 kOhm). Ich konnte keine genauen angaben zum EIngangswiderstand finden. Im Internet findet man mal 100kOhm, dann wieder 50kOhm. Meine Messungen waeren konsistent mit den 50kOhm. Das waere ein Ansatz fuer die Linearisierung der Abhaengigkeit von Pulslaenge zu Lichtintensitaet. Allerdings hab ich ja einen Phototransistor aus der Bastelkiste genommen, und kein Datenblatt hierzu. Deshalb ist es mir noch nicht gelungen den Output linear zur gemessenen Lichtintensitaet zu machen, was ja nötig ist, wenn man den Umgebungslichtanteil von der Messung abziehen moechte. Mein urspruengliches Ziel ist also noch nicht ganz erreicht, der Stromzaehler muss also im Dunkeln arbeiten. Wenn jeman hilfreiche Information haette, zu Phototransistoren im Allgemeinen oder zu der Eingangsimpedanz der GPIOs wuerde es weiterhelfen.

    Im Anhang nochmal das Schaltbild zum Nachmachen.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!