vorige Seite
Inhaltsverzeichnis nächste Seite

Schritt 4 - weitere Überlegungen...


...zum Stromverbrauch

Ich brauche noch ein Verfahren, mit dem ich die CPU in den Tiefschlaf schicken kann.
Schließlich soll das Ding ja nur wenige Sekunden pro Tag was tun - und möglichst auch nur dann Strom verbrauchen.
Also wird Google mal nach "arduino low power" befragt.
Der zweite Treffer sieht schon mal gut aus.
Darin wird diese URL referenziert, unter der sich genau das findet, was ich brauche.
Von 15.15mA (für den nackigen ATmega328) auf 0.35µA ist doch mal eine Ansage.
Speziell diese Erkenntnis ist interessant:
  • All pins as outputs, and LOW: 0.35 µA (same as before).
  • All pins as outputs, and HIGH: 1.86 µA.
  • All pins as inputs, and LOW (in other words, internal pull-ups disabled): 0.35 µA (same as before).
  • All pins as inputs, and HIGH (in other words, internal pull-ups enabled): 1.25 µA.

Aber wenn ich nun schon in den µA-Bereich komme, stellt sich die Frage, wie ich die RTC anschließen muss, um auch dort von 1.5mA (active) auf den Batterie-Betriebsmodus mit <1µA zu kommen, obwohl die 5V Stromversorgung für die CPU konstant angeschlossen bleibt.
Und idealerweise, ohne eine zusätzliche 3V Batterie auszukommen. Obwohl .... eine zusätzliche 3V Batterie hätte den Vorteil, den Akku für den ATmega328 wechseln zu können, ohne danach die Uhr neu stellen zu müssen.
Wenn der DS1307 im Betrieb nur 1.5mA zieht, sollte ich seine Stromversorgung (an Pin 8 des DS1307) direkt über einen Ausgang vom ATmega328 speisen können.
Bei LOW läuft er über seine Batterie (und zieht laut Datenblatt 500nA), bei HIGH ist er an und kann nach Datum und Uhrzeit befragt werden.
Und erfreulicherweise ist er sogar unmittelbar nach HIGH bereit bzw. braucht keinen delay() zwischen Einschalten und Abfrage.
Folgendes klappt auch mit auskommentiertem delay-Befehl:
digitalWrite(DS1307_POWER_PIN, HIGH); // RTC "einschalten"
//delay(3);
RTC.getTime();
digitalWrite(DS1307_POWER_PIN, LOW);  // RTC "ausschalten"
Der Stromverbrauch an Pin 8 des DS1307 ist bei LOW 0µA und bei HIGH 107µA (oder kurzfristig bei RTC.getTime() vielleicht auch etwas mehr).
Sehr schön :-) Und LOW am ATmega328 ist ja auch genau das, was man (gemäß obiger Erkenntnisse) im Tiefschlaf haben will.

...zum Stellen der Uhr

Wie die Uhr gestellt werden kann, wenn ein ATmega328 statt eines ArduinoUNO (mit USB-Port) zum Einsatz kommt, ist noch offen.
Natürlich könnte man temporär einen ArduinoUNO an SDA und SCL von der RTC anschließen und darüber die Uhr initial einstellen.
Angeblich soll das Ding mit einer 3V Knopfzelle über 10 Jahre laufen. Müsste man also nicht oft machen. Aber schön wäre sowas nicht.

Ein DCF77-Modul wäre denkbar. Auf den Stomverbrauch würde sich das allerdings ziemlich negativ auswirken. Speziell bei schlechtem Empfang.

Richtig edel hingegen wäre es, wenn man über einem ESP8266 mit dem ATmega328 sprechen könnte.
Dann ließe sich ggf. sogar obige Tabelle mit den Schaltzeiten nachträglich anpassen, ohne den Chip neu flashen zu müssen.
Weil das Teil aber ordentlich Strom zieht, darf es ebenfalls nur bei Bedarf aktiviert werden.
Auch braucht es wohl einige Zeit, bis es sich im WLAN eingebucht hat.

Ein denkbarer Ansatz wäre ein Schalter am Gerät. Wenn der eingeschaltet ist, geht der ATmega328 nicht sofort wieder in den Tiefschlaf, nachdem er erkannt hat, dass derzeit nix für ihn zu tun ist. Stattdessen verzweigt er in eine Routine zur Abfrage des ESP8266 (der jetzt mit Strom versorgt wird) und wartet auf Anweisungen über WLAN ... so lange, bis der Schalter wieder abgeschaltet wird. Dabei würde es voraussichtlich nicht mal stören, wenn während dieser Zeit die Rollläden nicht berücksichtigt würden.

Sicherer wäre jedoch ein Taster, der für die z.B. nächsten 10 Minuten den Tiefschlaf verhindert, den ESP8266 mit Strom versorgt und bei jedem Befehl über WLAN den 10-Minuten-Timeout neu triggert. Dann könnte man gar nicht erst vergessen, den Schalter wieder auszuschalten.
Weil es sehr wahrscheinlich wäre, dass der Taster während einer Tiefschlafphase betätigt wird, bräuchte man noch eine LED, die den Programmiermodus am Gerät anzeigt. Die Tiefschlafphase kann maximal acht Sekunden dauern. Im schlimmsten Fall müsste man den Taster also acht Sekunden lang gedrückt halten - bis die LED den Programmiermodus anzeigt. Ab dann hätte man 10 Minuten Zeit, zu einem Rechner zu gehen und das Kommunikations-Programm zu starten.
Auch wäre denkbar, dass auf irgend einem Rechner ein Server-Dienst läuft, mit dem sich der ATmega328 einmal täglich verbinden kann um darüber seine Uhr (gemäß NTP) korrigieren zu können.
Das hört sich doch gut an......so wirds gemacht. Nun muss ich erstmal auf die Lieferung des ESP8266 warten.
Und nächstes Wochenende kann ich dann [hoffentlich] ein bischen damit rumtesten.

vorige Seite
nächste Seite