Ultrasonic Level Meter Display Page in English
Ultrasonic Level Meter Display Page in English

Anzeige

Display

Die Anzeigeeinheit ver­wendet einen AT­mega­128 mit, wie auch der Sensor, ebenfalls 3,6864 MHz. Die­ser wurde gewählt weil er zwei serielle Schnitt­stellen hat, eine zur Mess­einheit und eine zu einem PC (RS232) oder zu einem eventuellen Home-Bus (RS485). Ab Revision 2.0 ist auch ein Bluetooth-Modul vorgesehen. Als Baudrate wurde 9600 Baud gewählt. Diese ist zweifellos ausreichend für die Messung des Wasser­standes einmal pro Minute aber auch für weitere denkbare Aufgaben, etwa der Abfrage von Strom- oder Wasser­zählern oder dem Schalten von beliebigen Ver­brauchern, aber dies ist eine andere Geschichte...

Das Bluetooth-Modul nutzt ab Werk ebenfalls 9600 Baud. Wenn Sie über Blue­tooth eine andere Baud­rate verwenden wollen reicht es nicht, diese am PC und im Display einzu­stellen. Sie müssen dann auch das Bluetooth-Modul entsprechend programmieren! Ich habe das bis jetzt nicht getan und kann Sie nur auf das Daten­blatt des ARF32 verweisen!

Die Anzeige fragt also einmal pro Minute den Wasser­stand der Zisterne ab, errechnet daraus die enthaltene Wasser­menge und zeigt sie an. Neben­bei errechnet sie auch die Differenz zum Vortag und zur ver­gangenen Stunde. Die Uhrzeit, die dabei angezeigt wird, bezieht sich auf den letzten Einschalt­zeitpunkt, sie kann jedoch über die serielle Schnitt­stelle (oder über Blue­tooth oder dem Homebus) auf die tatsächliche Tages­zeit eingestellt werden. Alternativ kann ein DCF77-Empfänger angeschlossen werden.

Zur Ermittlung des Wasser­standes werden 10 Mess­werte des Sensors gemittelt. Danach wird die Versorgungs­spannung des Sensors abgeschaltet. Dies spart nicht nur Strom, es verringert auch die Eigen­erwärmung was wiederum der Genauigkeit der Temperatur­messung zugute kommt. Außerdem wird der Sensor so zurück­gesetzt falls er sich einmal "aufhängen" sollte.

Die Praxis hat gezeigt, dass die Ent­fernungs­messung sehr genau und wieder­holbar arbeitet. Tats­ächlich kann man bei lau­fenden Mes­sungen während der Wasser­entnahme die Liter direkt mitverfolgen. Während es regnet ist die Wasser­oberfläche jedoch ziemlich in Bewegung und auch Spritzer können Fehl­messungen verursachen sofern man nicht über einen beruhigten Zulauf verfügt, deshalb die Mittelung.

Die Anzeigeeinheit ist für "always on" gedacht und enthält deshalb auch einige Maßnahmen zur Energie­einsparung. Der Strom­verbrauch liegt laut eines Energiemess­geräts von Conrad Electronic bei 0.0 W (also unterhalb der Mess­auflösung von ca. 2 W).

Als Gehäuse habe ich mich für ein Heidenreich ZA16 entschieden, das zufällig greifbar war. Es eignet sich zur Wand­montage, ist einfach zer­legbar und die Front passt perfekt für das gewählte Display. Es ist nicht gerade stylish aber neben den anderen Geräten im Hei­zungs­raum macht es sich doch ganz gut...

Anschluss der Messeinheit

Für den Anschluss der Mess­einheit wurde ein Standard-Netzwerk­kabel vor­gesehen. Es ist billig, leicht erhältlich und für die Daten­übertragung von hoher Qualität. Aufgrund der geringen Baud­rate sollten auch ver­drillte Zweidraht­leitungen ("Klingel­drähte") funk­tionieren. Von parallel­laufenden Steuerkabeln sollte man aber besser absehen (Wenn sie nun schon mal drin sind, nun ja, probieren Sie es. Wenn sie 80 cm unter der Erde liegen sollte es wohl auch wenig EMV-Probleme geben). Der Schirm (sofern vorhanden) sollte einseitig (an der Anzeige­einheit, diese stellt ja die Ver­sorgung) an Masse gelegt und an der anderen Seite isoliert werden. Benötigt wird nur ein Aderpaar für die Daten­leitung und eines für die Ver­sorgung. Bei Ver­wendung eines Netzwerk­kabels kann es nicht schaden, die unbenutzten Paare für die Versorgungs­spannung parallel zu schalten (jeweils eine Leitung des Paares an +, die andere an GND).

Die Anzeige schaltet die 15 V (Unreg) über eine einfache Konstant­strom­quelle bestehend aus T1, D1 und R3 an. Damit wird ein Spannungs­einbruch in der Anzeige­einheit und/oder Überlastung von T1 verhindert. Die Konstant­stromquelle 'kostet' im Ver­gleich zu einem simplen Schalt­transistor gerade einmal zwei Dioden (als SMD in einem Gehäuse erhältlich und wirklich billig) und einen Widerstand.
Die Strom­quelle ist dennoch nicht kurzschluss­fest. Wenn die Sensor­ver­sorgung kurzge­schlossen ist liefert T1 etwa 40 mA aus der Versorgung was einer Verlust­leistung von ca. 0.6 W entspricht. Dies würde eine Über­hitzung und den Ausfall von T1 innerhalb weniger Sekunden bewirken.
Der 15 Ω-Widerstand R112 in der Sensor­einheit dämpft Schwingungen, die über die Leitungs­induktivität und den Eingangs­kondensator ent­stehen könnten. Lange Zulei­tungen und hoch­wertige keramische Konden­satoren an einer nieder­ohmigen Versorgung bilden Schwing­kreise von erstaunlicher Güte, die durchaus störende, wenn nicht sogar zer­störende Span­nungen produ­zieren können wenn sie plötz­lich geschaltet werden. Wenn Sie damit herum­spielen möchten, hier eine einfache Simulation der Strom­quelle für LTSpice.

