I have testing sensor node with Arduino.The setup is Temperature sensor + Arduinoboard + Battery + Solar panel + Xbee for wireless transmission. It is placed on outside home. (hot weather).

The sensor node is using 3.7V /6600mAh battery with Arduino (Seeeduino; it is based on Arduino). The battery charged with Solar panel. I am reading Analog Pin 7 for battery value to calculate battery %. I think it is a 8bit resolution ADC (0 to 255).

Generally, I noticed, the battery percentage curve goes higher before it dies. Like 10 to 12 hours before it dies, i.e battery decrease. Usually, if the Sun light is good, it last for many days. If not, the battery decrease gradually and become Low, and increase suddenly for few hours and stop completely. When measure the voltage of that dead battery; it is around 2.8V.

I am not sure, why this sudden increase happens? Is it because of Lipo battery or Arduino (Seeeduino) reference voltage is not accurate when battery is low.


Thanks for the info. You are right: Arduino AREF is default and it is 3.3V. If i understand correctly, Even the battery initial voltage is 4.2v but AREF is always 3.3v.So, battery is below 3.1v and regulator output also 3.1v? Right? But the ADC does not know this voltage drop and always reference from AREF voltage. Hope, i got it correctly.

Another point is is voltage below 3.2 the Zbee stops working, So, there is not much useful even if i add Voltage diver with Zener. Right?

  • \$\begingroup\$ An 8-bit ADC typically has a full scale from 0-255 (256 discrete steps). \$\endgroup\$
    – David
    May 3, 2015 at 11:29
  • \$\begingroup\$ Does your chip have an inbuilt "Bandgap reference"? This usually is a ~1V reference voltage. I use it in my application to measure the voltage of an 3.7V Li-Ion, works quite nice. You have to put the bandgap as ADC input, and Li-Po voltage as reference. This way the value still scales, but a bit different. See this: electronics.stackexchange.com/questions/160570/…? \$\endgroup\$
    – aaa
    May 4, 2015 at 7:53

1 Answer 1


I suspect that you are connecting Aref to the regulator output.

While you have sufficient voltage, and the regulator provides the correct (i.e. expected) voltage, you get correct readings.

When the battery falls below a limit, the output at the regulator falls, and will always be the input V minus its drop. The ADC will always read the same voltage (since regulator output = Aref = Battery - Reg. Drop), which happens to be a higher ADC value than before this condition.

You need a better reference voltage at Aref. You can, for example, use a Zener with a drop less than 2.8V, and a voltage divider to feed the ADC.

Update: (Regarding your comment) You should add a better reference voltage to Aref. Since you observe the problem it is a good practice to fix it. Your arduino the way it works now cannot tell whether the battery is dead or fully charged, which is not a good idea.

Another point is that you risk damaging your arduino, as you are bringing Aref above Vcc. There is limit for this (I can't remember, check datasheet).

Finally is is also a bad practice to rely on something you observed (and it is not a guaranteed specification), since it may soon behave differently. Save yourself from headaches, and design following good practices.

  • \$\begingroup\$ You are right...Arduino AREF is default and it is 3.3V. Another point is is voltage below 3.2 the Zbee stops working, So, there is not much useful even if i add Voltage diver with Zener. \$\endgroup\$
    – Chandra
    May 5, 2015 at 15:17
  • \$\begingroup\$ If I helped you, could you please accept my answer? \$\endgroup\$ May 21, 2015 at 18:33

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.