ESP32: Sensoren per ADC einlesen

Für unser Bewässerungssystem wollen den Wasserstand in den Blumenuntertöpfen und die Feuchtigkeit der Erde ermitteln.

Zur Verfügung stehen zum Einem ein Füllstandsensor und zum Anderen ein Feuchtigkeitssensor.

Zunächst wollen wir nun den Füllstandsensor auslesen. Die Spezifikationen besagen, dass sich der Sensor mit 3,3V betreiben lässt, und die Ausgangsspannung 0-2,3V beträgt. Achtung: Der ADC des ESP32 hat eine maximale Eingangsspannung von 0-1V.

Ausgangsspannung: 0-2,3V
Arbeitsstrom des Füllstandsensor: <20mA
Für den Datenpin gehen wir hier davon aus, dass der ESP32 mit 0,5uA zieht.
R_ges = 2,3V / 0,5uA[=0,00005mA] = 46kΩ (Ohmsches Gesetz)
R_2 = (Ausgangsspannung / Eingangsspannung) * R_ges = (1V/2,3V) * 46kΩ = 20kΩ
R_1 = 26kΩ

Wissenwertes zur Berechnung des Spannungsteilers: 1, 2. Widerstände aufgrund ihrer Farbmuster bestimmen kann man hier. Kurz zusammengefasst muss man erst die Anzahl der Ringe feststellen, um dann mithilfe der Farben die richtige Tabelle zur Auswertung zu füllen. Die Reihenfolge der Farben ist hierbei wichtig: Der Anfang des Widerstands ist dort, wo der Kreis näher am Rand des Widerstandkörperende ist.

Somit wird ein Teil auf GND gezogen, und der anderer Teil von unserem ESP32 zur Erfassung der Werte konsumiert.

ESP32 & MOSFET

In diesem Projekt kommt der LOLIN32 zum Einsatz. Um Miniaturpumpen und Magnetventile steuern zu können, nutzen wir den MOSFET IRF520. Dieser lässt mittels PWM eine stufenlose Regelung von 0-24V bei bis zu 1A (mit Kühlkörper) zu.

Es soll nun eine Brushless DC Miniaturwasserpumpe (12V, 4.2W, folglich 350mA) und zwei Magnetventile (12V, 6.5W, 540mA) mit drei IRF520 gesteuert werden.

Der ESP32 wird mit einem 5V USB-Kabel versorgt. Für den separaten Stromkreis der Miniaturpumpe und Magnetventile gehen wir davon aus, dass immer nur die Pumpe und maximal ein Magnetventil geschaltet werden kann, was bedeutet, dass ein mindestens 890mA starkes 12V-Netzteil gefunden werden muss, welcher diesen Stromkreis versorgt: hier nutze ich ein 12V DC-Netzteil mit einer maximalen Leistung von 3.5A.

ESP32 Schematics

Die Miniaturpumpe werden wir über den IRF520 mittels PWM-Signal steuern, so dass wir bspw. langsam die Pumpe ein- und ausschalten können. Die Magnetventile werden mit dem IRF520 direkt ein- bzw. ausgeschaltet.

Die Verbindung mit dem ESP32 sieht in meinem Fall aus wie folgt:

  • MOSFET der Miniaturpumpe verbunden mit Pin 0
  • MOSFET des Magnetventils verbunden mit Pin 2

Hinweis: Es können nicht alle Pins genutzt werden, sondern normalerweise nur die Pins 2, 4, 5, 12, 13, 14, 15 und 16 (nach. Dokumentation). Pin 0 konnte ebenfalls nicht genutzt werden, weil dies scheinbar Probleme mit der USB-Schnittstelle zur Auswirkung hatte (?). Es funktioniert des Weiteren nur der erste ADC, wenn WLAN genutzt wird.

Programmierung der Logik

Um nun bspw. die Miniaturpumpe zu starten, müssen wir ein Signal auf den gewählten Pin geben, und der MOSFET schaltet durch:

import machine
pin = machine.Pin(2, machine.Pin.OUT)
pin.on()

ESP32 – Die ersten Schritte

Wir nutzen hier den Lolin32 mit Micropython als Betriebssystem (Tutorial zur Einrichtung und Weiterführendes).

An meinem Laptop schließe ich den ESP32 an COM3 an und nutze zum Flashen von Micropython das EspTool (mit dem Offset 0x1000, um einen Fehler zu vermeiden):

esptool.py --port COM3 erase_flash
esptool.py --port COM3 --baud 460800 write_flash --flash_size=detect 0x1000 esp32-20180923-v1.9.4-568-g4df194394.bin

Skripte können mithilfe des Adafruit MicroPython Tool (kurz: ampy) leicht ausgeführt werden:

ampy --port COM3 run main.py

Um eine Datei auf das Dateisystem des ESP32 zu laden, wird der Put-Befehl genutzt:

ampy --port COM3 put test.txt