This is just a very quick example on how to add a Voltage Divider to the ESP8266 Internal ADC input to increase the ADC input range.
For more theory behind, please take a look at the previous related article: ESP8266 - Internal ADC
Today project:
Measure a voltage input range from 0-5V with the ESP8266 internal ADC
What do we need:
- 2 Resistors for the voltage divider, R1=105.6k, R2=24.08k. I am using here precision resistors and the values are measured values with a proper calibrated bench meter.
- a good, trustable, calibrated ok Multimeter.
- some wires to connect all together.
I will not insist on connections, take a deeper look at the previous article about
Voltage divider schematic and Vout (ADC input voltage) formula |
How do we do it :
1. Measure your Max desired input voltage
In my case, Max Input Voltage (Vmax) = 5.1919 (measured)
2. Measure Resistors values:
R1 = 105.6k
R2 = 24.08k
3. Check if Full Scale Value at the voltage divider output is inside the ADC defined domain:
- Calculated : Vout = (R2/(R1+R2))*Vin = 0.964072733 V
- Measured = 0.96038V
4. Calculate Voltage Divider Ratio:
- Vdivider Ratio= Max Input Voltage/Fullscale value = 5.405976676
5. Read ADC value :
adcr = adc.read(0)Average result for adcr = 1017
print(" ReadADC : "..adcr)
THIS IS IMPORTANT !! It tell us that we are inside the ADC domain as adcr < 1024 !
IF adcr > 1023 then you need to adjust your voltage divider resistors to fit inside ADC domain!
6. Calculate LSB in 2 ways to cross check that we have the right value:
- LSB = Input Voltage read by multimeter/ADC readed Value =
- LSB = (ADC Input pin read Voltage by multimeter/ADC readed Value/)*Vdivider Ratio =
If you want to know also the ADC LSB, then
LSB = ADC Input pin read Voltage by multimeter/ADC readed Value =
= 0.96038/1017 = 0.000944346 V
Guess what's happening if you multiply ADC LSB with Vdivider ratio :)
7. Software Implementation for the ADC read function:
function readADC()
ad = 0
LSB = 0.005105113 --calibrate based on your voltage divider AND Vref!
adcr = adc.read(0)
ad= adcr*LSB
print(" ReadADC : "..adcr)
print(" Read Voltage : "..ad)
return ad
end
and some results in the terminal window:
> SENT: readADC()
readADC()
ReadADC : 1017
Read Voltage : 5.191899921
>