Dieses Projekt stammt von unserem Gastautor

martin2250

Ich bin 20 Jahre alt, studiere Physik und beschäftige mich schon seit meiner Kindheit mit Elektronik.

Wie baut man einen stromsparenden Klimalogger?  

Wie baut man einen stromsparenden Klimalogger?

Der hier vorgestellte Klimalogger war für mich nicht nur ein spannendes und nützliches Projekt, sondern vor allem eine Herausforderung, eine Schaltung möglichst stromsparend zu machen. Dieser Artikel befasst sich daher weniger mit dem Klimalogger selbst, sondern vorrangig mit den verschiedenen Aspekten, die für dieses Ziel beachtet werden mussten. Die behandelten Techniken können Sie problemlos auf Ihr nächstes Projekt übertragen.

Das Projekt

Geeignet für: Fortgeschrittene
Zeitaufwand: ca. 6 Stunden
Budget: ca 30€
Materialien: HYT939, ATMega88, DS1337, 24AA1025, 16×2 LCD-Modul, passive Bauteile, Gehäuse

Konzept

Das Hauptziel dieses Projekts war es, den Klimalogger so effizient wie möglich zu machen. Das betrifft nicht nur den Stromverbrauch, sondern auch die Ausnutzung des vorhandenen Speicherplatzes und als Folge auch die Anzahl der Schreibvorgänge auf den Speicher.

Die wohl einfachste Möglichkeit, die gesammelten Daten zu speichern und gleichzeitig ohne Mehraufwand ein PC-Interface zum Herunterladen der Daten bereitzustellen, sind SD Karten. Diese lassen sich neben dem normalen SDIO-Protokoll auch über ein einfaches SPI-Protokoll ansprechen. Entsprechende Softwarebibliotheken sind für nahezu alle Microcontroller-Platformen kostenlos verfügbar.

SD-Karten sind für Anwendungen mit sehr kleinem Datendurchsatz allerdings nur schlecht geeignet. Der Stromverbrauch pro Schreibvorgang ist sehr hoch, da in SD-Karten selbst ein Microcontroller steckt, der viele Hintergrundaufgaben (z.B. Wear-Levelling) erledigt. Eine alte SD-Karte mit nur 128MB Speicher verbraucht zum Beispiel 30mAs pro Schreibvorgang und hat einen Standby-Verbrauch von 70µA (entspricht 1.7mAh pro Tag), modernere Karten mit mehr Speicherplatz verbrauchen noch viel mehr (Quelle). Der Standby-Verbrauch kann durch Trennen der Stromversorgung eliminiert werden und die Anzahl der Schreibvorgänge kann durch das Verwenden eines größeren Schreibpuffers reduziert werden. Der Arbeitsspeicher des Microcontrollers ist allerdings begrenzt, daher stößt diese Methode schnell an ihre Grenzen.

Stattdessen verwendet dieses Projekt einen seriellen 1Mb-EEPROM. Dieser verbraucht laut Datenblatt für einen Schreibvorgang maximal 3ms · 5mA = 15µAs und 5µA im Standby, und ist damit ideal für dieses Projekt geeignet. Falls größere Speicherkapazitäten benötigt werden, können auch Flash-Chips verwendet werden, diese haben allerdings meist größere Blöcke und halten weniger Schreibvorgänge aus.

 

Hardware

Außer dem EEPROM befinden sich auf der Platine noch der Microcontroller (ATMega88A), eine Echtzeituhr (DS1337) und der Temperatur- und Luftfeuchtesensor (HYT939). Alle sind über einen I²C-Bus verbunden. Statt den internen Pullups des µC wird der Bus von zwei 100kΩ-Widerständen gebiased, denn die internen Pullups erhöhen den Standby-Verbrauch deutlich.

Die Echtzeituhr

Die Echtzeituhr ist zusätzlich über einen Interrupt-Eingang mit dem µC verbunden und liefert im Minutentakt ein Signal um die nächste Messung zu starten.

Der Microcontroller

Der Microcontroller wird von seinem internen 8MHz-Oszillator getaktet, dieser sorgt im Vergleich zu einem externen Quartz auch für einen niedrigeren Verbrauch und schnelleres Aufwachen aus den Low-Power-Zuständen.

Die Stromversorgung

Die Stromversorgung übernehmen vier NiMh-Akkus. Da alle Bauteile 5V vertragen, kann auf einen Spannungsregler verzichtet werden. Ursprünglich war, um die Schaltung vor verpoltem Anschließen der Akkus zu schützen, zusätzlich eine Schottky-Diode in Reihe mit dem Akku geschaltet. Diese wurde später aufgrund des hohen Spannungsabfalls unter Last durch einen MOSFET ersetzt.

