Powered By Blogger

Montag, 26. September 2016

halb voll oder halb leer? - Füllstandsmessung meiner Wasserkiste mit MPXV5004 / MPVZ5004

halb voll oder halb leer? - Füllstandsmessung meiner Wasserkiste mit MPXV5004 / MPVZ5004


Warum
Die Frage mal wieder nach dem warum. Nun, ganz einfach, in einem noch nicht geschriebenen Eintrag habe ich mir eine Bewässerungsanlage für meinen Balkon gebaut, die mit einem Reservoir in Form einer Blechkiste arbeitet. Die Kiste hat ein Fassungsvermögen von 140 Litern und muss je nach Wetter im 5-10 tägigen Rythmus immer wieder per Schlauch befüllt werden. Um diesen Zeitpunkt nicht zu verschlafen oder die Pumpe trocken laufen zu lassen, wenn es doch mal vergessen wurde, muss der Füllstand eben ermittelt werden. Nun ja, jeder redet von IoT oder Smart Home, also los...


Wie
Es gäbe die Möglichkeit, den vorherigen Post mit dem kapazitiven Messen der Bodenfeuchte zu benutzen. Sprich einen Sensor außen oder innen auf die Wand aufzubringen und mit Hilfe der Kapazitätsänderung die Höhe zu detektieren. In meiner Kaffeetasse hat das auch funktioniert aber es gibt die Einschränkung, dass die Leiterplatte des Sensors so lang sein muss, wie die Wand hoch ist. Das wäre in meinem Falle 400mm und führt zu hohen Kosten bei der Platine. Weiterhin ist das Wandmaterial Aluminium und wer weiß wie gut es dann noch funktioniert. Alternativ könnte man auch nur einen bestimmten Bereich überwachen, sprich kurz vor leer oder kurz vor voll.
Dann gibt es Druckschalter. Die würden, vorrausgesetzt man findet den richtigen, bei einem bestimmten Druck schalten. Damit könnte man nur Schwellen schalten, möglicherweise nur eine.
Eine weitere Möglichkeit sind optische Füllstandssensoren. Auch hier wieder nur die Kontrolle ob an einem bestimmten Punkt Flüssigkeit vorhanden ist. Nimmt man genügend, hat man ein Raster und könnte diskret die Füllhöhe abtasten. Schaut man sich die Preise bei Reichelt an, dann wäre dies ein ganz schön teurer Spaß.
Ultraschallsesorik wäre auch ein interessanter Ansatz, die Sensoren sind günstig, die Füllhöhe liegt im Messbereich und es ist fast in jedem Auto verbaut. Nun mich hat die zu entwicklende Schaltung ein wenig abgeschreckt. Denn wer weiß ob und wie gut es am Ende funktioniert.
Wer mag, der liest bei Wikipedia was es noch alles gibt.
Es bleibt für mich das Messprinzip über den Druck, den die Wassersäule ausübt, übrig. Sprich einen Drucksensor der den Druckunterschied zwischen voll und leer genau genug detektieren kann. Für diesen Einsatzzweck gibt es auch spezielle Sensoren, die im richtigen Druckbereich arbeiten. Also los, den nehmen wir...


Was Google sagt
http://www.smartewelt.de/sw4/?q=zisterne
http://www.forum-raspberrypi.de/Thread-messen-steuern-regeln-pius-die-zisterne-sendet-daten-zum-wasserstand
http://www.gerhard-schoettke.de/Hobbys/Basteleien/Fullstandsanzeige/fullstandsanzeige.html

ansonsten nix brauchbares. Daher wird es selbst gebaut.


Sensorauswahl
Schaut man was z.B. bei Reichelt beischaffbar wäre, kommt man zu NXP. Auf deren Webseite findet man dann 7 Sensoren im Messbereich bin 10kPa, was 1m maximaler Wasserhöhe entspricht. Optimal wäre 40cm, denn meine Kiste ist 30cm hoch. Also habe ich ausgewählt: MPXx5004. Dieser hat eine Genauigkeit von +/-6,25% und mit AutoZero +/-2,5%. Dies enspricht einem Messfehler von +/-25mm und mit AutoZero +/-10mm. Der Fehler mit AutoZero las sich beim Durchblättern des Datenblattes als Absolutfehler bezogen auf den "wahren" Messwert und ich dachte mit eigener Kalibrierung wäre dieser durchaus behebbar. Dies sollte sich später als Trugschluss erweisen aber später dazu mehr.


Schaltung
Die Schaltung ist recht simpel. Die vom Sensor erzeugte Spannung wird per Spannungsteiler vom Mikrocontroller gemessen und weiter verarbeitet. Der Sensor arbeitet mit VCC=5V und erzeugt bei 400 mm auch in etwa 5V analoge Ausgangsspannung. Damit ergibt sich ein Spannungsteiler von 270/330 kOhm, damit der gesammte Messbereich des Sensors genutzt werden kann. Als Mikrocontroller wird der ATmega8, der 2,56V als Referenzspannung bereitstellt, verwendet. Damit ergeben sich 25mV/Bit und das entspricht ca. 0,4mm/Bit. Also liegt der Messbereich von 1 mm im Bereich von ~3 Bit. Ich denke das ist ausreichend und genau genug. 


Messungen
In den ersten Messungen ergab sich dann aber eine sich stark ändernde Verlaufsgrafik, trotz kostantem Wasserpegel. Erste Ideeen auf mechanische Fehler (Sonne, Undichtigkeit) konnten sehr schnell ausgeschlossen werden. Hier im Bild ist eine Abweichung von 7 mm (von max zu min) zu erkennen. Liest man sich die Dokumentation des AtuoZero-Verfahrens durch, dann stellt man fest, dass hiermit nix zu erreichen ist. AutoZero kompensiert die generelle Abweichung vom echten Messwert aber kompensiert keinen Drift und meint auch nur in einem Bereich von +/-5°C. Also woher kommt dieser? Nun, viele Möglichkeiten blieben nicht übrig und siehe da, die Temperatur scheint sehr gut zu passen. Gelinde gesagt ist der Sensor stark Temperaturabhängig obwohl er als Temperature compensated beworben wird.



Erste Auswertung Temperatur zu Druck bei konstantem Druck