Terminierung

Laut Lehrbuch müssen die Leitungen einer RS485-Schnitt­stelle an beiden Enden mit jeweils 120 Ω terminiert werden um Reflexionen zu minimieren. Dies ist sicherlich kein Fehler was die Signal­integrität betrifft aber es erhöht die Strom­aufnahme beträcht­lich.

Die 120 Ω sind leider auch keine Natur­konstante sondern der Wellen­widerstand der typischer­weise ver­wendeten Leitung. Wenn Sie andere Leitungen verwenden müssen sie den Ter­minierungs­widerstand anpassen um optimale Ergeb­nisse zu erzielen.

Was ist Wellenwiderstand?

Einstein sagt, es gibt nichts schnel­leres als das Licht. Wenn nun die Strom­quelle am Display einschaltet, woher weiß sie was am Ende der Leitung für eine Last anliegt? Obwohl die Leitung vielleicht nur 10 m lang ist (Licht braucht dafür im Vakuum etwa 30 ns). Nun, sie weiß es nicht. Zunächst fließt der Strom der dem Wellen­widerstand der Leitung entspricht. Am Ende ange­kommen wird geht ein Teil des Stromes in die anliegende Last, der Rest wird reflektiert und kommt 30 ns später wieder an der Stromquelle an. Dort äussert er sich als negative (oder auch positive, je nach Last) Spannung, die in Reihe mit der Ver­sorgung nun einen höheren (oder niedrigeren) Strom in die Leitung treibt. So über­lagert er sich mit dem Strom der bisher geflossen ist und der Strom pegelt sich letzt­lich auf den tat­sächlich benötigten Wert ein. Dabei können an der Last Über­schwinger eintreten die im Extremfall das doppelte der anlie­genden Span­nung aus­machen.

Eine Terminierung ist nötig, wenn die Anstiegs­zeiten des Signals in die Nähe der Laufzeit auf der Leitung kommen. Wir ver­wenden Slew Rate limited Treiber, also Treiber mit bewusst ver­ringerter Anstiegs­zeit, was Re­flexionen reduziert. Zudem reagiert der Empfänger nicht auf Flanken sondern tastet das Signal jeweils in der Mitte eines Bits (also nach etwa 50 µs) ab. Bis dahin sind Re­flexionen längst abgeklungen. Deshalb habe ich auf die Ter­minierung der Sensor­leitung verzichtet. Bei mir funk­tioniert dies mit etwa 10 m Sensor­kabel absolut problem­los. Auch auf dem Oszilloskop ist nichts von Reflexionen zu sehen.

Tatsächlich wären etwaige Reflexionen in 50 µs etwa 500 mal durch die Leitung gelaufen. Bis dahin sind sie allein durch den ohmschen Wider­stand der Leitung völlig auf­gezehrt, sie sind einfach weg.

Bei höheren Baud­raten wäre die maximale Kabel­länge ohne Terminierung kürzer. Die Reflexionen müssen bis zur Abtastung unter die Schalt­schwelle des Emp­fängers abge­klungen sein um den kor­rekten Signalpegel sicher zu erkennen.

Ich empfehle, die Leitungen nicht zu terminieren. Es ist schlicht unnötig weil alle Re­flexionen bis zum Abtast­zeitpunkt abgeklungen sind.

Wenn Sie es trotzdem tun wollen, müssen Sie den Konstant­strom erhöhen, also R3 ver­ringern und konsequenter­weise auch R8 um den nötigen Basisstrom zu treiben, weil sonst die Versorgungs­spannung am Sensor während des Sendens einbrechen würde.

Meine Wahl für diesen Fall: R3=6,8 Ω, R8=4,7 kΩ aber dies ist nur eine Prognose, ich habe nicht terminiert und habe das auch nicht getestet.

Damit erhöhen Sie zwangs­läufig die Belastung der Display-Ver­sorgung und damit deren Ripple während des Daten­transfers. Das sind Kompli­kationen die Sie vermeiden können.

Wenn Ihr Sensorkabel allerdings sehr lang ist (einige zig oder hunderte von Metern) sollten Sie mit dem Oszilloskop nochmal nach­messen bevor Sie den Sensor ver­gießen.

Schnittstellen

Die Anzeige­einheit verfügt über zwei USARTs. USART0 wird ver­wendet zur Kommunikation mit der Mess­einheit über einen RS485 physical Layer, USART1 kann als Bestückungs­variante oder auch durch "Jumpern" entweder über Bluetooth, RS232 oder RS485 mit einem Host-PC kom­munizieren. Die Sende­richtung geht dabei immer über alle Schnitt­stellen, nur der Empfang wird "umgejumpert".

