Created
February 13, 2017 09:54
-
-
Save ronnyandre/840cb7c8f872148681ebba6a8008c530 to your computer and use it in GitHub Desktop.
Get Arduino Battery Status
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Function created to obtain chip's actual Vcc voltage value, using internal bandgap reference | |
// This demonstrates ability to read processors Vcc voltage and the ability to maintain A/D calibration with changing Vcc | |
// Now works for 168/328 and mega boards. | |
// Thanks to "Coding Badly" for direct register control for A/D mux | |
// 1/9/10 "retrolefty" | |
int battVolts; // made global for wider avaliblity throughout a sketch if needed, example a low voltage alarm, etc | |
void setup(void) | |
{ | |
Serial.begin(38400); | |
Serial.print("volts X 100"); | |
Serial.println( "\r\n\r\n" ); | |
delay(100); | |
} | |
void loop(void) | |
{ | |
battVolts=getBandgap(); //Determins what actual Vcc is, (X 100), based on known bandgap voltage | |
Serial.print("Battery Vcc volts = "); | |
Serial.println(battVolts); | |
Serial.print("Analog pin 0 voltage = "); | |
Serial.println(map(analogRead(0), 0, 1023, 0, battVolts)); | |
Serial.println(); | |
delay(1000); | |
} | |
int getBandgap(void) // Returns actual value of Vcc (x 100) | |
{ | |
// For 168/328 boards | |
const long InternalReferenceVoltage = 1056L; // Adjust this value to your boards specific internal BG voltage x1000 | |
// REFS1 REFS0 --> 0 1, AVcc internal ref. -Selects AVcc external reference | |
// MUX3 MUX2 MUX1 MUX0 --> 1110 1.1V (VBG) -Selects channel 14, bandgap voltage, to measure | |
ADMUX = (0<<REFS1) | (1<<REFS0) | (0<<ADLAR) | (1<<MUX3) | (1<<MUX2) | (1<<MUX1) | (0<<MUX0); | |
delay(50); // Let mux settle a little to get a more stable A/D conversion | |
// Start a conversion | |
ADCSRA |= _BV( ADSC ); | |
// Wait for it to complete | |
while( ( (ADCSRA & (1<<ADSC)) != 0 ) ); | |
// Scale the value | |
int results = (((InternalReferenceVoltage * 1024L) / ADC) + 5L) / 10L; // calculates for straight line value | |
return results; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment