Worum geht's?
Mein aktuelles Projekt wird eine automatische Gießanlage für unseren Garten. Dort werkeln ESP8266-Module (ESP) im Batteriebetrieb und senden Bodenfeuchtewerte per MQTT-Protokoll an eine Datenbank. Jede Stunde wachen die ESP auf, messen, verbinden sich mit WLAN, senden die Messdaten und schlafen dann wieder ein. Als Stromversorgung dienen im Moment vier AAA-Batteriezellen an einem 1µA-Regler auf 3,3V. Die Batterien halten etwa 3 Monate durch. Sie sollen durch LiFePo4-Akkus ersetzt werden, deren Entladeschlussspannung aber überwacht werden sollte, damit sie keinen Schaden nehmen.
Problembeschreibung
Der ESP8266 hat leider nur einen Analogeingang "ADC" bzw. "A0" an dem ich den Bodenfeuchtewert messe. Der Sensor liefert einen Spannungswert analog der Feuchte. Spannungen mit dem ESP zu messen ist problematisch wenn parallel WIFI genutzt wird, was bei mir der Fall ist. Mit aktiviertem WiFi sind die gemessenen Werte eigentlich nicht brauchbar. Bleibt nur die Lösung, sofort nach dem Aufwachen des ESP als Allererstes zu messen und erst danach die WLAN-Verbindung aufzubauen. Dann hat der eingebaute 10 bit- AD-Wandler eine recht gute Genauigkeit. Leider möchte ich neben dem Feuchtesensor auch die Batteriespannung messen, was leider einen zweiten A/D-Eingang nötig macht.
Lösung
Da der ESP I2C kann, liegt es nahe, einen externen A/D-Wandler mit I2C-Schnittstelle anzuschließen. Ich habe den ADS1115 gewählt, weil der vier A/D-Eingänge besitzt, einen geringen Ruhestrom hat (wenige µA im Single Shot Modus), sehr genaue 16 bzw. 15Bit-Werte liefert, sehr günstig zu haben ist (5 Stück ca. 17 € bei einem großen Onlineshop) und in meiner Bastelkiste war. Zum Testen habe ich im Netz einen Arduino-Sketch gefunden und für meine Belange angepasst.
Der Schaltplan
P1 teilt die 3,3 V des ESP-Board als Testspannung für Kanal 0 des ADS1115. Auf A1 ist die Versorgungsspannung 3,3V als "Batteriespannung" angeschlossen. Alle anderen Messkanäle bleiben unbeschaltet - ich brauche sie nicht. SCL und SDA vom ESP werden mit SCL und SCA des ADS verbunden: D1 = SCL, D2 = SDA
Das Programm
Der Sketch ist minimal gehalten. Zuerst wird die Verstärkung des ADS eingestellt, damit er +- 4,096V = 8,192V Spanne messen kann. Standardmäßig läuft der Wandler im Single-Shot-Modus (SSM), das heißt, jede Messung wird vom Programm angestoßen. In diesem Modus können keine negativen Spannungswerte verarbeitet werden. Da Bit 16 das Vorzeichenbit ist, hat der Wandler im SSM nur noch eine Auflösung von 15 Bit (32768 Stufen), aber der Stromverbrauch ist gegenüber dem Continous-Mode stark reduziert. Stellt sich noch die Frage, wie viel Spannungswert jede Stufe hat. Dazu etwas Mathematik:
0 bis 4,096V = 4096mV Spannung; Spannung / 15Bit = 4096mV / 32768 = 0,125 mV/Bit. Mit diesem Wert muss das Wandelergebnis multipliziert werden, um die Spannung zu errechnen --> Wandelergebnis * 0,125 ergibt die Spannung in Millivolt. Will man Volt, muss das Ergebnis nochmal durch 1000 dividiert werden. Im Beispiel habe ich nur mV ausgegeben:
(auf den Code klicken öffnet ein Fenster mit dem Quellcode als Text)
Versuchsaufbau und Testergebnis
Erster Versuch auf einer Steckplatte
Das Poti habe ich auf 1,000V eingestellt
dann die Messwerte des ADS1115 damit verglichen
1,0009V zu 1,0007V ist praktisch keine Abweichung. Die Batteriespannung ist mit 3,321 V ebenfalls sehr präzise. Die Kanäle 2 und 3 hängen in der Luft, sind aber auch stabil bei 0,6V. Ob das an den Schutzdioden des ADS liegt?