Das zugehörige Jumper­feld ist riesig (zumal laut Daten­blatt das Bluetooth-Modul auch noch RTS und CTS benötigt) und ich bin damit nicht richtig glücklich aber es ist die bil­ligste Variante, wir haben genug Platz dafür und es muss normaler­weise nur ein einziges Mal gesteckt werden.

Die Unterstützung für RTS/CTS-Handshake kann per Define in den Sourcen erfolgen oder per Konfiguration. In meinen Sourcen ist das Hand­shake aktiviert, sie können es jedoch durch ein Kommando deaktivieren.
Dies ist nötig, wenn an der Host-Schnittstelle kein dauerhaft betriebenes Gerät angeschlossen ist, da sonst kein Senden möglich ist und das Display blockiert wird sobald der Sendepuffer voll ist.

Der USART unterstützt über Interrupt-Flags das für RS485 als Halbduplex-Medium nötige Ein- und Aus­schalten des Sende­treibers, was der Software­seite sehr ent­gegen kommt.

Kommunikation mit dem Host

Die Anzeigeeinheit kommuniziert mit 9600 Baud, 8N1 mit dem Host (PC oder Laptop). Da im Zusammenhang mit PCs das 9. Bit eher proble­matisch ist wurde hier auf die Verwendung desselben verzichtet und die gesamte Kommunikation erfolgt in les­baren ASCII-Zeichen. Die Schnitt­stelle ist immer aktiv. Auf ein "Select Device", wie es im Bus mit mehreren Geräten nötig wäre, wurde vorerst verzichtet.

Das vorgesehene Bluetooth-Modul hat per Default die gleichen Vorgaben so dass es ohne besondere Pro­gram­mierung einfach ver­wendet werden kann.

Die Sende- und Empfangs­routine ist interrupt­gesteuert. Senden erfolgt klassisch über einen FIFO im SRAM. Beim Emp­fang werden die Daten gesammelt bis ein <LF> eintrifft. Dann wird die gesamte Zeile auf einmal aus­gewertet. CRs werden igno­riert. Ein Kom­mando beginnt immer mit einem Kommando­wort gefolgt von even­tuellen Para­metern, jeweils durch Leer­zeichen getrennt.

Und wenn kein <LF> kommt? Jeder drückt doch <Return> nach einem Kommando!

NEIN! Das ist der klassische Buffer Overflow Attack! Zeichen kommen auch noch wenn sie nicht mehr erwartet werden wenn der Host nicht 'gutartig' ist oder es auch nur EMV-Probleme gibt. Und sie werden dann in einem Speicherbereich gespeichert, der eigentlich gar nicht dafür vorgesehen war. Die Folgen können vermurkste Variablen und damit falsche Anzeigen, ein schlichter Absturz oder auch die Ausführung von unbeabsichtigtem oder fremdem Code sein!
Ich habe mich hier für einen 'Buffer Wrap' entschieden, d.h. Zeichen, die nicht mehr in den Puffer passen überschreiben ihn von vorne wieder. Man könnte auch Zeichen ignorieren sobald der Puffer voll ist, das ist Geschmacksache. Hauptsache, nicht über den Puffer hinaus schreiben!

Ein solcher Angriff kann in beide Richtungen gehen: Er sendet mehr Zeichen als Sie erwarten oder er provoziert mehr Antworten als Ihr Sendepuffer verkraften kann. Seien Sie auf beides vorbereitet!

Glücklicherweise gestatten es die unter­schied­lichen Formate von Host-Kommandos und Telegrammen des Bluetooth-Moduls diese zu unter­scheiden. So kann die Empfangs­routine separate Flags für jedes dieser Ereig­nisse setzen.
Ein Bluetooth-Tele­gramm zu erkennen ist den­noch nicht trivial, da das Ende-Kennbyte (ETX, 0x03) auch innerhalb der Daten vor­kom­men kann. Wir müssen deshalb das Telegramm parsen. Normalerweise kommen nur wenige Blue­tooth-Telegramme vor da wir den trans­parenten Modus be­nutzen. Das erste ist das "LMX9830_READY", welches das Bluetooth-Modul beim Power-Up oder nach einem Reset sendet. Darauf folgt ein SPP_INCOMING_LINK_ESTABLISHED und, falls die Ver­bin­dung ab­bricht, möglicher­weise ab­wech­selnd ein SPP_LINK_RELEASED. Durch diese Tele­gramme können wir er­kennen ob über­haupt ein Bluetooth-Modul vorhanden ist und ob ak­tuell eine Ver­bin­dung mit dem Host besteht.

RTC

Timer0 erzeugt einhundert mal pro Se­kunde einen Inter­rupt als univer­seller Timer. Nebenbei wird daraus eine HH:MM:SS-Uhr, die bei 24:00:00 zurück­gesetzt wird (Tage werden nicht gezählt). Dabei setzt sie Flags für jede Sekunde, Minute und Stunde sowie einmal pro Tag, mit deren Hilfe die Haupt­schleife sekündliche, minütliche, stündliche oder täg­liche Ak­tionen durch­führen kann.

Am Ende der Haupt­schleife wird ein Sleep ausgeführt, der einer­seits nichts kostet, den Strom­verbrauch des Controllers anderer­seits aber er­heb­lich senkt da bis zur nächsten 1/100 Sekunde deut­lich weniger ver­braucht wird.

DCF77

Zur Synchronisation mit der offiziellen Normal­zeit kann ein externer DCF77-Empfänger angeschlossen werden. Der korrekte Emp­fang wird durch Mes­sung der Impuls­zeiten und der Über­prüfung des korrekten Telegramm­aufbaus geprüft. Gültige Tele­gramme setzen die RTC sekunden­genau auf den emp­fangenen Wert. Die Pola­rität des Empfangs­signals kann per Kom­mando eingestellt werden.

Ein spezieller Typ ist nicht erforderlich, er muss jedoch mit 5 V Versorgungs­spannung arbeiten können und ein TTL-kompatibles Ausgangs­signal liefern. Falls Sie hart­näckig keinen Empfang bekommen, versuchen Sie, das DCF-Signal zu invertieren (siehe Kommando dcfinv). Ich empfehle den Meinberg RU226, da ich mit diesem gute Er­fahrung gemacht habe.

Ein sehr simpler Algorithmus sorgt für ein 'sanftes' Nach­führen der RTC. Wenn die empfangene Zeit­infor­mation um mehr als 60 s von der RTC abweicht wird die Zeit 'hart' gestellt. Dazu müs­sen zwei aufeinander­folgende Tele­gramme empfangen werden, die bis auf 60 s die gleiche Abweichung zur RTC aufweisen. (Tat­sächlich habe ich auch schon Tele­gramme mit fehler­hafter Zeit empfangen, die trotzdem als Fehler­frei erkannt wurden. Mehrfache Bit­fehler die zu­fällig die kor­rekte Prüf­summe ergeben machen dies möglich.) Dabei können Minuten- oder Stunden­ereignisse verloren­gehen da sie nur vom Timer Inter­rupt aus­gelöst werden.

Bei kleineren Abwei­chungen läuft die RTC 1 % schneller oder lang­samer bis die Abwei­chung weniger als 1 s beträgt, d.h. ein Timer Interrupt wird ausge­lassen oder ein fiktiver zusätzlicher Inter­rupt wird eingefügt.

Auf diese Weise gehen im Gegen­satz zum harten Stellen der Uhrzeit keine Sekunden- oder Minuten­ereignisse verloren.

Sie können das stat-Kommando benutzen um zu sehen ob die DCF-Synchroni­sierung funk­tioniert. Beachten Sie, dass es selbst bei störungs­freiem Empfang bis zu drei Minuten dauern kann bis die Synchron­isierung gelingt. Es müssen mindestens zwei Tele­gramme störungsfrei empfangen werden und die Abwei­chung muss bis auf eine Minute genau überein­stimmen bevor eine harte Verstellung der Systemuhr vor­genom­men wird. Bei einem gestörten Tele­gramm beginnt diese Zeit von vorne...

Auf dem Display erscheint ein Antennen­symbol wenn ein Tele­gramm störungs­frei empfangen wurde. Die System­zeit muss dann jedoch noch nicht stimmen da sie erst beim zweiten Tele­gramm gesetzt wird. Umge­kehrt kann bei korrekter System­zeit das Antennen­symbol erlöschen wenn der Empfang gestört ist. Die Zeit läuft dann quarz­genau weiter.

DCF77-Empfänger

Es rentiert sich nicht, hier in paar Euro zu sparen um einen bil­ligeren Empfänger einzusetzen. Er würde Ihnen mehr Ärger und Zeit kosten als die paar Kröten wert sind! Wenn sie es billig haben wollen, schlachten Sie eine chi­nesische 5€-Funkuhr aus, wenn Sie sich nicht ärgern wollen, nehmen Sie einen guten Emp­fänger. Alles dazwischen macht nur Ärger. Verwenden Sie einen hochwertigen Emp­fänger wie den Meinberg RU226 und achten Sie auf die Montage­anleitung! Der Empfänger muss mit der Quer­seite der Ferrit­antenne mög­lichst genau nach Frankfurt zeigen (da befindet sich der Sender) und darf nicht auf Metall oder in der Nähe metal­lischer Ober­flächen oder Leiter­schleifen montiert werden. Auch 'Störsender' wie das Display selbst und ins­besondere sein Bluetooth-Modul sollten so weit wie möglich entfernt sein. Der größte Fehler wäre, den Empfänger in den Klemmen­boden zu montieren, nur weil da noch Platz ist. Nur so erhalten Sie störungs­freien Empfang!

Die DCF77-Sendefrequenz von 77.5 kHz ist fast genau die 5. Oberwelle der Zeilenfrequenz des PAL-Fernsehens von 15.625 kHz. Falls sie (so wie ich) tat­sächlich noch einen 'alten' Fernseher in der Nähe betreiben könnte auch dieser einen störungs­freien Empfang verhindern.

Bei mir im Labor hatte ich überall Störungen (viele Computer und andere Stör­quellen) bis auf eine kleine Stelle auf meinem Schreib­tisch. Wenn Sie Empfangs­probleme haben, verschieben Sie den Empfänger um einen halben Meter und pro­bieren Sie es erneut. Irgend­wann muss es klappen...

Signal-Ausgänge

Da noch Klemmen des Gehäuses unbenutzt waren, habe ich noch zwei potentialfreie Signalausgänge hinzugefügt. Es handelt sich dabei um die Foto­transistoren eines Opto­kopplers, die für externe Schalt­aktionen zur Ver­fügung stehen. Für jeden von diesen kann eine Schwelle festgelegt werden oberhalb und/oder unter­halb derer der Aus­gang aktiv ist.

Die Foto­transistoren haben einen gemeinsamen Emitter, sie sind also geeignet, zwei Eingänge einer externen Schaltung gegen deren Masse zu ziehen.

Jeder Ausgang hat zwei Parameter, "Aktiv unterhalb" und "Aktiv oberhalb". Die Werte sind in Litern, der Werte­bereich ist von 0 bis 65535.

Ein "Aktiv oberhalb" von 65535 wird also nie­mals schalten, ebenso wenig wie ein "Aktiv unter­halb" von 0 l.
Durch intelli­gente Wahl derselben sind mehrere Konfi­gurationen möglich, z.B.

Wenn Sie einen Ausgang nicht benutzen wollen und die Leistung des Optokopplers sparen wollen, setzen die "Aktiv unterhalb" auf 0 und "Aktiv oberhalb" auf 65535. Dann ist der Opto­koppler niemals aktiv. Dies ist auch der Default wenn Sie nichts anderes para­metrieren.

Elektrische Sicherheit der Ausgänge

Die Ausgänge sind durch Opto­koppler von der Schaltung getrennt, aller­dings nur mit etwa 5 mm Isolations­abstand. Die Schal­tung die sie daran an­schließen darf die Leitungen deshalb nicht mit der Netz­spannung verbinden sonst verlieren Sie den Isolations­abstand zum Display und dem Sensor! Manche Leute meinen, 3 mm sind genug, na ja, no risk no fun, ich bevorzuge in solchen Fällen allerdings better safe than sorry!

Sie dürfen damit also z.B. nicht direkt einen Thyristor schalten, der mit dem Netz ver­bunden ist. Sie können jedoch den Eingang einer SPS oder einer anderen, vom Netz getrennten Schaltung (z.B. den Parallel­port eines PCs) steuern.

Eine Klemme neben der Netz­ver­sorgung bleibt frei um 8 mm Sicherheits­abstand zum Netz ein­halten zu kön­nen.

Anzeige

Hinweis: Die Low-Cost 2x16-Anzeige wird in Zukunft nicht weiter unter­stützt und ist in der aktuellen Firmware möglicher­weise 'vernachlässigt'. Lesen Sie bitte trotzdem die fol­genden Zeilen da sie auch für die 4x20-Anzeige re­levant sind.

Die Anzeige (zwei Zeilen à 16 Zeichen) ist wie folgt auf­gebaut:

1234L<PChh:mm:ss
±1234 l/h ±1234*

Die erste Zeile zeigt dabei permanent die Füll­menge in Litern und die Zeit seit der letzten System-Mitternacht. Die Füll­menge wird über 10 Mes­sungen gemittelt. Während dieser Mes­sungen wird das jeweilige Mess­ergebnis angezeigt, danach bis zur nächsten Mess­reihe der Mittel­wert. Zur Unter­scheidung wird bei den Einzel­messungen ein kleines "l" ange­zeigt und beim Mittel­wert ein großes "L".

Die Zeichen ab Position 5 ("<PC") sind Error-Flags und sol­lten nie er­scheinen. An Po­sition 5 kann dabei ein "<" er­schei­nen falls weniger als 10 Mess­werte für die Ent­fernung empfangen wurden (sehr wahr­scheinlich überhaupt keines, was auf eine unter­brochene Sensor­leitung oder Sensor­defekt hinweist) oder ein ">" falls mehr als 10 Werte empfangen wurden. Eigentlich sollte das Display den Sensor nach dem 10. Wert abschalten. Das ">" weist auf einen Defekt im Bereich der Konstant­strom­quelle um T1 hin, d.h. das Display kann die Sensor­versorgung nicht ab­schalten.

Das "P" bedeutet Parity-Error und das "C" Checksum-Error bei der Kommunikation mit dem Sensor. Dies kann auf ein zu langes oder ungeeignetes Sensor­kabel oder einge­koppelte Störungen hinweisen. Es kann auch durch einen zu niedrigen Strom der Konstant­strom­quelle entstehen so dass die Sensor­versorgung durch den hohen Sendestrom (insbes. bei Terminierung mit jeweils 120 Ω an den Leitungsenden) einbricht und so ein Sensor-Reset ausgelöst wird.

Die angezeigte Wasser­menge ist bei Erscheinen von min­destens einem dieser Flags unzuver­lässig und möglicher­weise veraltet oder völlig falsch.

Die Error-Flags bleiben im Display auch wenn der Fehler nicht mehr vorliegt und werden erst zur nächsten vollen Stunde (oder bei einem Reset) gelöscht.

Die zweite Zeile wechselt zyklisch zwischen folgenden Anzeigen:

Erweiterte Anzeige

Für den Autor hat sich die Low-Cost-Version mit einem zwei­zeiligen Display als unzu­reichend erwiesen. So gibt es die Möglich­keit, im Source­code auch ein vier­zeiliges Display mit 20 Zeichen pro Zeile auszuwählen wenn man bereit ist, sich diesen Luxus auch in Hard­ware zu gönnen (tat­sächlich reden wir hier nur von ein paar Euro!).

Dann werden fol­gende Werte auf einem vier­zeiligen Display wie z.B. auf einem Winstar WH2004A angezeigt:

1234L<PChh:mm:ss ¡
01234.1 l/h 01234.1*
01234.1 l/d 01234.1*
12.3 °C 340.1m/s

Die erste Zeile ist identisch mit der 2x16-Version. In der zweiten und dritten Zeile werden per­manent die Verbräuche für die laufende und ver­gangene Stunde sowie für heute und gestern angezeigt.

Die vierte Zeile wechselt zyklisch zwischen fol­genden Anzeigen:

Nur in der erweiterten Anzeige ist auch ein Antennen­symbol für den DCF77-Empfang zu sehen!

Ganz rechts wird ein vertikales Balken­diagramm für den Füllstand angezeigt. So können sie optisch den Füll­stand mit einem Blick erfassen.

Die 4x20-Anzeige wurde aufgrund der geringen Mehrkosten zum Standard definiert und ich unterstütze das 2x16-Display nicht mehr aktiv. Wenn Sie in Ihren Sourcen die 2x16-Anzeige wählen kann es sein, dass sie nicht wie erwartet funktioniert. Ich bemühe mich auch weiterhin, das 2x16-Display zu unterstützen aber ich teste dies nicht weiter. Verwenden Sie das 4x20-Display und Sie haben keine Probleme.

Hinterleuchtung

Das gewählte LC-Display besitzt eine LED-Hinter­leuchtung, die wir nicht ungenutzt lassen wollen. Da wir bereits einen hocheffizienten Schalt­regler einsetzen um die 5 V zu erzeugen können wir uns auf­wändigere Schaltungen ersparen und das Back­light einfach über einen 4,7 Ω-Widerstand an 5 V legen. Ich habe noch einen Tran­sistor als Schal­ter eingefügt mit dem der Con­troller das Back­light schalten und per PWM auch dimmen kann. Als Strom habe ich bei meinem Prototyp 183 mA (bei 100 %) gemessen.

Sound

Da wir noch Portpins und Timer frei haben entschloss ich mich, einen Piezo-Tongeber an Timer 3 anzu­schließen. Die Sound­routinen erlauben es, beliebige Töne, Musik­noten oder komplette Musik­sequenzen mit minimalem Over­head im Inter­rupt abzuspielen. Die 'Musik' ist dabei monoton, ich wollte eigentlich keinen Synthesizer program­mieren...

Sequenzen können program­miert werden für

Allerdings sind die Sequenzen selbst derzeit nur im Source­code änderbar und nicht konfi­gurierbar.

Die Sequenz für den System­start ertönt nach jedem Reset und ist nicht de­aktivier­bar.

Die Sequenz für Signal­ausgang 1 wird in jeder Minute zur 10. Sekunde wieder­holt und klingt etwas aggressiver. Ausgang 1 ist deshalb besser für dringliche Mel­dungen geeignet.

Die Sequenz für Ausgang 2 ist dezenter und wird nur zu jeder vollen Stunde in der 20. Sekunde wieder­holt.

Da dies möglicher­weise nervig sein könnte ist eine Zeit­spanne program­mierbar, außerhalb derer keine akustischen Meldungen erfolgen.

Zusätzlich gibt es eine soundmask mit der folgende Meldungen aktiviert werden können:

Um die soundmask zu berechnen, addieren sie die oben genannten Werte die Sie benötigen. Wenn Sie z.B. Signal­ausgang 1 immer hören wollen und den Stunden­schlag wün­schen ist die soundmask folglich 5.
Der Stunden­schlag ist eigent­lich nichts, was wirklich in ein Gerät wie dieses gehört aber ich habe mir lange überlegt, was man aus dieser Hard­ware noch machen könnte und aus Lange­weile und purem Über­mut habe ich ihn implemen­tiert.

Ein Besucher meiner Web­site hat mir letzt­lich doch noch eine Idee gegeben (zu Zeiten als Google noch die Suchbegriffe übe­rmittelte): Ab der ersten Serien­version gib es den

Analogausgang

Für Nostalgie-Versionen kann auch auf das LCD verzichtet und ein 100 µA Drehspul­messwerk einge­setzt werden, dass dann den Füll­stand in % anzeigt.

Ich habe die Mittel­wert­bildung des PWM-Signals von Timer 1 C einem RC-Glied über­lassen und für die Umwandlung in einen Analogwert den zweiten, bisher unge­nutzten OpAmp als spannungs­gesteuerte Strom­quelle benutzt, der somit ein weit­gehend AC-freies Signal erzeugt. Das Signal ist nicht GND-bezogen aber für ein Drehspul­messwerk ist das ja egal.

Über X12 wird das Mess­werk ange­schlossen. Zusätzlich zum analogen Signal steht auch noch das dimmbare Beleuchtungs­signal sowie +5V zur Verfügung, falls ihr Messwerk eine Be­leuchtung besitzt. Verwenden Sie für die Zulei­tung zum Mess­werk eine ver­drillte Zweidraht­leitung, ebenso wie für die Zuleitung zur Beleuchtung um Über­sprechen zwischen dem Analog­signal und dem steilflankigen Beleuchtungs­signal zu minimieren.
Die Pin-Reihenfolge von X12 ist 'verpolungs­tolerant' d.h. bei verkehrt herum gestecktem X12 schlägt das Instrument ins Negative aus und die Beleuchtung ist verpolt, was für Skalen­lämpchen egal ist und selbst LEDs tolerieren sollten.

Der Strom ergibt rechnerisch bei 2,7 V am RC-Glied 100 µA so dass Bauteil­toleranzen gut per Software ausge­glichen werden können. Eine entsprechende Kalibrierungs-Prozedur für den Vollaus­schlag des Instru­ments wurde imple­mentiert.

