#define PIN_SENSOR A0
#define LED_RED 11
#define LED_GREEN 10
#define LED_BLUE 9
#define WAIT 100
unsigned int ticks = 0;
unsigned int batteryCapacity = 50000; // could be just local variable in loop().
unsigned int batteryLevel = 0;
//***************************************************
void setup() {
// put your setup code here, to run once:
// Initialize serial monitor:
Serial.begin(9600);
// Specify pin functions:
pinMode(LED_RED, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_BLUE, OUTPUT);
}
//***************************************************
void RGB_color(int red, int green, int blue) {
// PWM output on digital pins (accepts integer values in interval [0, 255]):
analogWrite(LED_RED, red);
analogWrite(LED_GREEN, green);
analogWrite(LED_BLUE, blue);
}
//***************************************************
double getBatteryPercentage() {
// Calculate battery charge percentage:
double percentage;
percentage = ((double)batteryLevel / (double)batteryCapacity)*100;
return percentage;
}
//***************************************************
void ShowBatteryPercentage() {
// Battery percentage is sent to serial monitor and
// corresponding LED color is determined and lit:
double PercentFull;
int level;
PercentFull = getBatteryPercentage();
// Serial Monitor output:
// Show time elapsed:
Serial.print(ticks);
Serial.print(" ms. Charge at ");
// Show percent charge:
Serial.print(PercentFull); // no new line here.
Serial.println("%"); // prints "%" and creates a new line.
// Determine LED color, based on battery charge:
// (red: [0, 25), yellow: [25, 50), cyan: [50, 75), white [75,100), green: 100.]
level = int(PercentFull / 25.0);
switch (level) {
case 0: RGB_color(125, 0, 0); break; // red
case 1: RGB_color(125, 80, 0); break; // yellow
case 2: RGB_color(0, 125, 125); break; // cyan
case 3: RGB_color(125, 125, 125); break; // white
}
}
//***************************************************
void loop () {
// put your main code here, to run repeatedly:
int sensorValue = 0;
sensorValue = analogRead(PIN_SENSOR);
batteryLevel += sensorValue;
ticks += WAIT;
// Test if it is time to stop charging:
if(batteryLevel >= batteryCapacity) {
Serial.print(ticks);
Serial.print(" ms. ");
Serial.println("FULLY CHARGED");
batteryLevel = batteryCapacity; // prevent battery level to exceed battery capacity.
ticks = 0;
RGB_color(0, 125, 0); // LED is green, when battery is fully charged.
delay(30000); // wait 30 seconds.
}
else {
ShowBatteryPercentage();
}
delay(WAIT);
}