Hi Leute,
Ich wollt jetzt endlich mal ein "Ultra Low Standby Power" Setup vorstellen dass ich so jetzt schon eine ganze Weile am laufen hab und sehr zuverlässig funktioniert.
https://github.com/8n1/ESP8266-Tiny-Door-and-Window-Sensor
Das ganze hat auch einen wirklich so geringen Standby Verbrauch dass man sich mehr Sorgen um die Selbstentladung der verwendeten Batterien machen muss als dass die Schaltung diese im Standby leer saugt. Das ist gerade bei Fenster oder Türen die nicht oft geöffnet oder geschlossen werden ideal und erlaubt sehr lange "Standzeiten".
Wie hoch der Stromverbrauch genau ist kann ich mangels entsprechenden Messgeräten leider nicht sagen. Ich hab aber mit zwei verschiedenen Multimeter gemossen und beim einen waren es 0.00µA und beim anderen 0.3µA.
Die 0.3µA kommen aber theoretisch ganz gut hin. Denn der ATtiny (der sich im Tiefschlaf befindet (Power-down)) ist während des Standby der größte Verbraucher und braucht laut Datenblatt etwa 300nA. (Getestet bei Zimmertemperatur, Akkuspannung war bei ~3.8v)
Der Verbrauch hängt aber stark von der Eingangspannung ab. Im DB gibts ein schönes Diagramm dazu ("Eingangspannung vs. Stromverbrauch im power-down")
Der nächst größere (bekannte) Verbraucher müsste der LDO Spannungsregler im Shutdown sein. Getestet hab ich das ganze unter anderem mit einem AS1363 und einem SPX3819. Laut Datenblatt sind das beim AS1363 30nA(typ) - 500nA(Max), und beim SPX3819 10nA(Typ) - 2µA(Max) . Im einzeltest zeigten aber beide Messgeräte bei beiden LDOs 0.00µA an.
Dann wird es noch diverse Leckströme, und bei den kleinen Strömen bestimmt auch noch ein paar andere Faktoren an die ich jetzt nicht gedacht habe oder gar nicht kommen würde geben.
Um wirklich auf einen so geringen Stromverbrauch zu kommen hab ich mir aber doch einiges einfallen lassen müssen...
* Wie überhaupt einen Spannungsregler mit Shutdown Funktion und einen Tiny im Power-down Modus der duch einen PinChange Interrupt aufwächt und das ganze System quasi steuert zu verwenden.
* Oder anstatt den Spannungsteiler für die Batteriespannungsmessung nicht direkt an die Batterie bzw. den Akku sondern mit an den Enable Pin des LDO zu hängen.
* Oder den ATtiny als "Relais" für das Schaltersignal zu verwenden was das abschalten des Spannungsteilers(Pegelwandlung für das Schaltersignal) im Standby ermöglicht.
* Oder die verwendung eines Wechselschalters(SPDT) der durch seinen Aufbau den Pullup überflüssig macht.
Das müssten dann aber auch schon alle "Tricks" gewesen sein.
Aufbau
Das Setup besteht aus
* einem ATtiny25V(45V/85V) (Flash ist beim 25er zu 55% voll)
* einem Spannungsregler mit Enable/Shutdown Funktion. Ich habs mit einem SPX3819, einem AS1363 und ein paar anderen getestet.
* einem ESP-07/ESP-12(E). Könnte aber auch jedes andere Modul sein. (Beim ESP-01 müsste man aber bspw. auf das messen der Batteriespannung und ein paar weiteren Dingen verzichten, vorausgesetzt man hat keine modifikationen am Modul vorgenommen.)
* und einem (Reed) Wechelschalter(SPDT). Könnte aber auch irgendein anderer Schalter sein. Zum testen verwende ich bspw. lieber (so einen, mehr Bilder) (Findet man eine Nummer kleiner auch in Mäusen). NO NC(SPDT) Reed (Wechsel)Schalter bei ebay
[spoiler="Mehr dazu wieso der Wechelschalter"]
--------
Der einzige Vorteil des Wechelschalters ist, vorausgetzt der Schalter ist entsprechend angeschlossen, dass in beiden Zuständen(Schalter ist geschlossen und Schalter ist geöffnet) kein Pullup (oder Pulldown) Widerstand benötigt wird um den Ausgang(COM) des Schalters und somit auch den Eingang des ATtinys auf einem definierten Pegel zu halten.
Man könnte da jetzt natürlich argumentieren dass Fenster und auch Türen sowieso die meiste Zeit geschlossen sind und es daher verschmerzbar ist wenn die Schaltung im offenen Zustand etwas mehr Strom braucht. Dagegen gibt es auch überhaupt nichts einzuwenden. Ich bin nur irgendwann mal auf die Idee gekommen dass man ja statt eines einfachen Schalters+Pullup auch einfach einen Wechselschalter nehmen und sich somit den Stromverbrauch in einem der beiden Schalterzustände sparen kann.
Anstatt eines Wechelschalter kann man aber natürlich auch einen einfachen (2pin) Schalter verwenden. Man muss dann aber entweder den internen Pullup im ATtiny aktivieren (die entsprechende Zeile ist schon da und müsste nur "einkommentiert" werden) oder einen externen verbauen.
Aber "Achtung": ein 10K(Kiloohm) Pullup Widerstand verbraucht bei 3.8V bspw. 380µA!
--------
* Ausserdem hab ich noch einen optionalen DS18B20 Temperatursensor und ein paar Status LEDs verbaut.
Versorgt wird das ganze momentan mit einem 650mAh LiPo Akku. Das klappt super.
Alternativ ahb ich auch miti 3x AA Batterien(1.5V) gute erfahrungen gemacht . Mit 2x AA läuft das ganze zwar auch, man bekommt die aber nicht richtig leer da die Spannung doch recht schnell zu niedrig wird.
Es gibt aber noch zig andere Batterietypen die sicher besser geeignet wären, gerade was die selbstenladung angeht, hab mich damit aber noch nicht weiter beschäftigt. (Tipps sind aber immer Willkommen.)
Funktionsweise/Ablauf
Es fängt damit an dass der ATtiny über einen PinChange Interrupt, ausgelöst durch das drücken oder loslassen des Schalters aus dem Tiefschlaf aufgeweckt wird und den Spannungsregler über dessen Enable/Shutdown Pin aktiviert. Dadurch wird der ESP mit Strom versorgt und fängt an die Lua Skripte abzuarbeiten. Als erstes verbindet er sich mit dem WLAN, ermittelt dann optional die WLAN Signalstärke, Batteriespannung, und Temperatur und versucht dann das ganze an den hinterlegten Service zu schicken. Kurz davor wird noch der aktuelle Zustand des Schalters eingelesen. Alle gesammelten Werte werden dabei als Parameter mitgeschickt und sind je nach verwendetem Service sehr vielseitig nutzbar. Es ist echt mega genial was da mit den verschiedenen Services so alles möglich ist, allein mit "ein bischen" konfigurieren. :thumbs1:
War der Versand(HTTP Request) erfolgreich(Status code: 200) schaltet sich der ESP wieder ab indem er dem tiny über einen GPIO signalisiert den Spannungsregler zu deaktivieren.
Das einzige dass der ATtiny bei meinem Setup macht ist über den Schalter aufzuwachen (beim drücken und auch beim loslassen), den Spannungsregler und somit auch den ESP zu aktivieren und anschliessend den Spannungsregler auf Befehl vom ESP hin wieder abzuschalten.
Alles andere wird vom ESP erledigt.
Im Arduino Sketch für den ATtiny den ich recht ausführlich auf Deutsch kommentiert habe ist das ganze auch nochmal beschrieben.
Installation und Konfiguration - ESP
Programmiert hab ich das ganze in Lua. Man muss also als erstes die NodeMCU Firmware (den Lua Interpreter) flashen. Die Firmware bzw. den Build den ich verwende findet man <hier> und wurde mit diesem praktischen Build Service erstellt: http://frightanic.com/nodemcu-custom-build/
Wie man eine Firmware flasht erklär ich hier nicht, ich verwende dafür aber immer das esptool
Ist die Firmware geflasht geht es an die Konfiguration. Dazu müssen nur 2 Dateien angepasst werden.
Die Hauptkonfiguration geschieht in der config.lua. Das einzige das hier auf jeden Fall gemacht werden muss ist die Wlan Zugangsdaten anzupassen und den zu verwenden Service zu aktivieren. Alles andere ist optional.
Da ich selber gerne mit den verschiedenen Services "spiele" und das ganze auch einfach um beliebige Services erweiterbar sein sollte hab ich alles so programmiert dass die "Service Skripte" einfach austauschbar sind. (Die einzelnen Skripte können auch komplett eigenständig getestet werden. Mann muss dann aber etwas "tricksen".)
Im Moment kann man aus folgenden wählen: IFTTT, Pushingbox, Thingspeak und ArrestDB
Wobei ArrestDB kein Online Service ist sondern ein PHP Skript dass auf meinem Raspi läuft und eine einfache REST API zum lesen und schreiben von Datenbanken bereitstellt.
Ist die Konfiguration der config.lua erledigt muss noch das Request Skript das in der config.lua zuvor ausgewählt wurde und alle Einstellungen die für den jeweiligen Service enthält, angepasst werden.
Beim Pushingbox und IFTT Skript kann man sich auch noch aussuchen ob nur ein einziges Event bzw. Device ID verwendet werden soll oder ob für das öffnen und schließen jeweils unterschiedliche Events/Szenarien ausgelöst werden sollen.
Nach der Konfiguration müssen nur noch alle Skripte auf den ESP geladen und kompiliert werden.
Ich kann dafür den ESPlorer empfehlen. Damit lassen sich die Skripte nicht nur sehr schnell(über den upload button) auf den ESP laden sondern auch gleich per Mausklick kompilieren. Ausserdem kann man auch gleich im seriellen Monitor sehen was passiert. Es ist sogar ein einfacher Editor eingebaut. Bis auf die Firmware flashen kann man eigentlich alles damit machen. In kombination mit dem esptool ist der ESPlorer daher eigentlich auch schon alles was man für die Lua Programmieren mit NodeMCU braucht. Hier und da hakts beim ESPlorer zwar mal und manche Dinge sind etwas komisch gelöst, noch ohne Funktion oder sogar überflüssig (imho), aber alles in allem ein wirklich empfehlenswertes Tool. :thumbs1: ]
Sonst verwende ich auch ganz ger das luatool Das ist ein Python Skript mit dem sich das ganze auch ohne GUI über die Kommandozeile erledigen lässt(hochladen, kompilieren, Kommandos ausführen,...)
Wenn man die Skripte mit dem ESPlorer hochlädt sollte man damit es schneller geht als erstes noch die Baudrate hochdrehen. Somit werden auch große Scripte in nur weingen Sekunden hochgeladen. Mit 9600 Baud wartet man da sonst eine kleine Ewigkeit.
Da das kompilieren aller Scripte per Hand doch etwas mühsam ist hab ich noch ein kleines Lua Skript geschrieben mit dem sich alle Skripte automatisch kompilieren lassen. Dazu einfach das "compile_files.lua" Skript mit den anderen hochladen und zum Schluss per Mausklick ausführen.
Sind die Skripte kompiliert lässt man sich am besten noch kurz alle Dateien die sich jetzt auf dem ESP befinden auflisten.
FERTIG. Anschliessend kann man das ganze testen indem man den ESP resettet. (Vorher die Baudrate wieder auf 9600 stellen)
Die wichtigsten Dinge werden während der ESP die Skripte abareitet über den UART ausgegeben, man kann also im Terminal beobachten was passiert (und/oder schiefgeht!). Ein Durchgang dauert meistens zwischen 3 und 5 Sekunden.
Wenn die Option GET_WIFI_STRENGTH gesetzt ist kommen nochmal etwas 1-2 Sekunden länger. Die beiden anderen optionalen Features erhöhen die Zeit nicht merkbar.
Bebilderte Installtionsanleitung(Screenshots) (Nur vom hochladen der Lua Skripten mit dem ESPlorer)
Installation - ATtiny
* Gegebenenfalls die Arduino IDE aktualisierern (getestet mit v1.6.5)
* ATtiny unterstützung über den "Boards Manager" installieren
* Board, Processor und Clock auswählen ("ATtiny", "ATtinyx5", "1MHz (internal)"
* Sketch auf den ATtiny laden (es muss nichts konfiguriert werden)
* FERTIG.
Zum Schluss noch ein paar Bilder (Zum größer machen anklicken)
Steckbrettaufbau
--
Ein kleines Board das ich mir zum testen gemacht habe (Mehr darüber demnächst)
Fragen, Kritik, Verbesserungsvorschläge? Immer her damit. :thumbs1:
Links:
https://github.com/8n1/ESP8266-Tiny-Door-and-Window-Sensor
http://frightanic.com/nodemcu-custom-build/
https://github.com/themadinventor/esptool
http://esp8266.ru/esplorer/ (Man beachte den "etwas" unseriös wirkenden großen blauen Download Button zwischen der Werbung )
https://github.com/4refr0nt/luatool
https://github.com/nodemcu/nodemc…/nodemcu_api_en
Services
https://github.com/alixaxel/ArrestDB
https://ifttt.com/ (-> API info: https://ifttt.com/maker)
https://www.pushingbox.com/ (-> API info: https://www.pushingbox.com/api.php)
https://thingspeak.com/ (-> API info: https://thingspeak.com/docs)
Resourcen für den Aufbau
ATtiny Pinout: http://fc04.deviantart.net/fs70/f/2013/03…xxx-d5u4aur.png
ESP-12(E) (und ESP-03, ESP-01) Pinout: http://static.efetividade.net/img/esp-12-pinout-54329.png
ATtiny25/45/85 Datenblatt: http://www.atmel.com/Images/atmel-2…5_datasheet.pdf
SPX3819 Datenblatt: http://www.adafruit.com/datasheets/SPX…R202_052014.pdf
AS1363: http://ams.com/eng/Products/Power-Management/LDOs/AS1363
Entladekurve von Duracell Batterien: http://rightbattery.com/wp-content/upl…ry-capacity.jpg