physikalischer Zusammenhang
Wird der gemessene ADC Wert (um Berechnungseinflüsse auszuschließen) über die Temperatur in einem xy-Diagramm aufgetragen, so kommt es zu einem nahezu linearen Zusammenhang. Dies ist perfekt für eine nachträglich Berechnung des "wahren" ADC / Druckwertes. Da die Kurve nahezu perfekt linear ist, ist davon auszugehen dass es sich hier um die gesuchte Einflußgröße handelt.
linearer Zusammenhang Druck vs. Temperatur, ADC Messwert gemessen über Spannungsteiler


Kompensation berechnen
Die Kompensation der Temperatur kann an mehreren Stellen erfolgen. Entweder man berechnet aus dem gemessenen ADC Wert den "richtigeren" oder man berechnet den Druck und danach dann den kompensierten Druck. Hier spielt es die Rolle, wie man die Auswerelektronik dimensioniert hat. Ich verwende den ATmega8. Daher wird die Kompensierung direkt nach der Messung gemacht und nur das gültige Messergebnis ausgegeben.

Dank Trendlinienfunktion lässt sich die Temperaturabhängigkeit schnell bestimmen: f(T)=0,00603*T, die Steigung ist die Abhängigkeit. Die Verschiebung ist der Offset, der später ermittelt wird.
linearer Zusammenhang Druck vs. Temperatur, ADC Messwert in Druck umgerechn

Um jetzt die einzelnen Messwerte zu korrigieren, müssen diese quasi neu berechnet werden. Hat man aus der ADC Messung den Druck regulär berechnet, so ist von diesem dann der Fehler abzuziehen. Dafür muss man festlegen, für welche Temperatur man den neuen Druck dann berechnen will. Das ist quasi egal, denn die Abhängikeit ist linear aber man darf nur nicht diesem Bereich verlassen. Im Datenblatt des Sensors ist von 25°C die Rede, also nehmen wir diese auch. Als Erstes wird für diese 25°C der Wert aus der Kompensationsformel berechnet oder im Diagramm abgelesen (0,151kPa).
Als Zweites wird dann aus der aktuellen gemessenen Temperatur die Abhängikeit berechnet, also auch in die Formel eingesetzt. Danach wird die Differenz zwischen f(25°) und f(x) gebildet. Als Letztes wird zum ermittelten Druckwert das Ergebnis der Differenz addiert.

P_new = f(25°) - f(x) + P_old


kompensiertes Drucksignal in Grün

Was nicht betrachtet wurde
Die Grafik zur Kompensation wurde aus einem kleinen Datensatz erstellt. Mit diesem ist er bei mir seit mehreren Wochen erfolgreich im Einsatz und hält auch bei größeren Temperaturschwankungen sicher den Messwert konstant oder läßt ihn im Bereich von +/-1 mm schwanken. Durch die vielen Datenauswertungen habe ich die Vermutung und auch das Datenblatt stützt mich darauf, dass der Sensor eine Hysterese besitzt und dass er bei unterschiedlichen Druckwerten anders auf die Temperaturen reagiert. Sprich die Steigung der Kompensationsgeraden evt. unterschiedlich sein kann. Das habe ich aber dank der für mich wirklich guten Ergebnisse nicht weiter verfolgt


Fazit
Der Sensor ist ohne Kompensation für halbwegs genaue Messaufgaben gerade im Outdoor Bereich nicht gut geeignet. Wird aber mittels Mikrocontroller + Temperatursensor dieser Markel behoben, so kann man ihn vertrauensvoll einsetzen. Es betrifft übrigens auch die Sensoren der MPX5010, MPXV5010, MPVZ5010 Reihe.


Links
Application Note AN1636 / AutoZero
Datenblatt MPXV5004
Sensor PCB

 
Kontakt
blumengiesser@posteo.de


Samstag, 13. Dezember 2014

darf es noch ein wenig Wasser sein? - Messung der Bodenfeuchte

Remote XBee Feuchtemessung


Warum
Ja warum? Ich kann nur meinen Unmut darüber zum Ausdruck bringen, dass entweder mir oder meinen in der Urlaubszeit angeheuerten Lackaien es nicht gelungen ist, meine durchaus spärlich vorhandenen Pflanzen mit genügend Wasser zu versorgen. Oft, ich will nicht sagen fast immer ist es ihnen nicht gelungen diese vor dem Tod oder dem Scheintod zu bewahren. Nun ich bin selbst nicht der mit dem grünsten Daumen, daher musste technische Abhilfe her. Gesagt getan.


Wie
Bei der Bodenfeuchtebestimmung gibt es zwei vorrangige Möglichkeiten. Es kann per Leitfähigkeit bestimmt werden, wie viel Wasser sich im Boden befindet oder per kappazitiver Messung. Bei der Leitfähigkeit ist es entscheidend zu wissen, wie groß der Abstand der Elektroden ist, es spielt der Strom eine Rolle und da die Elektrode freiliegend sein müssen, können diese korrodieren. Im allgemeinen gelten die Gesetze der Elektrolyse (der Salzgehalt im Boden beeinflußt natürlich auch den Leitwert). Nun es spricht viel dafür, diese Methode nicht zu nehmen und so ist es auch. Ich habe die kappazitive Messung ausgewählt. Diese misst im Prinzip die Dichte der Erde. Das bedeutet es fließt kein Strom durch die Erde sondern es wird die Dichtenänderung per Schwingkreis ermittelt.


Was Google sagt
Das Rad wurde natürlich schon erfunden, siehe hier:

[1] http://wemakethings.net/chirp/

[2] http://www.mikrocontroller.net/topic/169824?goto=new#new
[3] http://www.mikrocontroller.net/topic/335407?goto=new#new
[4] http://www.mikrocontroller.net/articles/Giess-o-mat
[5] www.weisser-engineering.de

Wie das auch immer wieder bei den Autos ist, es gibt jedes Jahr neue und im Endeffekt fahren sie auch nur von A nach B und auch hier funktioniert es zwar aber genau das was ich suchte war nicht vorhanden, daher ging nix über angepasst nachbauen...


Versuche
Als ersten Versuch habe ich den Schaltungsaufbau Flugverdrahtet und eine Platine verwendet, die nur als Sensor in der Erde steckt.Funktioniert!!
erster Test