Der gewählte OpAmp ist kein echter Rail-To-Rail Typ des­halb können wir nicht den gesamten 5 V Spannungs­hub ausnutzen. Er kann 0 V recht gut dar­stellen aber Ausgangs­spannungen nahe VCC werden nicht erreicht.

Da der Timer 8 Bit Auf­lösung hat kann der Anzeige­wert nur auf etwa 1 % genau einge­stellt werden aber genauer kann man ein analoges Mess­werk ohnehin kaum ablesen. Messungen mit einem genauen Digital-Ampere­meter bestätigen eine Genauig­keit besser als 1 % des Vollaus­schlages.

Wenn Sie auf das LCD verzichten, setzen Sie unbedingt den Display-Typ auf Analog. Die meisten Funktionen würden zwar auch mit LCD-Typen funk­tionieren da die LCD-Routinen ein Timeout verwenden falls das Display nicht antwortet. In einigen Fällen kann das Timeout jedoch lang genug sein um einen Watchdog-Reset auszulösen.

Nun, das war wohl die letzte Inspiration die ich von einem Besucher bekommen sollte denn seit September 2013 scheint Google keine Keywords mehr zu über­mitteln. Deshalb kann ich nur empfehlen, benutzen Sie nicht Google für die Suche. Nur Google weiss noch, wonach sie gesucht haben. Ich kann meine Seite und mein Projekt nicht mehr verbes­sern denn ich erfahre nicht, wonach sie gesucht haben (wer sie sind erfahre ich sowieso nicht, auch wenn Google es wahr­scheinlich weiss). Benutzen sie nicht Google!
Natürlich können Sie trotzdem Google benutzen wenn Ihnen danach ist und Sie können mir einfach eine Email schreiben, was ihnen an meiner Seite fehlt. Aber dieser Daten­schutz-Aktionismus nervt.

Stackchk

Ein Modul namens 'Stackchk' wurde hinzugefügt um die Reserve an freiem Speicher (also zwischen Heap und Stack) zu schätzen. Dies ist nur aktiv wenn Sie die Variable 'WITH_STACKCHK' per #define erzeugen. Sie können das in den Project-Properties unter "Compiler"-"Symbols" erledigen. Andernfalls reduzieren sich alle Calls auf die Funktionen auf ein simples Return. Ein guter Optimizer sollte Calls auf ein Return eliminieren. Leider ist dies in der aktuellen Version nicht der Fall aber wir verlieren dadurch lediglich drei Bytes an Programmspeicher, was normalerweise kein Problem darstellt.

In der aktuellen Version zeigt dies knapp 400 Bytes Reserve so dass wir uns keine Gedanken über eine Stack-Kollision machen müssen.

Kommandos

Folgende Kommandos sind bisher implementiert:

Abkürzen von Kommandos

Kommandos sind Case-Insensitive, d.h. Groß-Klein­schreibung spielt keine Rolle. Außerdem wird das Kommando nur bis zu seiner angegebenen Länge ausge­wertet, d.h. cal ist Äquivalent zu Calibrate oder im Extremfall d ist äquivalent zu DCFInf. Wenn Sie solche Abkür­zungen verwenden sollten Sie sich angewöhnen, eindeutige Abkürzungen zu verwenden. Möglicher­weise kommen Kommandos hinzu, die sich mit Ihren Abkür­zungen über­schneiden und möglicher­weise stimmt die Sortierung im Source­code nicht mit der von Ihnen erwarteten überein... Insbesondere in Skripten oder anderen programm­gesteuerten Aktionen sollten Sie die Kommandos stets ausschreiben.

Beachten Sie: alle Änderungen der Konfi­guration (einschließlich der Kali­brierung) werden zunächst nur im temporären Speicher abgelegt und erst durch ein Write-Kommando permanent!

Parameter können nicht abgekürzt werden. Sie können z.B. deb dfc schreiben anstatt debug dcf aber deb d wird nicht funk­tionieren!

Kommandos mit Neustart

Einige Kommandos enden mit einem Neustart des Geräts. Dies wird durch einen Watchdog-Reset bewirkt da es keine andere Möglichkeit gibt auch die Hardware des Controllers zurück zu setzen. Es ist normal, dass nach diesen Kommandos eine Fehler­seite eingeblendet wird, die das anzeigt.
Nach einem echten Power-Down-Reset (aus- und wieder ein­schalten) sollte diese jedoch ver­schwinden.

Debug-LEDs

Zum Debugging habe ich dem Display noch vier verschieden­farbige LEDs spendiert. Solange die Schaltung nicht in 1000-er Stück­zahlen läuft ist der finan­zielle Aufwand vernach­lässigbar, später kann man sie weg­lassen. In der aktuellen Firm­ware zeigen sie folgendes an:

Die blaue LED wird auch für den Fertigungs­test benötigt und sollte daher nur mit sehr guten Gründen geändert werden!

Helligkeit

Damit kann man es wohl niemandem recht machen. Die einen sagen, es ver­brennt ihnen die Netz­haut, andere meinen aus 5m Ent­fernung kann man sie kaum noch er­kennen. Ich habe einen Mittel­weg gewählt und sie mit jeweils 10 mA bestromt. Damit sind moderne LEDs, sagen wir, hell. Ein vier­poliger Jumper ermöglicht den Anschluss des Tastkopfes eines Oszilloskops um die Zeiten exakt zu messen. Überrascht hat mich die Hellig­keit der grünen Vishay-LED. Im ersten Proto­typen funzelte noch eine Osram-LED vor sich hin aber die Vishay sieht aus als ob in ihrer Umgebung Schweiß­arbeiten vor sich gingen. Ihr Vorwider­stand muss dringend erhöht werden.

