Mithilfe des ADC auf dem ESP8266 könnt Ihr Spannungen messen. Dies ist praktisch um zum Beispiel eine Akkuspannung und damit den Ladezustand des Akkus oder mithilfe eines LDRs und einem Serienwiderstand eine Helligkeit zu erfassen.
Dabei ist der ADC des ESP8266 aber etwas speziell. Ohne weitere externe Beschaltung kann dieser leider nur Spannungen bis max. 1V bestimmen. Damit direkt die Spannung eines LiPo-Akkus zu ermitteln ist also nicht möglich, weil der Spannungsbereich eines gesunden LipOs von 3,2 bis 4,2V reicht.
Damit der ADC aber auch höhere Spannungen messen kann bedient man sich eines Tricks. Man verwendet einen Spannungsteiler um die zu messende Spannung auf den möglichen Spannungsbereich des ADCs runter zu skalieren.
Der ADC misst dann also Spannungen im Bereich von 0V bis 1V welche für einen höheren Wert an dem eigentlichen Spannungsteiler stehen. So ist zum Beispiel auch auf der Platine des Wemos D1 Mini ein Spannungsteiler verbaut um Spannungen bis 3,3V zu messen. Das ist schon mal praktisch, reicht aber leider nicht um zum Beispiel die Spannung eines LiPos messen zu können.
Wie Ihr diesen maximalen Spannungsbereich des ADCs erweitern könnt, ist im folgenden Artikel beschrieben.
Requirements
Helpful articles:
Before you start with this article, you should have dealt with the basics of soldering. You can find information about this in the following article.
Elektronik – Mein Freund der Lötkolben
Required tool:
In the following list you will find all the tools you need to implement this article.
Required material:
In the following list you will find all the parts you need to implement this article.
Safety instructions
I know the following notes are always kind of annoying and seem unnecessary. Unfortunately, many people who knew "better" have lost eyes, fingers or other things due to carelessness or injured themselves. Data loss is almost negligible in comparison, but even these can be really annoying. Therefore, please take five minutes to read the safety instructions. Because even the coolest project is not worth injury or other trouble.
https://www.nerdiy.de/sicherheitshinweise/
Affiliate links/advertising links
The links to online shops listed here are so-called affiliate links. If you click on such an affiliate link and make a purchase via this link, Nerdiy.de will receive a commission from the relevant online shop or provider. The price does not change for you. If you make your purchases via these links, you support Nerdiy.de in being able to offer other useful projects in the future. 🙂
Wie funktioniert ein Spannungsteiler
Ein einfacher Spannungsteiler besteht eigentlich immer aus mindestens zwei Widerständen. Im unten stehenden Schaltplan des Wemos D1 Mini könnt Ihr im Rot markierten Bereich einen Spannungsteiler erkennen.
Falls Euch die Funktion eines Spannungsteilers nicht interessiert, könnt Ihr diesen Absatz auch einfach überspringen. 🙂

Dort sind zwei Widerstände in Reihenschaltung verbaut. Der obere Anschluss „A0“ kommt dabei von dem Anschluss Pin „A0“ auf der Wemos D1 Mini Platine. An „A0“ wird also die zu messende Spannung (zum Beispiel Euer LiPo) angeschlossen.
Der Anschluss „ADC“ führt dann zu dem eigentlichen ADC des ESP8266.