Als nächstes habe ich mir eine Demoplatine besorgt, die dann die Elektronik aufgelötet bekommen hat. Diese hat auch gut funktioniert, nur rechteckig und zu lang. Von der Schaltung her, viel zu viele (nutzlose) Bauteile.
Demoplatine










Dann kam endlich der erste eigene Prototyp! Bestehend aus Platine, 74HC14, Wiederstand und Kondensator + Kabel. Eingegossen in Heißklebe. Tadellose Funktion bisher...
erster Prototyp










Nach den ganzen Prototypen kommt hier der eigentlich Sensor. Was die anderen def. nicht können, ist die Messwerte per Funk an einen Zentralen Server schicken. Diese Lösung habe ich per XBee UART Brücke gelöst. Also ein Atmel Mikrocontroller misst dank der funktionierenden Feuchteschaltung den Wert und schickt ihn per Funk an einen Raspberry Pi. Der Sensor hat drei (3) AAA Batterien und eine stromsparende Software, die alle 5 Minuten aufwacht und die Daten incl. Temperatur überträgt. Damit bleiben auch entfernte Blumenkübel immer im Blick.

remote Sensor mit XBee












Schaltung
Die Schaltung ist aus den gefundenen Google Links übernommen und funktioniert tadellos. Es entsteht je nach verwendetem Wiederstand (empfohlen wird 1x 1.0M) eine perfekte Rechteckspannung. Die Frequent variiert je nach Länge des Sensorelementes.
Schaltplan
  










Messung / Ankoppelung an den Mikrocontroller
Die Messung der Frequenz sollte über den Timer/Counter Input Capture Pin ICPx laufen. Hier wird der Timer laufen gelassen und sobald der Input Capture Pin seinen Pegel ändert (je nach Einstellung, siehe Datenblatt) wird der Wert bis zu dem es der Timer geschafft hat in ein Register (ICRn) gepeichert. Dieses muss nurnoch ausgelesen werden und schon hat man die Frequenz mit der der Schwingkreis schwingt, ähm wie feucht der Boden ist. Eine Umrechnung zwischen Frequenz und Feuchte habe ich mir erspart, das das wohl etwas zu schwierig ist (unterschiedliche Erdarten,steinig, tonig etc..). Bei der Messung mittels ICPx sollte man darauf achten, dass a) der Schwingkreis für den eigenen Schaltungsaufbau nicht zu schnell schwingt. Sonst läuft der Mikrocontroller mit Interrupten über und kann nix anderes machen. Und b) im Interrupt selber der Capture Wert vom aktuellen Timerwert abgezogen wird. Das hängt damit zusammen, dass der Mikrocontroller bei erreichen des Interruptes nur das Interruptflag TIFR setzte. Ausgeführt wird dieser erst dann, wenn er an Reihe ist. Daher läuft der Timer evtl. weiter und ein falscher Wert wird in ICRn gespeichert. Daher lassen wir den Timer mit der Differenz loslaufen.

ISR (TIMER1_CAPT_vect) {

    TCNT1 = TCNT1 - ICR1;
    compare_register = ICR1;

}


(Das Beispiel steht exemplarisch für einen Atmel ATmega8)


Ausblick
  • Ich baue gerade nur eine Version auf, die per LED und Piezo die Feuchtigkeit anzeigt. 
  • In Zukunft wird die Erfassung der Feuchtewerte auch eine gesteuerte Wasserzufuhr ermöglichen 

Feedback:
blumengiesser@posteo.de 
 

Samstag, 19. Januar 2013

ultra bright bicycle lamp - theLamp v6.0


ultra bright bicycle lamp - theLamp v6.0

vorwort
Schon mal draußen mit dem Fahrrad unterwegs gewesen und in absoluter Dunkelheit mal wieder nix gesehen, durch ein Schlagloch gefahren oder den Bordstein übersehen? Nicht noch einmal habe ich mir gedacht und es sollte Tag auch beim Fahren mit dem Fahrrad sein. Aber nur wie? Nach langen Überlegungen startete dieses Projekt schon 2008, zu Zeiten meiner Diplomarbeit und ist jetzt in der Version sechs angelangt und ich trau mich darüber einen Blog zu füllen. Die Lampe war und ist nie "fertig", dies wird immer so sein aber lichttechnisch kann sie wirklich locker mit den Top 10 mithalten. Damals als ich damit anfing, gab es nur den BigBang [link] und sonst nix...


vergleich
Erstmal ein kleiner Vergleich. Auf den nachfolgenden Bildern ist meine Lampe gegen eine Busch&Müller IXON IQ Speed (max 50 Lux) verglichen. Beide Bilder sind jeweils mit den gleichen Einstellung an der Spiegelreflexkamera aufgenommen worden. Wie man sehen kann, ist theLamp V6.0 deutliche heller. Die Belichtungszeit an der Spigelreflex mußte auf 1/3s geändert werden, damit das Bild in etwa dem der Busch & Müller entsprach. Das entspricht ungefähr dem Dreifachen an Lichtleistung. 



BUSCH & Müller IXON IQ Speed aufgenommen mit ISO 200, 2s, F3.5, f18mm

theLamp V6.0 aufgenommen mit ISO 200, 2s, F3.5, f18mm





aufbau
Die Lampe besteht aus drei,5 Teilen. Lampengehäuse mit drei High Power LED's, Fernlichtschalter, USB-Ladebuchse und die Elektronikbox mit Elektronik und Fahrradrahmenhalter. Alles logischer Weise verbunden mit Kabeln. Das Lampengehäuse wird mit einen Klick-fix Adapter am Lenkerrohr befestigt. Die USB-Ladebuchse ist durch das Vorhandensein der 5V Spannung eigentlich nur Abfall, der es aber auf längeren Touren ermöglicht, daß das Smartphone unendlich lange betrieben werden kann.


die Lampe zusammengesteckt mit allen Bauteilen 


lampengehäuse
Das Lampengehäuse ist ein in 3D gezeichnetes und mittels CNC aus Aluminium gefertigtes Bauteil. Dies ist nötig, da es sich bei den LED's um sogenannte High Power LED's handelt, die jeweils eine Leistung von ca. 3.3 W haben. Diese Leistung entsteht fast nur in Form von Wärme, die sofort abgeführt werden muss da sonst die LED's den baldigen Hitzetod sterben würden. An sich ist das Lampengehäuse ein stylischer Kühlkörper. Eingebaut sind drei CREE XR-E 7090 mit Linsenhalter und Spotlinse mit 10° Öffnungswinkel. Dadurch entsteht ein sehr gut ausgeleuchteter Fleck. Die LED's werden mit 1A Strom versorgt. Als Schutz dient eine Plexiglasscheibe vor äußeren Einflüssen.


Lampengehäuse von vorn

Lampengehäuse von hinten


fernlichtschalter
Der Fernlichtschalter ist ein aus Aluminium gefertigtes Bauteil in dem ein Taster [link] mit einer blauen LED verbaut ist. Zum Schutz ist eine weiße Abdeckkappe am Taster versehen. Damit kann der Taster neutral weiß oder Fernlicht blau leuchten. Mit dem Taster realisiere ich das Fernlicht AN/AUS sowie auch den Standby Modus der Lampe. Dann ist die high power LED komplett dunkel aber lässt sich am Lenker Ein- oder Ausschalten.


elektronikbox und inhalt
Die Elektronikbox beinhaltet simpler Weise den Akku und die notwendige Elektronik. Bei dem Akku handelt es sich um einen selbst gebauten Akkupack bestehend aus vier Samsung SDI ICR18650-26F Lithium-Nickel-Mangan-Kobaltoxid-Akkus mit einer Zellspannung von 3.7V und einer Nennkapazität von 2,6Ah. Daraus entsteht dann ein 14.8V und 2.6Ah Hochleistungsakku. Dieser besitzt eine verfügbaren Energie von 38.5 Wh. 


der Hochleistungsakkupack


Die Elektronikbox selbst ist eine in 3D gezeichnete und mittels Rapid Prototyping durch die Firma Dick&Dick hergestellte Gehäuseeinheit. Das hier verwendete Verfahren ist das selektives Lasersintern (SLS). Das Gehäuse brauchte nur noch geschliffen und lackiert werden. In einer vorherigen Version hatte ich ein Aluminiumteil verwendet, welches aber preislich um den Faktor 3.5 teurer war. Von der Festigkeit ist das Plastikgehäuse wirklich gut und definitiv auch ausreichend. Ein zweiter Grund war natürlich das Gewicht, mittels dem Rapid Verfahren konnte ich das Gewicht incl. Akku nahezu halbieren. Das Gehäuse inclusive aller Bauteile wiegt jetzt knapp 350g.
gefertigtes Gehäuse, fertig lackiert

Der Akkupack wurde nicht einfach so in das Gehäuse reingelegt sondern per transparenter Vergussmasse eingeklebt. Das hat den Vorteil, daß die Akkus nie verrutschen werden und es nie zu Kurzschlüssen kommen kann. Der Nachteil ist, das durch die Vergussmasse leicht das Gewicht steigt. 
Gehäuse mit vergossenen Akkupack


Für die Elektronische Schaltung wurde eine Platine gefertigt, und diese dann auf dem Akku verklebt. Dann konnten die Kabel schön und ordentlich angelötet werden. 
Die Schaltung erzeugt die 1A Konstantstrom , überwacht die Akkuspannungen auf Unterspannung, berechnet die verbleibende Energie im Akkupack und zeigt dieses über die Vier bunten LED's an, steuert ob die Lampe im DIM oder FULL Zustand betrieben wird und gibt die 5V für die USB Buchse aus. 

Elektronik fertig verdrahtet



Ein/Ausschalter und Akkuzustandsanzeige

elektronische Schaltung im Detail
Die Akkuspannung im Nennfall beträgt 14.8V aber wenn die Akkus voll geladen sind beträgt diese 16.8V, bei der Entladung sinkt diese auf 12V. Diese fast 7V Unterschied wirken sich auf den Wirkungsgrad entscheidend aus wenn lineare LED Treiber benutzt werden. Daher wird für die Bereitstellung des LED Stromes und auch der 3.3/5V Spannungen nur DC/DC Wandler verwendet. Diese haben einen extrem hohen Wirkungsgrad. Für den 1A LED Strom wurde der Recom RCD-24 DC/DC Wandler mit einem Wirkungsgrad von ~95% verwendet . Die Kleinspannungen mit den Recom R-78Cx.x. Auch diese besitzen einen Wirkungsgrad im gleichen Segment. Damit geht rein für die Bereitstellung der Spannungen und Ströme sehr wenig Energie verloren und steht der Leuchtdauer zur Verfügung. Der Mikrocontroller vom Typ Atmega8 übernimmt sämtliche Steuerungsaufgaben und interagiert auf Benutzereingaben (Fernlichtschalter). Über die Menge des entnommenen Stromes wird die im Akku verbleibende Energie berechnet und anhand der bunten LED's ausgegeben. Bei dieser Aufgabe, verglichen mit dem was so ein Atmega8 alles kann, ist ihm wohl stinke langweilig :-) 
Für das Laden des Akkus, benutze ich ein Balancing Ladegerät von VOLTCRAFT (B6AC) da die Akkus auch bei Laden überwacht werden müssen. Dies in die Schaltung mit zu integrieren wäre zu viel Arbeit gewesen und sicherlich auch Fehleranfällig bis gefährlich (Überladene Akkus neigen zum brennen). 



berechnung 
Wie lange hält denn nun der Akku? Eine oftmals gehörte Frage und nicht zu Unrecht gestellte. Aber wie berechnet man dies richtig?
Der Einzellakku hat eine Nennkapazität von 2.6Ah bei 3.7V Nennspannung. Daraus errechnet sich 9.62Wh gespeicherter Energie. Jetzt haben wir vier Stück also insgesammt 38.48Wh. Es wurden drei LED's verwendet, jede hat so ca. 3.3V bei 1A Strom, das bedeutet dann eine Gesamtleistung von 9.9W. Jetzt kann man die 38.48Wh durch 9.9W dividieren und erhält 3.89h Laufzeit. Dies ist überschlägig schon mal ganz gut, spiegelt aber absolut nicht die Wirklichkeit wieder. Denn: Die Nennkapazität ist angegeben für eine Stromentnahme von 0.1C, also 10% der Nennkapazität bei Nennspannung. Dies ist meist nicht der Fall, auch hier nicht. Wir entladen die Akkus mit 0.669A (rechnerisch). Das ist jetzt das ca. 2.5 fache von dem was optimal für den Akku wäre. Somit sinkt die verfügbare Energie des Akkus. Weiterhin ist die Spannung am Einzelakku nur ganz kurz genau die 3.7V. Sie beginnt bei 4.2V und endet bei 3.0V. Damit ändert sich der entnommene Strom aus dem Akkupack eigentlich immer. (9.9W Leistung der LED bedeutet daß Strom*Spannung am Eingang = Strom*Spannung am Ausgang). Sprich durch das Absinken der Spannung (durch die Entladung) erhöht sich der Strom was wiederum nachteilig für die Laufzeit ist. Zusätzlich kommen die Wirkungsgrade der DC/DC Wandler hinzu. Zusammengefasst kann man sagen, daß die Leuchtdauer bei voller Stromentnahme ca. 200 Minuten beträgt. Dies sind 3:20 (h:mm) und ich denke so lange muß man erstmal fahren. Nicht nur Nachts...


Entladungsverhalten

fazit
Die Lampe als Hobby zu bauen hat sehr viel Spaß gemacht und ich habe unendlich viel gelernt. Natürlich auch wie man es nicht machen sollte. Sie ist immer noch extrem hell und schlägt bestimmt nicht die Topmodelle anderer Markenhersteller aber kann doch locker mithalten. Natürlich nicht StVZO zugelassen aber da wo sie an ist fährt ehe niemand anders...

Feedback:
blumengiesser@posteo.de

Mittwoch, 26. September 2012

GAS Verbrauchsanzeige[m³] oder GAS Kostenanzeiger[€] oder einfach GAS Logger

GAS Verbrauchsanzeige[m³] oder GAS Kostenanzeiger[€] oder einfach GAS Logger 

Wir haben einen Gasanschluss und Duschen und Heizen mit umweltfreundlichem Windgas von Greenpeace Energy [link]. Jetzt kann man den Zählerstand des Gasanschlusses dauernd aufschreiben und sich ausrechnen, ob man etwas gespart hat oder nicht oder man hat die komfortable Lösung einer kleinen Elektronik, die genau dies für einen übernimmt. Gesagt, getan. Hier kommt die Geschichte meines GAS Loggers.

grundsätzlicher Aufbau: Der von den Stadtwerken Leipzig installierte Gaszähler, das Modell BK-4 [Datenblatt] von Elster Instromet [link] bietet ab Werk schon die Möglichkeit für die Nachrüstung eines NF-Impulsgebers. Dieser ist entweder über die Firma Instromet zu bekommen (teuer) oder die Marke "das bekommen wir schon hin" (billig) kommt zur Anwendung. Ich habe mich für die zweite Variante entschieden. Zum Einsatz kommt der Reed Kontakt [MK 471B] von der Firma MEDER, erhältlich beim Elektronikversand Reichelt.de. Der Reed Kontakt ist natürlich nicht für die werksseitige Aussparung am Gaszähler vorgesehen, so muss ein wenig Heißkleber zum Einsatz kommen. Der Reed Kontakt schließt bei einer Umdrehung des Zählwerkes kurz und dieses Signal kann durch einen nachgeschalteten Mikrocontroller ausgewertet werden. Nebenbei ist kurz erwähnt, dass der umlaufende Magnet nur die 10-Liter Anzeige am Gaszähler darstellt. Ein Impuls bedeutet also 0.01m³.


prinzipieller Aufbau des Datenloggers


Schaltplan: Auf der Basis eines ATMEGA-8 Mikrocontrolers wurde diese Schaltung realisiert. Der Mikrocontroller wartet eigentlich die ganze Zeit auf das Signal des Reed Kontaktes, um es dann weiterzuverarbeiten. Schaltungstechnisch sind kaum Besonderheiten vorhanden. Als Anzeigeneinheit wird ein DOGM-163 von electronic assembly verwendet, welches in einem meiner anderen Blogs [DOG-M163] besprochen wird. Die Bedieneinheit bilden vier Taster, die bei Reichelt [TASTER 1032.3] erhältlich sind. Der µC verfügt nur über einen Quarz [8-MHz], damit die mitlaufende Uhr möglichst lange genau geht (im Test mehrere Wochen). Der Schaltplan enthält einige Elemente, die für die Turtle LOGGER Schaltung [link] Verwendung finden und wären hier natürlich nicht notwendig (5V LDO und R3-R10).



Schaltplan Mikrocontroller


Leiterplatte: Die Leiterplatte wurde mit allen verfügbaren Bauteilen auf SMD Basis erstellt, um möglichst viel Platz zu sparen. Die Bestückung ist nicht allzu aufwändig und kann leicht selbst durchgeführt werden.



unbestückt


bestückt, Rückseite


bestückt, Vorderseite



Implementierung: Wie schon in der Einleitung beschrieben, wird der Reed Kontakt in den Gaszähler eingeklebt. Der Sensor sollte dabei möglichst mittig eingeklebt werden.



Lage des Reed Kontaktes


Anzeigeneinheit: Damit die Leiterplatte nicht lose an die Wand geklebt werden muss, habe ich ein Rapid Prototype Gehäuse bauen lassen. Dies wurde erst per Pro-Engineer (Pro-E) konstruiert und dann im 3D Printing Prozess hergestellt. Dieses Verfahren ist von der Passform absolut ausreichend.



Eine kleine Bildergalerie über das Gehäuse. Rückseitig ein aufgeklebter Magnet für die einfache Befestigung am Sicherungskasten.




Angezeigte Daten: Damit das Ablesen der Daten auf dem Display ohne große Umstände erfolgen kann, ist um das Display herum bedrucktes Papier geklebt. Dies gibt dem Ganzen einen etwas professionellen Touch :-) 

Angezeigt werden folgende Daten:
  • Uhrzeit [hh:mm]
  • Sekundentakt als Doppelpunkt
  • Wochentag [1-7]
  • Zählerstand [m³]
  • Gasverbrauch des heutigen Tages [€]
  • Gasverbrauch der laufenden Woche [€]
  • Gasverbrauch der laufenden 4 Wochen [€]
  • Gasverbrauch seit Abrechnungsbegin [€]