Natürlich können Sie die LEDs auch für andere Zwecke gebrauchen. Die Sourcen haben Sie ja...

Factory Test

Ich habe einen einfachen Factory Test implemen­tiert, der in der Lage ist Kurz­schlüsse zwischen zwei Ausgängen oder einem Ausgang und der Ver­sorgung zu erkennen.

Eingänge können damit nicht überprüft werden da die Soft­ware den Zustand der Eingangs­leitungen nicht beein­flussen kann.

Dazu wird ein "walking zero" und ein "walking one" durchgeführt, d.H. alle Aus­gänge werden gesetzt und ein einzelnes 0-Bit wandert durch alle Pins. Solange nur dieses Bit 0 ist und alle anderen 1 bleiben ist alles OK. An­schließend werden alle Pins auf 0 gesetzt und eine 1 wandert durch alle Bits. Damit können viele (aber nicht alle) Kurz­schlüsse erkannt werden.

Alle Versorgungs­spannungen werden gemes­sen und mit vor­definierten Grenz­werten ver­glichen. Die Kalibrierungs­prozedur muss vorher durch­gefühert werden um die Grenz­werte sicher zu erkennen.

Außerdem kann er den SWUnreg-Switch überprüfen da er die anliegende Spannung messen kann. Er zeigt die Anstiegs­zeit der SWUnreg (bis auf 90 % von Unreg) und deren Abfall­zeit (auf 10 % von Unreg) die, bei gegebenen Prüf­bedingungen (ange­schlossener Sensor, 10m Kabel), vorher­sagbar sind. Damit kann die Funktion der Konstant­stromquelle über­prüft werden. Typische Werte für die Anstiegs­zeit in diesem Fall sind eine knappe Mikro­sekunde und für die Abfall­zeit etwa 20 µs.

Er kann jederzeit mit dem Kommando FTest aufge­rufen werden. Beachten Sie dabei, dass kurze Spikes z.B. auf den Signal­aus­gängen oder den seriel­len Schnitt­stellen auftreten, die evtl. unerwartete Neben­wirkungen zeigen.

Der Factory Test endet stets mit einem Reset des Displays

LITERS_T

LITERS_T ist ein typedef für alle Volumen­einheiten im System und in meinen Sourcen als double definiert.

Manche Leute mögen sagen, ein Integer wäre genug. Ich benutze jedoch für die meisten Berech­nungen Fließkomma-Arithmetik aus folgenden Gründen:

Wenn Sie komplexe Berechnungen durch­führen müssen, tun Sie dies in Fließkomma-Arithmetik! Bedenken Sie jedoch, dass der '='-Operator dann prinzipiell nicht verwendbar ist. 2 ist eben nicht gleich 1.9999973!

Für mich gibt es nur wenig Gründe, von diesem Prinzip abzuweichen:

Beide Listen erheben keinen Anspruch auf Voll­ständigkeit. Wenn Sie zu dem Schluss kommen, int_16 reicht für LITERS_T, defi­nieren Sie es um. Ich kann ihnen jedoch nicht garantieren dass es einfach so funk­tioniert obwohl ich mich bemüht habe, die Schnitt­stellen kompatibel zu halten. Ver­wenden Sie auf keinen Fall vorzeichenlose Typen! Ihr Volumen kann negativ werden wenn die Zisterne 1cm tiefer ist als Sie ge­messen haben. Die Aus­wirkungen könnten Sie sonst über­raschen!

Layout

Hier ein paar Hinweise zum Layout.

Allgemein müssen in Strom­kreisen mit hohem di/dt induktive Anteile der Leiter­bahnen minimiert werden. Hohes di/dt treten in unserer Schal­tung natürlich im DC/DC-Konverter auf, aber auch in der PWM-Schaltung zum Dimmen des Backlights.

Die Induktivität sinkt mit der Breite der Leiter­bahnen und wächst mit der Länge und der umschlos­senen Fläche.

Verwenden sie breite Leiter­bahnen. 0.3 mm sind nicht genug, auch wenn sie den Strom theo­retisch tragen können. 1 mm ist immer noch zu schmal. Ver­wenden Sie Flächen, so breit und kurz wie nur irgend möglich! Machen Sie sich klar, welchen Rückweg der Strom nehmen muss und verlegen Sie Hin- und Rückweg so eng wie möglich neben­einander um die umschlos­sene Fläche zu minimieren. Jeder Milli­meter den Sie sparen können ver­bessert das Ergebnis.

Da der Rück­weg regelmäßig über GND führt muss die Ground­plane die erste unter der Bestückungs­seite sein!

DC/DC-Konverter

Für den DC/DC-Konverter bedeutet dies:
U8 schaltet, somit ergibt sich das höchste di/dt in den Kreisen um U8. Minimieren Sie die Fläche um C10, U8, L2, C12 sowie D2, L2 und C12.

PWM Dimming

Für den Dimmer-Schaltkreis bedeutet dies:
Minimieren Sie die Fläche um C5, Backlight, R12 und T3