This commit is contained in:
Max Hunt 2019-12-20 18:39:41 +00:00
parent fa098fb381
commit 88b44de1ce

View File

@ -1,286 +1,362 @@
#include <Wire.h> #include <Wire.h>
#include <Adafruit_GFX.h> #include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h> #include <Adafruit_SSD1306.h>
#include "LowPower.h" #include "LowPower.h"
#include <avr/wdt.h> #include <avr/wdt.h>
#define SCREEN_WIDTH 128 #define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32 #define SCREEN_HEIGHT 32
#define OLED_RESET -1 #define OLED_RESET -1
#define PWRBTN 3 #define PWRBTN 3
#define CHGBTN 4 #define CHGBTN 4
#define PWRLED 5 #define PWRLED 5
#define CHGLED 6 #define CHGLED 6
#define VBAT A0 #define VBAT A0
#define FETCTRL 2 #define FETCTRL 2
#define CSTAT1 A1 #define CSTAT1 A1
#define CSTAT2 A2 #define CSTAT2 A2
#define DIMLEN 274 #define DIMLEN 274
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
int batteryPct = 0; int batteryPct = 0;
double battVoltage = 0.0; double battVoltage = 0.0;
static const double chargeModifier = -0.3; static const double chargeModifier = -0.04;
static const double dischargeModifier = 0.3; static const double dischargeModifier = 0.04;
double voltageModifier = 0; double voltageModifier = 0;
bool powerState = false; bool powerState = false;
bool screenOn = false; bool screenOn = false;
bool charging_1 = false; bool charging_1 = false;
bool charging_2 = false; bool charging_2 = false;
int screenState = 0; bool isSafe = true;
int screenState = 0;
static const unsigned char PROGMEM battery_logo[] = {
B00000011, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11000000, B00000000, static const unsigned char PROGMEM battery_logo[] = {
B00001111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11110000, B00000000, B00000011, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11000000, B00000000,
B00011111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111000, B00000000, B00001111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11110000, B00000000,
B00111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111100, B00000000, B00011111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111000, B00000000,
B01111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111110, B00000000, B00111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111100, B00000000,
B01111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111110, B00000000, B01111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111110, B00000000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B00000000, B01111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111110, B00000000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B00000000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B00000000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B00000000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B00000000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B00000000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B00000000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B00000000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B00000000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B01100000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B00000000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B01110000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B01100000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B01111000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B01110000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B01111000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B01111000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B01111000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B01111000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B01111000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B01111000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B01111000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B01111000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B01111000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B01111000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B01110000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B01111000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B01100000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B01110000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B00000000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B01100000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B00000000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B00000000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B00000000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B00000000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B00000000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B00000000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B00000000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B00000000,
B01111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111110, B00000000, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B00000000,
B01111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111110, B00000000, B01111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111110, B00000000,
B00111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111100, B00000000, B01111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111110, B00000000,
B00011111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111000, B00000000, B00111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111100, B00000000,
B00001111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11110000, B00000000, B00011111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111000, B00000000,
B00000011, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11000000, B00000000 B00001111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11110000, B00000000,
}; B00000011, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11000000, B00000000
};
static const unsigned char PROGMEM charge_logo[] = {
B00011111, B11000000, static const unsigned char PROGMEM charge_logo[] = {
B00010000, B01000000, B00011111, B11000000,
B00100000, B01000000, B00010000, B01000000,
B00100000, B10000000, B00100000, B01000000,
B01000001, B00000000, B00100000, B10000000,
B01000011, B11000000, B01000001, B00000000,
B10000000, B01000000, B01000011, B11000000,
B11110000, B10000000, B10000000, B01000000,
B00010001, B00000000, B11110000, B10000000,
B00100010, B00000000, B00010001, B00000000,
B00100100, B00000000, B00100010, B00000000,
B01001000, B00000000, B00100100, B00000000,
B01010000, B00000000, B01001000, B00000000,
B01100000, B00000000 B01010000, B00000000,
}; B01100000, B00000000
};
static const int dimmerVals[] = {
0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,2,2,2,2,3,3,4,4,4,5,5,6,6,7,7,8,8,9,9,10,11,11,12,13,14,15,16,17,18,19,20,21, static const unsigned char PROGMEM charged_logo[] = {
22,24,25,26,28,29,30,32,33,35,37,38,40,42,44,46,48,49,52,54,56,58,60,63,65,67,70,73,75,78,80,83,86,89,92,95,98, B00011111, B11000000,
101,105,108,112,116,120,124,127,131,136,139,144,148,152,156,160,164,168,172,177,181,185,189,192,196,200,204,208, B00011111, B11000000,
211,215,218,221,224,227,230,233,236,238,240,242,244,246,248,249,250,251,252,253,253,253,253,253,253,253,253,253, B00111111, B11000000,
253,252,252,251,249,248,247,245,243,241,239,236,234,231,228,225,222,219,216,212,208,205,201,197,194,190,186,182, B00111111, B10000000,
178,174,169,165,161,157,153,149,145,141,137,133,129,125,121,117,113,110,106,102,98,96,93,89,87,84,81,78,76,73,71, B01111111, B00000000,
68,65,63,61,58,56,54,52,50,48,46,44,42,40,39,37,35,34,32,31,29,28,26,25,24,23,21,20,19,18,17,16,15,14,13,12,12,11, B01111111, B11000000,
10,9,9,8,8,7,7,6,6,5,5,4,4,4,3,3,2,2,2,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0 B11111111, B11000000,
}; B11111111, B10000000,
B00011111, B00000000,
void setup() { B00111110, B00000000,
delay(100); B00111100, B00000000,
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); B01111000, B00000000,
display.clearDisplay(); B01110000, B00000000,
display.setTextColor(WHITE); B01100000, B00000000
Serial.begin(9600); };
pinMode(VBAT, INPUT);
pinMode(CSTAT1, INPUT); static const int dimmerVals[] = {
pinMode(CSTAT2, INPUT); 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,2,2,2,2,3,3,4,4,4,5,5,6,6,7,7,8,8,9,9,10,11,11,12,13,14,15,16,17,18,19,20,21,
pinMode(FETCTRL, OUTPUT); 22,24,25,26,28,29,30,32,33,35,37,38,40,42,44,46,48,49,52,54,56,58,60,63,65,67,70,73,75,78,80,83,86,89,92,95,98,
pinMode(PWRLED, OUTPUT); 101,105,108,112,116,120,124,127,131,136,139,144,148,152,156,160,164,168,172,177,181,185,189,192,196,200,204,208,
pinMode(CHGLED, OUTPUT); 211,215,218,221,224,227,230,233,236,238,240,242,244,246,248,249,250,251,252,253,253,253,253,253,253,253,253,253,
pinMode(PWRBTN, INPUT_PULLUP); 253,252,252,251,249,248,247,245,243,241,239,236,234,231,228,225,222,219,216,212,208,205,201,197,194,190,186,182,
pinMode(CHGBTN, INPUT_PULLUP); 178,174,169,165,161,157,153,149,145,141,137,133,129,125,121,117,113,110,106,102,98,96,93,89,87,84,81,78,76,73,71,
digitalWrite(FETCTRL, LOW); 68,65,63,61,58,56,54,52,50,48,46,44,42,40,39,37,35,34,32,31,29,28,26,25,24,23,21,20,19,18,17,16,15,14,13,12,12,11,
battVoltage = GetVoltage(); 10,9,9,8,8,7,7,6,6,5,5,4,4,4,3,3,2,2,2,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0
initScreen(); };
delay(200);
} void setup() {
delay(100);
void loop() { wdt_enable(WDTO_8S);
delay(100); display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
checkPresses(); display.clearDisplay();
checkCharging(); display.setTextColor(WHITE);
if (screenState != 0) {updateScreen();} Serial.begin(9600);
} pinMode(VBAT, INPUT);
pinMode(CSTAT1, INPUT);
void getBatteryCharge(){ pinMode(CSTAT2, INPUT);
double voltage = GetVoltage(); pinMode(FETCTRL, OUTPUT);
pinMode(PWRLED, OUTPUT);
if (voltage > 4.13){batteryPct = 100;} pinMode(CHGLED, OUTPUT);
else if (voltage > 4.06){batteryPct = 90;} pinMode(PWRBTN, INPUT_PULLUP);
else if (voltage > 3.99){batteryPct = 80;} pinMode(CHGBTN, INPUT_PULLUP);
else if (voltage > 3.92){batteryPct = 70;} digitalWrite(FETCTRL, LOW);
else if (voltage > 3.85){batteryPct = 60;} battVoltage = GetVoltage();
else if (voltage > 3.78){batteryPct = 50;} initScreen();
else if (voltage > 3.71){batteryPct = 40;} delay(200);
else if (voltage > 3.64){batteryPct = 30;} }
else if (voltage > 3.57){batteryPct = 20;}
else if (voltage > 3.50){batteryPct = 10;} void loop() {
else if (voltage > 3.40){ delay(100);
Serial.println("We are fucked"); wdt_reset();
batteryPct = 0; checkPresses();
} checkCharging();
else if (voltage < 2){batteryPct = -1;} safetyCheck();
if (screenState != 0 && isSafe == true) {updateScreen();}
} if (powerState == false && screenState == 0) {
LowPower.powerDown(SLEEP_2S, ADC_OFF, BOD_OFF);
}
void checkPresses(){ }
if (digitalRead(PWRBTN) == 0) {
delay(100); void getBatteryCharge(){
if (digitalRead(PWRBTN) == 0) { double voltage = GetVoltage();
blinkLed(PWRLED);
if(powerState == true){ if (voltage > 4.15){batteryPct = 100;}
turnOff(); else if (voltage > 4.11){batteryPct = 95;}
} else if (voltage > 4.08){batteryPct = 90;}
else { else if (voltage > 4.02){batteryPct = 85;}
turnOn(); else if (voltage > 3.98){batteryPct = 80;}
} else if (voltage > 3.95){batteryPct = 75;}
} else if (voltage > 3.91){batteryPct = 70;}
} else if (voltage > 3.87){batteryPct = 65;}
if (digitalRead(CHGBTN) == 0) { else if (voltage > 3.85){batteryPct = 60;}
delay(100); else if (voltage > 3.83){batteryPct = 55;}
if (digitalRead(CHGBTN) == 0) { else if (voltage > 3.82){batteryPct = 50;}
blinkLed(CHGLED); else if (voltage > 3.80){batteryPct = 45;}
if (screenState == 1 || screenState == 0) { else if (voltage > 3.79){batteryPct = 40;}
screenState++; else if (voltage > 3.77){batteryPct = 35;}
} else if (voltage > 3.75){batteryPct = 30;}
else { else if (voltage > 3.73){batteryPct = 25;}
initScreen(); else if (voltage > 3.71){batteryPct = 20;}
screenState = 0; else if (voltage > 3.69){batteryPct = 15;}
} else if (voltage > 3.61){batteryPct = 10;}
} else if (voltage > 3.40){
}
} batteryPct = 0;
}
void checkCharging(){ else if (voltage < 2){batteryPct = -1;}
if (digitalRead(CSTAT1) == 1){
delay(100); }
if (digitalRead(CSTAT1) == 1){
charging_1 = true;
} void checkPresses(){
} if (digitalRead(PWRBTN) == 0) {
else { charging_1 = false; if (powerState == true || screenState != 0) {
} delay(700);
}
if (digitalRead(CSTAT2) == 1){ if (digitalRead(PWRBTN) == 0) {
delay(100); if(powerState == true){
if (digitalRead(CSTAT2) == 1){ turnOff();
charging_2 = true; }
} else {
} turnOn();
else { charging_2 = false; }
} }
} }
if (digitalRead(CHGBTN) == 0) {
if (powerState == true || screenState != 0) {
void turnOn() { delay(700);
digitalWrite(FETCTRL, HIGH); }
powerState = true; if (digitalRead(CHGBTN) == 0) {
} if(isSafe == true){
blinkLed(CHGLED);
void turnOff() { if (screenState == 1 || screenState == 0) {
digitalWrite(FETCTRL, LOW); screenState++;
powerState = false; }
} else {
initScreen();
screenState = 0;
void initScreen() { }
display.clearDisplay(); }
display.display(); else {
screenOn = false; errorBlink();
} }
}
void updateScreen() { }
getBatteryCharge(); }
if (screenState == 1) {
updateDisplayPct(); void checkCharging(){
} if (digitalRead(CSTAT1) == 1){
else if (screenState == 2) { delay(100);
updateDisplayVoltage(); if (digitalRead(CSTAT1) == 1){
} charging_1 = true;
updateDispayChg(); }
} }
else { charging_1 = false;
void updateDisplayPct(){ }
display.clearDisplay();
display.drawBitmap(0, 0, battery_logo, 120, 32, 1); if (digitalRead(CSTAT2) == 1){
display.setTextSize(2); delay(100);
display.setCursor(35, 10); if (digitalRead(CSTAT2) == 1){
display.setTextColor(0); charging_2 = true;
display.print(batteryPct); }
display.println("%"); }
display.display(); else { charging_2 = false;
screenOn = true; }
} }
void updateDisplayVoltage(){
display.clearDisplay(); void turnOn() {
display.drawBitmap(0, 0, battery_logo, 120, 32, 1); if(isSafe == true){
display.setTextSize(2); blinkLed(PWRLED);
display.setCursor(30, 10); digitalWrite(FETCTRL, HIGH);
display.setTextColor(0); powerState = true;
display.print(GetVoltage()); }
display.println(" V"); else{
display.display(); errorBlink();
screenOn = true; }
} }
void updateDispayChg(){ void turnOff() {
if (charging_1 == true) {display.drawBitmap(118, 0, charge_logo, 16, 14, 1);} blinkLed(PWRLED);
if (charging_2 == true) {display.drawBitmap(118, 16, charge_logo, 16, 14, 1);} digitalWrite(FETCTRL, LOW);
display.display(); powerState = false;
} }
double GetVoltage(){
int totalSamples = 0; void initScreen() {
double voltage = 0; display.clearDisplay();
for (int q = 0; q < 10; q++) { display.display();
totalSamples = totalSamples + analogRead(VBAT); screenOn = false;
delay(5); }
}
voltage = (totalSamples / 10) * (5.00 / 1023.0); void updateScreen() {
getBatteryCharge();
if(charging_1 == true || charging_2 == true){voltageModifier = chargeModifier;} updateDispayChg();
else if(powerState == true){voltageModifier = dischargeModifier;} if (screenState == 1) {
else {voltageModifier = 0;} updateDisplayPct();
}
voltage = voltage + voltageModifier; else if (screenState == 2) {
updateDisplayVoltage();
if (voltage > (battVoltage-0.03) && voltage < (battVoltage+0.03)) { }
return battVoltage; }
}
else { void updateDisplayPct(){
battVoltage = voltage; display.clearDisplay();
return voltage; display.drawBitmap(0, 0, battery_logo, 120, 32, 1);
} display.setTextSize(2);
} display.setCursor(35, 10);
display.setTextColor(0);
void blinkLed(int ctrlLed) { display.print(batteryPct);
for(int i=0; i<DIMLEN; i++){ display.println("%");
analogWrite(ctrlLed, dimmerVals[i]); delay(12); display.display();
} screenOn = true;
} }
void updateDisplayVoltage(){
display.clearDisplay();
display.drawBitmap(0, 0, battery_logo, 120, 32, 1);
display.setTextSize(2);
display.setCursor(30, 10);
display.setTextColor(0);
display.print(GetVoltage());
display.println(" V");
display.display();
screenOn = true;
}
void updateDispayChg(){
if (charging_1 == true && batteryPct != 100) {display.drawBitmap(118, 0, charge_logo, 16, 14, 1);}
if (charging_2 == true && batteryPct != 100) {display.drawBitmap(118, 16, charge_logo, 16, 14, 1);}
if (charging_1 == true && batteryPct == 100) {display.drawBitmap(118, 0, charged_logo, 16, 14, 1);}
if (charging_2 == true && batteryPct == 100) {display.drawBitmap(118, 16, charged_logo, 16, 14, 1);}
}
double GetVoltage(){
int totalSamples = 0;
double voltage = 0;
for (int q = 0; q < 10; q++) {
totalSamples = totalSamples + analogRead(VBAT);
delay(5);
}
voltage = (totalSamples / 10) * (5.00 / 1023.0);
if(charging_1 == true || charging_2 == true){voltageModifier = chargeModifier;}
else if(powerState == true){voltageModifier = dischargeModifier;}
else {voltageModifier = 0;}
voltage = voltage + voltageModifier;
if (voltage > (battVoltage-0.03) && voltage < (battVoltage+0.03)) {
return battVoltage;
}
else {
battVoltage = voltage;
return voltage;
}
}
void safetyCheck(){
double currentVoltage = 0;
currentVoltage = GetVoltage();
if(currentVoltage > 3.40 ){ //|| currentVoltage < 1.00
isSafe = true;
}
else{
isSafe = false;
if(powerState == true){
turnOff();
screenState = 0;
initScreen();
}
}
}
void blinkLed(int ctrlLed) {
for(int i=0; i<DIMLEN; i++){
analogWrite(ctrlLed, dimmerVals[i]); delay(12);
}
}
void errorBlink() {
for(int i=0; i<5; i++){
digitalWrite(PWRLED, 1);
digitalWrite(CHGLED, 1);
delay(400);
digitalWrite(PWRLED, 0);
digitalWrite(CHGLED, 0);
delay(400);
}
}