Angezeigte Daten inkl. Beschriftung

Berechnungen: Der Gaszähler selbst zeigt nur die verbrauchte Gasmenge in m³ an. Aus dieser lässt sich natürlich nicht viel ermitteln, wenn man den Verbrauch nicht auf eine bestimmte Zeit eingrenzt. Dafür ist es notwendig, dass eine Uhr mit läuft. Dies wird durch den Mikrocontroller durchgeführt. Damit hat man schon mal die drei entsprechenden Zeiträume. Da der Mikrocontroller kein Datum kennt, bezieht sich die Anzeige der letzten ein oder vier Wochen auch wirklich nur auf die ein oder vier laufenden Wochen. Diese beginnt nachdem der Strom eingeschaltet wurde. 
Zusätzlich muss der Zählerstand am Anfang des Abrechnungszeitraumes bekannt sein. Dieser ist ganz einfach zu ermitteln, denn er steht auf der letzten Rechnung des Energieunternehmens. 

Wie kommt jetzt der Betrag in € aus der Zählerdifferenz zustande? Dazu benötigt man zwei Werte. Den Heizwert des Gases und den eigenen Tarif. Den Heizwert zu bekommen ist nicht ganz leicht, da er meist selbst den Mitarbeitern der Stadtwerke nicht bekannt ist. Die Stadtwerke Leipzig verschleiern diesen auch, denn es wird die Gaszustandszahl und der Brennwert angegeben. Beide berechnen sich aber durch Multiplikation und ergeben für Leipzig den Wert 10,7. Dieser kann aber für einen anderen Anbieter, hier Windgas von Greenpeace Energy, variieren. Der Tarif dagegen ist ja durch den Vertrag bestimmt. 

Dem Cleveren ist hier natürlich aufgefallen, dass bei den Kundenverträgen mit dem Tarif geworben wird. Ändert sich der Heizwert und bleibt der Tarif gleich so erhält das vertragsausgebende Unternehmen trotzdem einen höheren Rechnungsbetrag vom Endkunden. Darum: Immer Augen auf!

Verbrauch [€] = Zählerdifferenz [m³] * Heizwert [kWh/m³] * Tarif [€/kWh]


Diese Rechenaufgabe ist für den Mikrocontroller in keinster Weise schwierig und belastet ihn auch keineswegs. Aus diesem Grund ist dieser  - doch etwas eingestaubte - Prozessor völlig ausreichend.


Menüstruktur: Was wäre die Anzeigeneinheit ohne vernünftige Menüstruktur? Daher sind alle Werte, bestehend aus aktuellem Zählerstand, Zählerstand zum Abrechnungsbeginn, Heizwert, Tarif, Wochentag und Uhrzeit per Menü leicht änderbar. Die vier erstgenannten werden dauerhaft im EPROM des Mikrocontrollers gespeichert und stehen auch nach einem Stromausfall zur Verfügung. Lediglich die Uhrzeit und der Wochentag müssen neu eingestellt werden.



  

 



Zu sehen sind die einzelnen Menüpunkte, um Voreinstellungen zu ändern



Ergebnisse:

Was kostet...
  • ein Vollbad? = ~0,50 €
  • ein Mal Duschen? = ~0,17 €
  • ein kalter Wintertag? = ~10,00 €, sorry, das Haus ist EnEV 1955


Fazit: Durch den Bau dieses Gasverbrauchsanzeigengerätes ist es deutlich transparenter, wie hoch die Gasrechnung wirklich ist und ob eine Nachzahlung droht. Auch können Energiesparmaßnahmen sofort auf deren Wirkung überprüft werden oder die Kosten von Einzelverbräuchen ermittelt werden. 

Der Bau in dieser Ein-Stück-Kleinserie ist natürlich nicht umsonst und beläuft sich auf rund 150 €. Da das Anbringen des Reed Kontaktes keinen technischen Eingriff in den Gaszähler darstellt, war dies auch ohne sicherheitstechnische Bedenken durchführbar.


Ausblick: Im Moment arbeite ich an einer Erweiterung des LOGGERS um die Daten zeitbasierend abzuspeichern. Dazu soll in regelmäßigen Abständen der Zählerstand in einem EEPROM abgelegt werden. Die Anzeige wird dann nicht mehr auf der jetzigen Anzeigeneinheit stattfinden, sondern muss extern gelöst werden. Dazu implementiere ich zusätzlich eine Funk-Datenübertragung, welche die Daten an einen PC schickt. Dieser wird sich dann um die Visualisierung kümmern. 

Mal sehen, wann das fertig ist :-)

Und nun:    HAPPY LOGGING!!!

Feedback:
blumengiesser@posteo.de


Dienstag, 3. Juli 2012

turtle under the sun - LOGGER

Datenlogger für Terrarien um Schildkröten [o.ä.] unter einer Heizlampe zu erkennen und deren darunter verbrachte Zeit zu messen.

Bei diesem Projekt geht es darum, die Zeit zu messen in der Schildkröten [o.ä.] unter einer Heizlampe sitzen und sich sonnen. Die daraus ermittelte Zeit kann dann Aufschlüsse über diverse Dinge geben. Hierzu sei aber an die entsprechende Literatur verwiesen.

grundsätzlicher Aufbau: Die Erkennung basiert auf dem Abschatten von Fototransistoren durch das zu erkennende Objekt. Dies ist die einfachste Möglichkeit einer Erkennung, da auf bekannte Materialien zurückgegriffen werden kann.
Erkennung durch abgeschattete Fototransistoren


Schaltplan: Auf der Basis eines ATMEGA-8 Mikrocontrolers wurde diese Schaltung realisiert. Die Fototransistoren [bis zu 8] von Conrad [184055-62] sind mit einem 220 Ohm Widerstand in Reihe über 5V an die analogen Eingänge des µC angeschlossen und geben ein sauberes Signal im beleuchteten oder verschatteten Zustand. Diese Art der Schaltung ist völlig ausreichend, da nur zwischen beleuchtet und nicht beleuchtet Zustand unterschieden werden soll. Weiterhin wird ein DOGM-163 von electronic assembly verwendet, welches in einem meiner anderen Blogs [DOG-M163] besprochen wird. Die Bedieneinheit bilden 4 Taster die bei Reichelt [TASTER 1032.3] erhältlich sind. Der µC verfügt nur über einen Quarz [8-MHz], damit die mitlaufende Uhr möglichst lange genau geht [im Test mehrere Wochen].