Warum macht man das ganze?
Man nutzt hier eine Eigenschaft einer Reihenschaltung aus zwei Widerständen.
Für eine Reihenschaltung aus zwei Widerständen gilt nämlich unter anderem, dass das Verhältnis der Gesamtspannung zu einer Einzelspannungen an einem der Widerstände gleich dem Verhältnis des Gesamtwiderstands zu einem der Einzelwiderstände ist. Das klingt erst mal kompliziert aber wird im folgenden erklärt. 🙂
Vorab: Als Formel würde das ganze so aussehen:
Formel 1:
or
Formel 1.2:
„U1“ and „U2“ are the voltages that drop across the resistor „R1“ and „R2“. „U“ is the same as U1 + U2 because in a series connection of (simple ohmic) resistors, the individual voltages add up to the total voltage.
Kurz, es gilt:
Ähnliches gilt auch für die Widerstände, denn auch der Gesamtwiderstand einer Reihenschaltung besteht aus der Summe der Einzelwiderstände.
Diese Formeln lassen sich nun ganz gut in Formel 1 einsetzen und man erhält folgendes:
„U1“ und „U2“ sind hierbei die Spannungen die an dem Widerstand „R1“ bzw. „R2“ abfallen. „U“ ist dabei das gleiche wie U1+U2 weil sich in einer Reihenschaltung aus (einfachen ohmschen) Widerständen die Einzelspannungen addieren um auf die Gesamtspannung zu kommen.
Dazu muss die Formel so umgestellt werden, dass sich aus den gegeben Werten die Gesamtspannung „U“ berechnen lässt. Die umgestellte Formel ergibt:
Formel 2:
Wenn man hier nun die entsprechenden Werte einsetzt ergibt sich folgendes:
Mit den im Spannungsteiler verwendeten Widerstandswerten lassen sich also Spannungen bis 3,2V am ADC messen.
Das praktische: Wenn man diese Widerstandswerte ändert kann man mit dem ADC auch höhere Spannungen messen. Im folgenden zum Beispiel die Spannung eines LiPos.
Spannungsteiler auf dem Wemos D1 Mini
So nun wisst Ihr in etwa wie ein Spannungsteiler funktioniert und wozu sich dieser unter anderem nutzen lässt. Mit diesem Wissen wollen wir nun Widerstandswerte für den Spannungsteiler finden um die Spannung eines LiPo-Akkus messen zu können. Dessen Ladeschlusspannung liegt bei maximal 4,2V. Damit wir diese obere Spannung auch sicher messen können ist es ratsam eine etwas höhere Spannung zu wählen. Sagen wir einfach mal 4,3V.
Für die üblichen Spannungswerte von 4.3V, 5V, 9V und 12V sind im nächsten Absatz auch schon Beispiele für die Widerstände R1 angegeben. So könnt Ihr Euch das rechnen sparen. 🙂

Ziel ist es also nun die Widerstandswerte für R1 und R2 zu ermitteln.
Gleichzeitig wissen wir schon, dass U=4,3V and U2=1V sein muss. Damit bleiben zum Berechnen eines Wertes mit Formel 2 nur noch ein Wert den wir ermitteln müssen um den letzten offenen Wert berechnen zu können. Aber wir machen es uns hier einfach und legen diesen Wert einfach fest. 🙂
Wir setzen R2 erst mal auf 100kOhm und gucken welchen Wert wir für R1 erhalten.
Umgestellt ergibt Formel 1 inkl. des gesammelten Wissens nun
Formel 3:
In dieser Formel kennen wir alle (grünen) Werte bis auf R1 (rot). Also versuchen wir die Formel nach R1 umzustellen und erhalten folgendes:
vereinfacht und umgestellt ergibt sich:
und das gleiche entsprechend eingefärbt:
In dieser Formel kennen wir nun alle grünen Werte und der gesuchte (rote) Wert steht brav auf der rechten Seite des Gleichheitszeichens. 🙂
Durch Einsetzen lässt sich nun der gesuchte Wert für R1 berechnen:
Es ergibt sich für R1 ein Wert von 330kOhm. Wenn wir also den auf der Platine des Wemos D1 Mini verbauten 220kOhm Widerstand gegen einen 330kOhm Widerstand ersetzen erweitert man den maximal messbaren Spannungsbereich von 3,3V auf 4,3V und kann somit auch den kompletten Spannungsbereich eines LiPo-Akkus messen. 🙂

Formel zur Berechnung:
- Dabei ist U2 immer 1V
- U ist die gewünschte maximal messbare Spannung z.b. 4,3V
- R2 solltet Ihr einfach festlegen. Am besten in einem bereich von 10kOhm bis 100kOhm um den Strom über den Spannungsteiler gering zu halten.
Beispielwerte für Maximalspannungen und die dazugehörigen Widerstandswerte
Die folgenden Widerstandswerte könnt Ihr verwenden um die maximal messbare Spannung des ADCs auf die angegebene Spannung zu erweitern.
Maximal messbare Spannung: 4,3V
R1=330kOhm, R2=100kOhm
Maximal messbare Spannung: 5V:
R1=400kOhm, R2=100kOhm
Maximal messbare Spannung: 9V:
R1=200kOhm, R2=25kOhm
Maximal messbare Spannung: 12V:
R1=275kOhm, R2=25kOhm

Die markierten 0805 Widerstände R1 und R2 könnt Ihr nun einfach gegen die von Euch gewünschten Widerstände austauschen. 🙂