Das Benutzerinterface

Als Benutzerinterface werden ein 16×2 LCD-Modul und zwei Taster verwendet. Wichtig ist hier, dass die Spannungsversorgung des LCDs und des Kontrastpotentiometers über einen Pin des Microcontrollers erfolgt, dadurch können beide im normalen Betrieb vollständig abgeschaltet werden.

Software

Die Software ist mindestens genau so wichtig für einen niedrigen Stromverbrauch wie die Hardware. Der ATMega stellt verschiedene Funktionen zum Stromsparen zur Verfügung.

Schlafmodus einstellen

Am Wichtigsten ist das Verwenden der Schlaf-Modi, das sind verschiedene Low-Power-Zustände, bei denen verschiedene Teile des Controllers abgeschaltet werden. Die CPU selbst ist in allen Fällen ausgeschaltet und der Programmablauf kann nur durch einen Interrupt wieder fortgesetzt werden. Bei den verschiedenen Modi sind unterschiedliche interne Peripheriemodule deaktiviert, daher muss, je nach Situation, ein anderer Modus gewählt werden.

Um den Microcontroller möglichst lange im Schlafmodus verweilen zu lassen, wird eine spezielle Programmstruktur (Zustandsmaschine) verwendet: Der gesamte Code ist eine großen Schleife, nach deren Durchlauf der µC in einen der Schlafzustände versetzt wird. Interrupts wecken den Controller wieder, und in den Interrupt-Routinen werden verschiedene Bits in Statusvariablen gesetzt. Diese Statusvariablen werden im nächsten Schleifendurchlauf abgearbeitet und danach wird erneut ein Schlafzustand ausgelöst.

Das Menü auf dem Display wird auf die gleiche Weise implementiert. Die Bedienknöpfe lösen Interrupts aus und setzen jeweils ein Bit in der Statusvariable. In der Hautpschleife wird dann ein Funktionspointer aufgerufen, der den Tastendruck verarbeitet. Dieser Funktionenpointer wird vom Menü-Code laufend geändert und zeigt, abhängig von der aktuellen Position im Menü, auf eine von vielen Funktionen. Das Display wird auch in der Hauptschleife über einen zweiten Funktionspointer geupdated, allerdings nur wenn eine zusätzliche Statusvariable gesetzt wurde. Diese Art der Menüführung ist zwar etwas komplizierter, lässt sich dafür aber einfach erweitern und erlaubt es, den µC zwischendurch vollständig schlafen zu legen.

Peripheriegeräte abschalten

Zusätzlich zu den Schlafmodi stellt der ATMega in `<power.h>` Funktionen zur Verfügung, mit denen interne Peripheriegeräte gezielt abgeschaltet werden können. Am einfachsten ist es, alle Module abzuschalten und nur bei Bedarf zu aktivieren. Es ist allerdings wichtig ein Modul anzuschalten bevor auf dessen Register zugegriffen wird, nicht erst wenn es aktiviert wird (also z.B. ein Timer gestartet wird oder der UART anfängt Daten zu senden).

Beim verwendeten Sensor muss jede Messung einzeln gestartet werden, der Messwert steht erst ca. 40ms später zur Verfügung. Um diese Zeit zu überbrücken, wird normalerweise ein Delay verwendet. Das bedeutet allerdings, dass die CPU die gesamte Zeit läuft und Strom verbraucht, ohne Arbeit zu leisten. Da die Messungen regelmäßig stattfinden, würde ein solches Delay einen Großteil des Stromverbrauchs ausmachen.

Anstelle von Delays können verschiedene Timer verwendet werden, um den Prozessor aufzuwecken. Timer arbeiten unabhängig von der CPU und laufen auch noch in manchen Schlafmodi, dadurch kann Strom gespart werden.

Zu unterscheiden sind hier die normalen Timer und der Watchdog-Timer. Normale Timer werden vom CPU-Takt versorgt, das macht sie zwar sehr genau, allerdings muss dafür der schnelle Oszillator aktiv sein und es kann nur ein ‚leichter‘ Schlafmodus aktiviert werden. Der Watchdog-Timer arbeitet dagegen völlig unabhängig von der CPU und hat seinen eigenen 128kHz-Oszillator. Dieser ist zwar relativ ungenau, verbraucht dafür allerdings weniger Strom und es können alle Schlafmodi verwendet werden.

Lösch- und Schreibprozess optimieren