Schaltplan


Leiterplatte: Die Leiterplatte wurde mit allen verfügbaren Bauteilen auf SMD Basis erstellt um möglichst viel Platz zu sparen. Die Bestückung ist nicht allzu aufwändig und kann leicht selbst gemacht werden.


unbestückt

bestückt - Rückseite

bestückt - Vorderseite
Detection -unit: Für die Erkennung Schildkröte oder keine Schildkröte werden Fototransistoren verwendet, die in eine Korkplatte eingeklebt wurden. Hierbei habe ich 5 Stück verwendet und sie wie bei einem Würfel angeordnet. Der Anschluss erfolgt für jeden Fototransistor einzeln um per Software flexibel zu sein.Anschließend wurden sie per Heißklebepistole wasserdicht auf der Vorder- wie auch Rückseite verschlossen. Durch die verwendeten 5V Gleichspannung ist das Risiko eines elektrischen Unfalls nahezu ausgeschlossen.
5 eingeklebte Fototransistoren - Vorderseite Korkplatte

eingeklebte und verschaltete Fototransistoren - Rückseite Korkplatte 

Funktion: Durch die Software auf dem µC werden im Sekundentakt die analogen Eingänge abgefragt. Überschreitet die ermittelte Spannung eine bestimmte Schwelle [einstellbar] dann wird eine digitale Variable auf 1 [oder wieder auf 0] gesetzt. Daraus ergibt sich dann eine Verschattungsmatrix. Sind min. 2 Fototransistoren abgedeckt zählt der µC diese Sekunde als verschattet. Sind 60 Sekunden zusammen wird dies auf dem Display als verschattete Minute angezeigt. Der Zähler kann bis 23:59 [hh:mm] zählen, danach springt er wieder auf 00:00. Jetzt teilt sich die Anzeige auf insgesamt 4 Zeiten. Summe des laufenden Tages, laufenden Woche, letzten 4 Wochen und Gesamtzeit. Realisiert wird dies durch die mitlaufende Uhrzeit, einen Wochentags und einen 4 Wochen Zähler.

Display mit Beschriftung

Dem aufmerksamen Leser wird aufgefallen sein, dass im Einzelstatus [oben rechts im Display] 6 Anzeigen für Transistoren [Nullen] vorhanden sind. Hier gibt es jetzt den Fototransistor Nummer 6 der die Aufgabe hat zu detektieren ob die Lampe grundsätzlich AN ist. Dies kommt daher, dass die Lampen für die Beleuchtung der Terrarien mittels Zeitschaltuhr EIN/AUS geschaltet werden und dann beim wieder einschalten die Uhrzeit am µC verloren geht. Auch würde bei permanenter Bestromung [Logger nicht an Zeitschaltuhr] beim Ausschalten der Lampen automatisch die Schildkröte als erkannt zählen. Um dies zu verhindern dient dieser Fototransistor.

Zusätzlich kann mittels der Taster die Uhrzeit gestellt, das Backlight AN/AUS, die Schwelle verändert und der Zähler resettet werden. -> Happy LOGGING!!


Feedback:
blumengiesser@posteo.de

Sonntag, 1. Juli 2012

EA DOG-M163

Anschluß eines EA DOG-M Displays an einen µC

Das Display: EA DOG-M081x-A /  DOG-M162x-A / DOG-M163x-A ist bestellbar unter anderem bei Reichelt und das in den verschiedensten Farben. Dadurch sind etliche Farbkombinationen (5 verschiedene Displays und 6 verschiedene Hintergrundfarben) möglich. Grundsätzlich unterscheidet es sich in positiv und negativ Schrift kombinierbar mit den unterschiedlichsten Hintergrundbeleuchtungen. Ein Blick ins Datenblatt sei aber empfohlen.

Exemplarisch mit grünem Hintergrund / schwarzer Schrift und schwarzem Hintergrund / grüner Schrift


Die Verschaltung: Das Display kann entweder als 8-bit/4-bit paralell oder per SPI Schnittstelle, die an sehr vielen Controlern vorhanden ist, angesteuert werden. Im weiteren beschränken wir uns auf den SPI Anschluß, da dieser die Verkabelung deutlich reduziert.

Anschlüsse am Display (ohne Hintergrundbeleuchtung)


Jetzt kommt es drauf an, wie das Display mit dem Mikrocontroller verbunden wird. Hier hatte ich mich das erste Mal verrant. Aber an sich ist es ganz einfach: Es gibt die Anschlüsse SI (28), CLK (29), RS (39) und CSB (38). Alle anderen Anschlüsse werden statisch (vergleiche 3.3V und 5V Anschluß) verschaltet. SI bedeutet serial Data in oder wird auch mit MOSI (Master Output Slave Input) bezeichnet, CLK wird Clock heißen, RS ist die Unterscheidung zwischen Daten und Befehlen und zum Schluß CSB, welches den Chip select darstellt. Bei der Verschaltung mit einem µC muß jetzt darauf geachtet werden, daß die Anschlüsse SI und CLK auch am richtigen Port des µC landen (vgl. Datenblatt). RS und CSB sind dabei frei wählbar.

Zum näheren Verstehen von SPI kann ich folgendes Skript der UNI Koblenz-Landau empfehlen:
SPI – Serial Peripheral Interface

Wird das Display nun mit einem µC, in dem hier vorgestellten Fall, ein ATMEGA-8 verbunden hilft das Datenblatt des ATMEGA-8 weiter welches die Anschlüsse MOSI und CLK sind. Am PDIP (Gehäuseform) ATMEGA-8 ist MOSI der Port PB3 und CLK der Anschluß PB5. Die anderen beiden Anschlüße können je nach belieben verteilt werden. Folgender Anschluß ist möglich:

Anschlußbeispiel (für 3.3V) mit ATMEGA-8 incl. Treiber Hintergrundbeleuchtung

