mirror of
https://github.com/JorjBauer/aiie.git
synced 2025-02-05 19:31:56 +00:00
improving the battery readings
This commit is contained in:
parent
f1d74c1644
commit
58c636b484
@ -75,7 +75,7 @@ void setup()
|
|||||||
pinMode(RESETPIN, INPUT);
|
pinMode(RESETPIN, INPUT);
|
||||||
digitalWrite(RESETPIN, HIGH);
|
digitalWrite(RESETPIN, HIGH);
|
||||||
|
|
||||||
analogReference(EXTERNAL); // 3.3v external, instead of 1.7v internal
|
analogReference(EXTERNAL); // 3.3v external, or 1.2v internal. We need 1.2 internal for the battery level, which means we're gonna have to do something about the paddles :/
|
||||||
analogReadRes(8); // We only need 8 bits of resolution (0-255) for battery & paddles
|
analogReadRes(8); // We only need 8 bits of resolution (0-255) for battery & paddles
|
||||||
analogReadAveraging(4); // ?? dunno if we need this or not.
|
analogReadAveraging(4); // ?? dunno if we need this or not.
|
||||||
analogWriteResolution(12);
|
analogWriteResolution(12);
|
||||||
@ -263,26 +263,37 @@ void loop()
|
|||||||
// FIXME: what about rollover?
|
// FIXME: what about rollover?
|
||||||
nextBattCheck = millis() + 3 * 1000; // check every 30 seconds
|
nextBattCheck = millis() + 3 * 1000; // check every 30 seconds
|
||||||
|
|
||||||
|
// This is a bit disruptive - but the external 3.3v will drop along with the battery level, so we should use the more stable (I hope) internal 1.2v.
|
||||||
|
// The alternative is to build a more stable buck/boost regulator for reference...
|
||||||
|
analogReference(INTERNAL);
|
||||||
batteryLevel = analogRead(BATTERYPIN);
|
batteryLevel = analogRead(BATTERYPIN);
|
||||||
|
analogReference(EXTERNAL);
|
||||||
|
|
||||||
/* 204 looks like the top end (5.05v * (204/255), within tolerance of my resistors).
|
/* LiIon charge to a max of 4.2v; and we should not let them discharge below about 3.5v.
|
||||||
* Which suggests 176 is about 3.5v, which is the bottom 20% of discharge for LiIon.
|
* With a resistor voltage divider of Z1=39k, Z2=10k we're looking at roughly 20.4% of
|
||||||
* We'll call that 0% battery remaining to protect the battery.
|
* those values: (10/49) * 4.2 = 0.857v, and (10/49) * 3.5 = 0.714v. Since the external
|
||||||
|
* voltage reference flags as the battery drops, we can't use that as an absolute
|
||||||
|
* reference. So using the INTERNAL 1.1v reference, that should give us a reasonable
|
||||||
|
* range, in theory; the math shows the internal reference to be about 1.27v (assuming
|
||||||
|
* the resistors are indeed 39k and 10k, which is almost certainly also wrong). But
|
||||||
|
* then the high end would be 172, and the low end is about 142, which matches my
|
||||||
|
* actual readings here very well.
|
||||||
*
|
*
|
||||||
* Notes: 191/192 is 3.7v
|
* Actual measurements:
|
||||||
* ... but 193/192 is also 3.57v. :/
|
* 3.46v = 144 - 146
|
||||||
|
* 4.21v = 172
|
||||||
*/
|
*/
|
||||||
#if 1
|
#if 1
|
||||||
Serial.print("battery: ");
|
Serial.print("battery: ");
|
||||||
Serial.println(batteryLevel);
|
Serial.println(batteryLevel);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (batteryLevel < 176)
|
if (batteryLevel < 146)
|
||||||
batteryLevel = 176;
|
batteryLevel = 146;
|
||||||
if (batteryLevel > 204)
|
if (batteryLevel > 172)
|
||||||
batteryLevel = 204;
|
batteryLevel = 172;
|
||||||
|
|
||||||
batteryLevel = map(batteryLevel, 176, 204, 0, 100);
|
batteryLevel = map(batteryLevel, 146, 172, 0, 100);
|
||||||
g_display->drawBatteryStatus(batteryLevel);
|
g_display->drawBatteryStatus(batteryLevel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user