Da ein EEPROM beim Lösch- und Schreibprozess am meisten Strom braucht, werden die Daten zuerst im Arbeitsspeicher des µC gepuffert und immer in 128 Byte großen Blöcken auf den EEPROM geschrieben. Jeder Block enthält am Anfang das Datum und die Uhrzeit des ersten Messpunktes, die Anzahl der Messungen im Block, das Messintervall und die Batteriespannung.

Danach folgen 41 Messpunkte, wobei die Werte für Temperatur und Luftfeuchte je auf 12 bit reduziert und zusammen in 3 byte gepackt werden. Da die Messungen innerhalb eines Blocks in einem festen Intervall stattfinden, muss nicht für jeden Messpunkt das Datum einzeln hinterlegt werden. Wird das Intervall geändert oder die Messung pausiert, wird der Block sofort abgespeichert und ein neuer Block gestartet.

Die Batteriespanung wird über einen Trick gemessen: der ADC misst die Spannung der internen 1.1V-Referenz. Als Spannungsreferenz des ADC wird die Versorgungsspannung verwendet. Aus dem Messwert lässt sich die Versorgungsspannung berechnen (Quelle). Da keine externe Hardware benötigt wird, fließt auch kein zusätzlicher Strom, wie es z.B. bei einem Spannungsteiler der Fall wäre.

Gehäuse

Das Gehäuse besteht aus 4mm dickem Sperrholz und hat ein zusätzliches Fach für den Batteriehalter. Die einzelnen Teile wurden auf einer CNC-Fräse gefertigt und verleimt, der Deckel des Batteriefachs und die Gehäuserückseite sind gesteckt.

stromsparender Klimalogger - Innenansicht ins Gehäusestromsparender Klimalogger - Batteriefach

Messungen

Um einen solchen kleinen Stromverbrauch zu messen, bedarf es des richtigen Equipments. Das µCurrent-Projekt von Dave Jones ist dafür wohl die beste, für Maker erschwingliche, Lösung. Die folgenden Messungen wurden mit einer auf diesem Design basierenden Schaltung gemacht.

Der Ruhestrom wird für die bestmögliche Präzision mit einem Multimeter und dem µCurrent in einem sehr kleinen Messbereich (großer Shunt) durchgeführt. Es wurde ein Ruhestrom von 1.47µA gemessen.

Für die Messung der aktiven Zeit wird der Messbereich des µCurrents vergrößert und ein Oszilloskop verwendet. Es wird zwischen zwei regelmäßig auftretenden Ereignistypen unterschieden: dem regelmäßigen Messvorgang und dem Abspeichern des Puffers in den EEPROM.

Beim normalen Messvorgang sind deutlich die beiden Stromspitzen von 9mA zu sehen. Diese sind der Zeit, zu der der µC aktiv ist, zuzuordnen. Diese dauern etwa 150 und 200µs. Dazwischen ist der Stromverbrauch des Sensors zu sehen, dieser benötigt etwa 50ms lang 0.7mA. Insgesamt macht das 42.6µAs pro Messung.

Wenn der Puffer voll ist, wird dieser nach dem Starten der nächsten Messung in den EEPROM geschrieben. Das dauert ca. 7ms. Nachdem der Sensor die Messung im Hintergrund beendet hat, wird der neue Block begonnen. Da hierfür die Zeit aus der Echtzeituhr gelesen wird und die Batteriespannung gemessen wird, dauert das auch ca. 5ms. Insgesamt werden 172.1µAs verbraucht.

Aus diesen Messwerten kann die Batterielebensdauer errechnet werden. Pro Block werden in der aktiven Zeit 40 · 42.6µAs + 172.1µAs = 1.9mAs verbraucht. Wird ein Messinterval von 10 Minuten angenommen, kommen noch 41 · 10min · 1.47µA = 36.1mAs Ruhestrom dazu. Das ergibt bei 1000mAh-Akkus eine Gesamtlaufzeit von 41 · 10min · 1000mAh/36.1mAs = 78 Jahre. In der Praxis ist die Laufzeit daher nur von der Selbstentladung der Akkus begrenzt, es empfiehlt sich Lithium-Primärzellen zu verwenden. Diese haben eine sehr geringe Selbstentladung und können die Schaltung so über zehn Jahre lang mit Strom versorgen.

Design Files und PC-Software

Alle Dateien für dieses Projekt sind auf GitHub zu finden. Im Ordner ‚PC-Software‘ sind zwei verschiedene Versionen, die alte Windows-Software und ein neuer Python-Skript, der auch unter Linux funktioniert. Beide bekommen die Daten über eine serielle Schnittstelle mit 250kbaud vom Logger selbst gesendet.

 

Was denken Sie zu diesem Thema? Schreiben Sie einen Kommentar:

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.