Software: Sind alle nötigen Hardwareverschaltungen gemacht kommt der weitaus schwierigste Teil. Das Datenblatt des Displays in Bezug auf die Initialisierung des Displays zu verstehen. Für manche sollte es kein Problem darstellen, so ganz easy ist es dann noch wieder nicht.

1) das SPI Device am µC als Master aktivieren [spi.c]

#define DOGM163_MOSI    PB3     // MOSI, Master out slave in, am Atmega8
#define DOGM163_SCK     PB5     // SCK am Atmega8
#define DOGM163_SS      PB2     // SS am Atmega

void spi_init(void)
{
    // MOSI, SS und SCK als Ausgang setzen
    DDRB |= (1<<DOGM163_SS)|(1<<DOGM163_MOSI)|(1<<DOGM163_SCK);
    //SPI als Master aktivieren. Clock rate fck/16
    SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}

// Senden von Daten über das SPI Interface
void spi_transmit(char cData)
{
    /* Start transmission */
    SPDR = cData;
    /* Wait for transmission complete */
    while(!(SPSR & (1<<SPIF)));
}

2) die Ports für RS und CSB als Ausgänge am µC setzen [dog-m163.c]

#define DOGM163_CSB     PD6     // Port fuer CSB am µC
#define DOGM163_RS      PD7     // Port für RS am µC    
#define DOGM163_PORT    PORTD   // Port am Atemega8

void init_PORTS_DOGM163 (void)
{
    //RS und CSB als Ausgang setzen
    DDRD |= (1<<DOGM163_RS) | (1<<DOGM163_CSB);

}
 
3) Display initialisieren, benötigte Funktionen [dog-m163.c]

// Das Display resettet den internen Counter bei der fallenden Flanke vom CSB
void reset_CSB_DOGM163 (void)
{
    DOGM163_PORT |= (1<<DOGM163_CSB);
    DOGM163_PORT &= ~(1<<DOGM163_CSB);

}
void write_instruction_DOGM163 (char instruction)
{
    //RS low = instruction
    DOGM163_PORT &= ~(1 << DOGM163_RS);
    //resetten des Counters
    reset_CSB_DOGM163();
    // instruktionen senden
    spi_transmit(instruction);
    _delay_ms(2);
    //Display wieder deaktivieren (chip select=1)
    DOGM163_PORT |= (1<<DOGM163_CSB);
}
void write_char_DOGM163 (char instruction) // Daten zum Display senden
{
    //RS high = data
    DOGM163_PORT |= (1 << DOGM163_RS);
    //resetten des Counters
    reset_CSB_DOGM163();
    // Daten senden
    spi_transmit(instruction);
    _delay_ms(2);
    //Display wieder deaktivieren (chip select=1)
    DOGM163_PORT |= (1<<DOGM163_CSB);
}
void write_string_DOGM163 (char *buffer) // sollte selbsterklärend sein
{
    while (*buffer){
        write_char_DOGM163(*buffer);
        buffer++;
    }
}


Das waren die nötigen Funktionen, jetzt gilt es die Initialisierungsroutine mit den "richtigen" Werten zu füllen und das Display zu aktivieren.

void init_3lines_DOGM163(void)
{
    init_PORTS_DOGM163();
    _delay_ms(200);
 
   // Instruction Set, {0 0 1 DL N DH IS2 IS1} = 00 11 10 00
    write_instruction_DOGM163 (0x38);
    // Instruction Set, {0 0 1 DL N DH IS2 IS1} = 00 11 10 01 
    write_instruction_DOGM163 (0x39);

    // 15 Bias (Spannung), {0 0 0 1 BS 1 0 Fx} = 00010101, es kann auch 1D gewählt werden, dann leuchtet der Hintergrund stark nach 
    write_instruction_DOGM163 (0x1D);

    // Contrast (Bit C3-C0) {0 1 1 1 C3 C2 C1 C0} = 01111111
    write_instruction_DOGM163 (0x7F);

    // Power/ICON/Contrast (Bit C5-C4) {0 1 0 1 Ion Bon C5 C4} = 01011111
    write_instruction_DOGM163 (0x5F); 

    // Follower {0 1 1 0 Fon Rab2 Rab1 Rab0} = 01101001, Rab siehe Datenblatt Power supply
    write_instruction_DOGM163 (0x69);
    _delay_ms(200);

    // Display Function, {0 0 0 0 1 D C B} = 00001100
    write_instruction_DOGM163 (0x0C); 

    // Entry Mode {0 0 0 0 0 1 I/D S} = 00000110
    write_instruction_DOGM163 (0x06);
}


Für nähere Erläuterungen sei ausdrücklich das Datenblatt des Displaycontrolers empfohlen.

Wurde die Initialisirung durchgeführt kann das Display mit allen zur Verfügung stehenden Befehlen benutzt werden. Ich habe folgende, meiner Meinung nach sinnvolle Funktionen für das DOG-M163 implementiert:


init_3lines_DOGM163
init_doublehigh_upper_DOGM163
init_doublehigh_lower_DOGM163
set_cursor_DOGM163 (row, column)
clear_DOGM163
cursor_home_DOGM163
cursorON_blinkOFF_DOGM163
cursorON_blinkON_DOGM163
cursorOFF_blinkOFF_DOGM163
cursorOFF_blinkON_DOGM163
turnOFF_DOGM163
set_contrast_DOGM163 (contrastvalue)
set_character_DOGM163 (characterNumber, data0, data1, data2, data3,  data4, data5, data6, data7);


Wird ein DOG-M081 oder DOG-M162 verwendet, muß die Initialisierung entsprechend angepasst werden, da das Display ja nur eine oder zwei Zeilen hat, aber der Controler hier der ST7036 von Sitronic gleich bleibt.

Download [free to use]:
DOG-M163 Treiber: dog_m163.c  dog_m163.h
SPI Treiber: spi.c spi.h
Eagle DOG-M Library: eagle DOG-M163 (gleiche Verwendung bei DOG-M081 und DOG-M162)

Links: 
Datenblatt ST7036 Displaycontroller
Datenblatt DOG-M163
SPI - Serial Peripheral Interface
Datenblatt ATMEGA-8

Feedback:
blumengiesser@posteo.de