Configuration in ESPEasy
In ESPEasy lässt sich die Umrechnung des ADCs in eine Spannung sehr komfortabel erledigen.

Stellt dazu einfach das Device „Analog input – internal“ wie abgebildet ein.
Wenn Ihr eine andere Maximalspannung als 4.300V verwendet müsst ihr diesen Wert natürlich entsprechend anpassen. 🙂
Have fun with the project
I hope everything worked as described for you. If not or you have questions or suggestions please let me know in the comments. I will then add this to the article if necessary.
Ideas for new projects are always welcome. 🙂
PS Many of these projects - especially the hardware projects - cost a lot of time and money. Of course I do this because I enjoy it, but if you think it's cool that I share the information with you, I would be happy about a small donation to the coffee fund. 🙂
Hi, just found your site, that's exactly what I'm looking for. How do I build the whole thing if I want to make the resistors external? I don't think I can do that on the Wemos with the resoldering.
Hey Mathias,
For which voltage range do you want to adapt the voltage divider? Theoretically, you can also change the voltage divider by soldering on suitable external resistors. One would have to calculate. maybe it is even enough to simply use another series resistor (for the upper part of the voltage divider). 🙂
Hi and thanks for your reply. I would like to measure a normal 18650 cell on the Wemos that should serve as a battery. Wouldn't like to solder around on the Wemos, since it's very small. Would like to just build two resistors in front of it if that's possible?
Hey Mathias,
you should be able to do that with just a 100k resistor. You then have to switch it like this:
A0–>100k_resistance–>LiPo_plus | LiPo_minus-> GND
Then 3.2V would have to drop at the two series resistors and thus exactly 1V at "R2". Long story short: 4.2V on the LiPo would then correspond to the ADC value of 1023. With the high resistances and the corresponding tolerances, the measurement is probably not super accurate. But it is definitely sufficient to record the fill level of the LiPo. 🙂
Remember that the relationship between LiPo voltage and "level" is not completely linear. And I would also "smooth" the readings a bit using a moving average. Otherwise you could get a "false alarm" at higher loads (and thus voltage dips in the battery voltage). 🙂
Hope it's explained clearly.
Best regards
Fab
Hi! You really built a great site. Very informative and explained in small steps. I'm working with a Wemos for the first time and came across your tutorial while researching the ADC.
I would like to read a level sensor for my cistern. This measures the water column and lets through 4-20mA depending on the filling level. It is supplied with 24V. Do you have a tip on how I could remodel the input from the Wemos for this?
All the best, Martin
hey martin,
Thanks. 🙂
In principle, you need a suitable resistor. The Wemos Breakout board's ADC can measure voltages from zero to 3.3V. You can use a resistor to convert your sensor's "current signal" into a voltage. I skipped that. A 175 ohm resistor should fit.
You would then have to connect it like this: (The zig-zag line is supposed to represent the resistance.) I would also recommend switching a high-impedance (eg 10k) resistor in front of the ADC. 🙂
Sensor_signal 4-20mA
|
+————–ESP_ADC
|
\
/ 175 ohms
\
/
|
|
|
|
|
GND
If you want, let me know if it worked. 🙂
Oh and on the ADC you should then be able to measure a voltage proportional to the current flow. The formula U=R*I applies (this is Ohm's law). R is the resistance (i.e. 175Ohm), I the current of the sensor (i.e. a value between 4-20mA) and U is the voltage that is then measured at the ADC or drops across the resistor. You can also test the circuit without having connected the Wemos. Simply measure the voltage with a multimeter. 🙂
Best regards
Fabian
Hi Fabian,
Many thanks for the help!
Used a precision trimmer as a resistor to calibrate the voltage.
Works great so far, but the values of the ADC jump plus/minus 5 points. I've already set a 100n against ground to stabilize, but that only helps to a limited extent.
If I measure the mA of the sensor like this, this value is stable. Depends on the ADC of the Wemo.
Do you have any tips on how I can smooth this out even better?
Best regards Martin
hey martin,
I am glad, that it worked. Good idea with the precision trimmer. 🙂
An idea how you could smooth that even better (in software) would be a moving average.
This is actually a common procedure if you have a signal that you can read in quickly.
To do this, you simply read out the ADC several times (e.g. 100 times) and then calculate the average of it. Small deviations should then actually be compensated for and no longer be noticeable. 🙂
Best regards
Fabian
Hi,
Thanks for your great info page 🙂
Must have been a lot of work.
Can you do that directly in the Wemos in espeasy
convert to percentage?
Greetings Heiko
Hey Heiko,
Thanks very much. Yes, I've already invested an hour or two here. 😀
Yes, that should work. Here's an article that might help you: https://www.letscontrolit.com/wiki/index.php/EasyFormula
Best regards
Fabian
Hi Fabian, Great article here!! well done 🙂
I have a wemos d1 mini with its original smd resistors R1 220kOhm and R2 100kOhm
I want to measure voltages up to 29.4V (7s battery)
so which resistors you think its better to pick?
solution1= R1 300kOhm + R2 10kOhm (up to 32v) least efficient but best accurate
solution2= R1 680kOhm + R2 20kOhm (up to 36V) low efficient medium accuracy
solution3= R1 470kOhm + R2 10kOhm (up to 49v) = most efficient but least accurate
Please do the math and help me pick the best solution.
Thanks 🙂
Hi Nick,
thanks 🙂
To be honest I would go with solution1. Of course the ~9micro amps could be anyoing (depending on your usecase) but in most cases they shouldnt bother that much.
Or do you plan to build something where this 9µA could be problematic? 🙂
Best regards
Fab
I will just use Wemos D1 Mini with tasmota to monitor my 24V (7s battery) that is charged with a solar panel. HUUUGE thanks for the feedback 🙂
Sounds cool, I think in this case you don't have to care so much about the 9µA 🙂
Good luck with the project. 🙂
Best regards
Fab
RE edit
or you can recommend another combination. I have those metallic resistors: 10Ω, 22Ω, 47Ω, 100Ω, 150Ω, 200Ω, 220Ω, 270Ω, 330Ω, 470Ω, 510Ω, 680Ω, 1KΩ, 2KΩ, 2.2K Ω, 3.3KΩ, 4.7KΩ, 5.1KΩ, 6.8KΩ, 10KΩ, 20KΩ, 47KΩ, 51KΩ, 68KΩ, 100KΩ, 220KΩ, 300KΩ, 470KΩ, 680KΩ, 1M
Hello Fab,
I just checked this article, and unfortunately a few errors crept in...
1.
Formula 2 is wrong!
Instead of Rsum / R2 + U2 = U it should read Rsum/R2 * U2 = U
Regardless of the fact that the line underneath is mathematically incorrect.
330/100+1 would be 4.3 ... and the units are not correct either (kOhm/kOhm cancels out)
Furthermore: Where does the 330 kOhm come from? R1=220 kOhm and R2 = 100 kOhm -> therefore Rsum = 320 kOhm and not 330 kOhm
With these ohm values (220 and 100 kOhm) you get over 1 volt at the ADC ... namely 1.03 volts
But I can't judge whether this is already harmful for the analogue input.
2.
Formula 3 is ok so far, but it was not derived from formula 1.2 but from formula 1
(Of course, this has no further influence on the further calculation methods.... mentioned only for clarity)
3.
I can't understand the calculated value for the 175 ohms (inquiry from Martin regarding the level sensor). According to my calculations, the value for the resistor would be around 52 ohms...
Please don't misunderstand my comment...
LG Ralph
Hi Ralph,
thanks for your hints. I corrected the errors that I could understand. 🙂
to 1. What do you mean by the units are wrong? Since the kOhms are shortened, V remains above: [kOhm/kOhm*V=V] That's what it says there, isn't it?
to 3. Your calculation refers to a maximum measurable voltage value of 1V. The Wemos D1 Mini (which Martin addresses in the comment) is a breakout board for the ESP8266. A voltage divider is connected upstream of the ADC (which he explicitly did not want to change). That's why the 175 ohms go very well with the extended measuring range (up to 3.3V) of the Wemos D1 Mini. 🙂
Oh no problem. I'm glad if someone finds a mistake and lets me know. 🙂
Thank you and best regards
Fabian
Hallo, ich weiß das ganz steht hier schon ein wenig aber für mich wäre für ein Wohnmobil die Batterieüberwachung wichtig. Ich hätte jetzt als Widerstände 1MOhm und 470k genommen. Bin ich da auf dem richtigen Weg? Ich will des weiteren auch mit Deep Sleep arbeiten. Es geht an sich eigentlich nur darum die Batterie vor dem Tiefentladen zu bewahren und mich informieren zu lassen. Eine Lastabschaltung ist bisher nicht geplant. Schön wäre es wenn es ein Möglichkeit gäbe die Batterie im Fall der Fälle ggf laden zu können.
Hi Sascha,
guck mal in den Abschnitt mit den Beispielwerten. Da habe ich auch für 12V eine Widerstandskombination angegeben. 🙂
Best regards
Fabian
Hallo, endlich habe eine guten Internetauftritt gefunden.
Ich teile viele Themen mit Dir.
Ich beabsichtige eine spannungsgesteuerte Solar-Überschuß Reglung zu bauen.
z.Z. messe ich die Leistung der Solarmodule und schalte bei einem bestimmten Wert einen Verbraucher dazu und an. Das mache ich über eine ESP 8266 und ein Mosfet ( IXFK44N50P ). Ich habe die Module so ausgelegt, dass ich Heizung oder Schaltnetzteile (230V) damit betreibe. Das Ganze ohne Wechselrichter.
Meine Frage: mit einem Spannungsteiler von 1,1Mo + 47Ko komme ich auch auf ca. 1V. bei einer Eingangsspannung von DC 230V. Ich verstehe nicht die Ausage, man darf nur max 42V am ESP messen.
Hi Uwe,
das was du dort vor hast ist Lebensgefährlich. Besonders hohe Gleichspannungen (dazu noch nicht abgesichert) sind Lebensgefährlich! Diese Überschussregelung MUSST (!) du anders lösen.
Auch wenn das technisch theoretisch möglich wäre ist es Lebensgefährlich und im höchsten Maße Fahrlässig das so umzusetzen. Bitte bedenke, dass schon Menschen gestorben sind bei solchen Aufbauten. Auch die Menschen die dachten, dass sie es besser wüssten.
Ich weiß nicht wie du auf die 42V kommst, aber sehr wahrscheinlich bezieht sich der Wert auf die maximal zulässige Berührungsspannung. Infos dazu findest du hier: https://de.wikipedia.org/wiki/Ber%C3%BChrungsspannung
Wenn du so eine Überschuss-Regelung bauen willst empfehle ich dir einen anderen Ansatz: Messe die aktuelle Erzeugungsleistung des Panels mit einer Wlan fähigen smarten Steckdose und schalte die Verbraucher dann in Abhängigkeit zum aktuellen Leistungswert.
Nochmal: Jegliches hantieren mit hohen Gleichspannungen ist Lebensgefährlich. Du solltest dieses Risiko auf keinen Fall eingehen!
Best regards
Fabian
Hi,
Danke für Deine Antwort.
Ich betreibe dieses Hobby seit der Enstehung des Transistors, also ca. 50 Jahre.
Danke für Deine sicherheitsrelevanten Tipps, aber man kann noch so Vorsichtig sein, es passiert immer mal und wenn von einem ELKO.
Nun zum Thema:
Es gibt wenig fertige Elektronik für diese hohe Gleichspannung, deshalb muss ich das meiste selber bauen.
Ich verwende Fhem und steuere und überwache Alles damit.
Das einzigste was für mich Neuland ist, ist Spannungsmessen am ESP 8266.
Schade das Du so wenig auf meine Frage eingehst.
Hi Uwe,
ich bin auf deine Frage eingegangen: Nämlich insofern, dass das lebensgefährlich ist was du dort vor hast. Das ist auch der Grund weshalb es so wenig zu diesem Thema gibt.
Außerdem ist die Messung der Ausgangsspannung einer Solarzelle auch nicht geeignet um auf deren aktuelle Leistung zu schließen. Die Ausgangsspannung ist nicht linear zur Leistung. Besonders wenn ein MPP Tracker verwendet wird kann sich der Arbeitspunkt so verschieben, dass die Ausgangsspannung mit steigender Leistung sogar kleiner wird.
Ich möchte dir nicht zu nahe treten, aber die Dauer wie lange man etwas macht sagt nichts darüber aus wie gut/sicher man ein Thema beherrscht. Stichwort „Betriebsblindheit“.
Ich bitte dich also nochmal ausdrücklich dein Problem anders zu lösen und betone nochmal, dass es Lebensgefährlich ist was du vor hast.
Ich helfe dir gerne das Problem anders und sicher zu lösen. Dazu musst du aber genauer beschreiben was du eigentlich vor hast.
Best regards
Fabian