Hey friend.i am going to share a beat project aver about. A power bank this power bank is fully AI and Arduino based. This can support Q3.0 , fastcharging 3.0 and it output upto 92w. This is fully compatible for morden laptops and mobile phone that can handle fastcharging.
This is the successor to my ultimate 18650 power bank, this version focuses on practicality, portability, safety, and more advanced controls. This power bank is also modular and customizable in that it can be connected to modules that convert the power to AC, DC, USB, or other forms. The removable battery of 92Wh (Samsung 50E) means that it is close to the largest battery legally allowed on an airplane. This development version of the power bank is opensource, links below.
This is a best powerful power bank. I made power bank by in 3 steps. I share 1 only at this time.
SO LETS START
WARNING: BEFORE YOU BUILD, you are responsible for your OWN safety, understand the hazards of working with lithium batteries first. I am not responsible for personal or property damage caused by this power bank!
If you go to make this power bank. You need to know about. BEFORE YOU BUILD: you mush have an advanced understanding of circuits and knows how to program a microcontroller.
The design files contain CAD, circuit design, illustrations and diagrams, documentation, purchase links. for complete design files, download from GrabCAD.
Ultimate_Powerbank_V3_Code
This the the code for the ultimate power bank V3
PLEASE NOTE: AS YOU ARE READING THIS, I am designing an updated version of this powerbank with STM32, the code is going also be re-written. Stayed tuned. I am not a professional programmer, my code is VERY MESSY, if you can improve on my code or introduce new functionality, that would be greatly apperciated!!!
I give all links and files and folders.
Codes for arduino board =CODE FOR ARDUINO IN GITHUB
You can also copy the codes here.
#include <ezButton.h> //ez button libary
#include <Type4051Mux.h> //4051 MUx libary
#include <FastLED.h> //LED RING Libaries
#include <X9C.h> // digital pot, for changing charging current
#include <Adafruit_GFX.h> //display graphics
#include <TM1640.h> //LED matrix chip libary
#include <TM16xxMatrixGFX.h>
#include <Fonts/Picopixel.h> //small font for numbers
//---------------------Setup phase---------------------------------
//Pin Declorations------------------------------------------------------
const int powerPin = 8; //Keep high to turn the powerbank on, low to immedialy turn off
const int fanPin = 16; //high to turn fan on, low to turn fan off
const int relayPin = 17; //relay pin to enable charging
//multiplexer:
Type4051Mux inMux(A7, INPUT, ANALOG, 5, 6, 7); //define Mux pins
//set up buttons
ezButton powerButton(11); // create ezButton object that attach to pin 6;
ezButton usbButton(12); // create ezButton object that attach to pin 7;
ezButton wirelessButton(13); // create ezButton object that attach to pin 8;
//WS2812 LED ring:
#define NUM_LEDS 24 //numbers of leds in the ring
#define DATA_PIN 14 //pin to send data to led ring
CRGB leds[NUM_LEDS]; // Define the array of leds
int LEDBrightness = 10; //LED brightness in non-flashlight mode
byte flashlightBrightness = 250; //defult led brightness in flashlight mode
byte gHue = 0; // rotating "base color" used by many of the patterns
//X9C103 digital Pot:
#define INC 2 //to inc pin x9c
#define UD 3 // to ud pin on x9c
#define CS 4 // to cs pin x9c
X9C pot; // create a pot controller
//devices names and corrisponding pins
const int usbOnPIN = 10; //usb QC 3.0 module pin
const int modulePin = 9; //wireless charging module pin
const int wirelessPin = 15; //wireless charging module pin
//ACS712 Hall effect current sensor:
int mVperAmp20A = 100; // use 100 for 20A; 100mV per amp
int ACSoffset = 2500;
double Voltage = 0;
double Amps = 0;
//8x16 I2C LED dot matrix display:
TM1640 module(A4, A5); // I2C connection for LED matrix
#define MODULE_SIZECOLUMNS 16 // number of GRD lines, will be the y-height of the display
#define MODULE_SIZEROWS 8 // number of SEG lines, will be the x-width of the display
TM16xxMatrixGFX matrix(&module, MODULE_SIZECOLUMNS, MODULE_SIZEROWS); // TM16xx object, columns, rows
//100K NTC thermistor values:
float R1 = 10000;
float logR2, R2, T;
float c1 = 1.009249522e-03, c2 = 2.378405444e-04, c3 = 2.019202697e-07;
//Voltage mesureing values:
float VinMv = 0.0; //raw voltage value in Mv
float VdivR1 = 100000.0; // resistance of R1 (100K Ohm) for input voltage
float VdivR0 = 47500.0; // resistance of R (47K Ohm) for battery voltage
float VdivR2 = 10000.0; // resistance of R2 (10K Ohm) common
//displayed texts values
int textDelay = 1000; //how long between text displays
unsigned long lastTextON;
bool line1;
String lineOneTEXT;
String lineTwoTEXT;
//Sensors Values:
int batteryTempRAW;
int chargingTempRAW;
int caseTempRAW;
int moduleTempRAW;
int moduleConnectRAW;
int batteryVoltageRAW;
int inputVoltageRAW;
int powerbankAmpRAW;
int chargingAmpRAW;
double powerbankAmp;
double chargingAmp;
double batteryTemp;
double moduleTemp;
double caseTemp;
double chargingTemp;
double batteryVoltage;
double inputVoltage;
double powerOutputWATT;
bool moduleConnect;
//modes
#define NUM_MODES 10 //Update this number to the highest number of "cases" actually +1 because 0 is case 1
int ledMode = 0;
bool chargingMode;
bool fanOn = false;
bool usbQcON = false;
bool wirelessOn = false;
bool moduleOn = false;
bool inChargingMODE = false; //indicate that charging mode state;
bool matrixShortON = false;
bool flashlightMode = false;
bool inModuleMODE = false;
bool inQcMODE = false;
bool inWirelessMODE = false;
bool inputVoltageLOW = true;
bool turnOnFINISHED = false;
//other values:
int readSensorINTERVAL = 1000; //every x milisecond read sensors
int numLEDsVOLT;
int batteryPercentage;
int greenLEDsINTENSITY;
bool ringVoltageON = false; //indicate LED ring voltage display on/off
bool matrixVoltageON = false; //indicate matrix voltage diaplay on/off
bool chargeFlashLED = false; //indicating the charge flash led is on or off
int fanSpeed; //0-255 is 0-100% fan
int displayTextCYCLE = 0; //times to switch display text mode
int fanOnTEMP = 38; //temperature to turn the fan on
float idlePowerWATT = 4; //if powerbank is drawing less than x watts, it is consided in idle.
bool chargeCurrentLOW = false; //CC mode low current indication
//int fanMaxTEMP = 48; //temperature fan speed reaches max
//protection mechnisms:
float currentLimit = 8.5; //maxium amount of current
float maxBatteryVOLTAGE = 21.2; //maxium battery voltage - around 4.23V x num of cells (5s or 4s)
float fullBatteryVOLTAGE = 20.7; //full battery voltage - slightly lower than max voltage or user defined
float emptyBatteryVOLTAGE = 14; //maxium battery voltage - around 2.75V x num of cells (5s or 4s)
float minBatteryVOLTAGE = 11; //minium battery voltage - around 2.2V x num of cells (5s or 4s)
int fullBatteryADC;
int emptyBatteryADC;
int warnTimesLED = 4; //times warning leds flash
int warnTimesMATRIX = 6; //times text would change
bool overCurrentPROTEC = false; //start with over voltage protection off.
bool overTempPROTEC = false;
bool overVoltPROTEC = false;
bool batteryFaultPROTEC = false;
//time values:
//buttons:
int shortPressDURATION = 500; //max time hold for button press to be counted as short press
int longPressDURATION = 1500; //max time hold for button press to be counted as long press
int powerOffDURATION = 2000; //time to hold power button to turn off power bank
int voltageUpdateTIME = 8000; //every x seconds in charging mode, update the battery voltage display
int chargingFlashTIME = 500; //every x mili seconds in charging mode, flash the next ring voltage indicator led
int matrixOnDELAY = 4500; //time it takes for matrix to turn off once displaying voltage
int chargeCurrentCHECK = 10000; //if charging current stays low for 10 seconds, stop charging
unsigned long idlePowerOFF = 90000; //how long it takes for powerbank to auto shut off when less than idle power
unsigned long lastChargeCURRENT;
unsigned long currentMillis;
unsigned long timeSinceUPDATE;
unsigned long timeSinceFLASH;
unsigned long idleTime;
unsigned long lastInputVOLTAGEhigh;
int powerTimeHOLD;
unsigned long powerTimePRESSED;
unsigned long lastDisplayTEXT;
unsigned long powerTimeRELEASED;
int usbTimeHOLD;
unsigned long usbTimePRESSED;
unsigned long usbTimeRELEASED;
int wirelessTimeHOLD;
unsigned long wirelessTimePRESSED;
unsigned long wirelessTimeRELEASED;
unsigned long matrixOnTIME;
unsigned long lastCurrentCHECK = 0;
unsigned long lastUpdateTIME = 0;
unsigned long lastActiveTIME;
unsigned long lastFlashTIME = 0;
unsigned long preMillisLED = 0;
unsigned long preMillisWARN = 0;
unsigned long preMillisDISPLAY1 = 0;
unsigned long preMillisDISPLAY2 = 0;
unsigned long firstOnTIME;
const long interval = 4000;
void setup() {
Serial.begin(9600);
//define devices signal pin as output
pinMode(fanPin,OUTPUT);
pinMode(powerPin,OUTPUT);
pinMode(usbOnPIN,OUTPUT);
pinMode(modulePin,OUTPUT);
pinMode(wirelessPin,OUTPUT);
pinMode(relayPin,OUTPUT);
digitalWrite(powerPin,HIGH); //keep the powerbank on
pot.begin(CS,INC,UD); //initialize digital pot..
//pot.setPot(10,true); //set pot to 100% of highest value
LEDS.addLeds<WS2812,DATA_PIN,RGB>(leds,NUM_LEDS); //intialize LEDS
//the real order is Green, Red, blue
fullBatteryADC = 1023 * (fullBatteryVOLTAGE * VdivR2 / (VdivR2 + VdivR0)) / 5; //calculating full battery voltage in adc value
emptyBatteryADC = 1023 * (emptyBatteryVOLTAGE * VdivR2 / (VdivR2 + VdivR0)) / 5; //calculating empty battery voltage in adc value
//turning on actions.
readSensors();
mapVoltages (); //map voltages onto displays and prencntages
LEDRingDisplayVOLTAGE (); //displays voltages on LED ring
matrixDisplayPRECENT (); //display battery precentage on led matrix
firstOnTIME = millis(); //set ontime counter to zero
ringVoltageON = true; //indicate that the ring is on
powerButton.setDebounceTime(50); // set debounce time to 50 milliseconds
usbButton.setDebounceTime(50); // set debounce time to 50 milliseconds
wirelessButton.setDebounceTime(50); // set debounce time to 50 milliseconds
} //end void Setup
void loop() { //Main code OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
//Serial.println("New loop begin");
currentMillis = millis(); //set current time to miliseconds since started.
EVERY_N_MILLISECONDS(readSensorINTERVAL) { //fast LED lib timer, read sensors every (interval) second
readSensors();
interpretValues ();
}//end every (interval) sec actions
if(matrixShortON == true && currentMillis - matrixOnTIME > matrixOnDELAY){ //in matrix activated for a short time, turn it off
displayOff ();
matrixShortON = false;
}//end if matrix short on
idleTime = currentMillis - lastActiveTIME;
//Serial.print(idleTime);
if(powerOutputWATT >= idlePowerWATT || flashlightMode == true || chargingMode == true) {
//if powerbank power consumption is larger than idle power watt, or in charging or flashlight, reset auto off timer.
lastActiveTIME = millis(); //set last active time to current time.
} // end auto off sequence
if(idleTime >= idlePowerOFF) { //if powerbank is idle for longer than idle power off seconds, SHUT DOWN
Serial.println("time out power off");
lineOneTEXT = ("TIME");
lineTwoTEXT = ("OUT");
matrix.fillScreen(LOW);
matrix.write();
matrix.setCursor(0,5);
matrix.print(lineOneTEXT);
matrix.write();
delay(800);
matrix.setCursor(0,5);
matrix.fillScreen(LOW);
matrix.write();
matrix.print(lineTwoTEXT);
matrix.write();
delay(800);
powerOff ();
} //end if idle power off
powerButton.loop(); // loop for buttons (constantly detecting state)
usbButton.loop();
wirelessButton.loop();
if (powerButton.isPressed()){ //begin power button pressed actions
powerTimePRESSED = millis();
} //end if usb is pressed
if(powerButton.isReleased()){
powerTimeRELEASED = millis();
powerTimeHOLD = powerTimeRELEASED - powerTimePRESSED;
if(powerTimeHOLD <= shortPressDURATION){
if(flashlightMode == false && matrixShortON == false) { //if flashlight mode is false, display voltages on matrix
mapVoltages ();
matrixDisplayPRECENT (); //display battery precentage on led matrix
matrixOnTIME = millis(); //reset matrix on timer
matrixShortON = true;
}//end if flashlight mode false short press actions
if(flashlightMode == true) { //if flashlightmode is true, switch mode
ledMode++;
if (ledMode > NUM_MODES){
ledMode=0;
}
}//end if flashlight mode true short press actions
}//end power button pressed actions
if(powerTimeHOLD > shortPressDURATION && powerTimeHOLD <= longPressDURATION && turnOnFINISHED == true){
if(flashlightMode == false){
flashlightMode = true;
} //end if
else{
ledRingOFF (); //turn ring off
flashlightMode = false;
} //end flashlight mode flip flop
}//end power long press actions
}//end power button pressed trigger actions
int powerButtonSTATE = powerButton.getState();
int powerHoldTIME = currentMillis - powerTimePRESSED;
if (powerButtonSTATE == 0 && powerHoldTIME >= powerOffDURATION){ // if power button is held for longer than x mili sec, POWER OFF
Serial.print("POWERING OFFFFFFFFFFFFFFFFFFF");
powerOff ();
} //end all power button actions
if (usbButton.isPressed()){ //begin usb button pressed actions
usbTimePRESSED = millis();
} //end if usb is pressed
if(usbButton.isReleased()){
usbTimeRELEASED = millis();
usbTimeHOLD = usbTimeRELEASED - usbTimePRESSED;
if(usbTimeHOLD <= shortPressDURATION){
if(flashlightMode == true ) {
if(flashlightBrightness <= 220) {
flashlightBrightness = flashlightBrightness + 30;
}
}//end if flashlight mode is on short press usb actions
if(flashlightMode == false) {
if(usbQcON == false){
usbQcON = true;
}
else{
usbQcON = false;
} //end usb qc flip flop
}
}//end all short press actions
if(usbTimeHOLD > shortPressDURATION && usbTimeHOLD <= longPressDURATION){
}
}//end usb button pressed trigger actions
if (wirelessButton.isPressed()){ //begin wireless button actions
wirelessTimePRESSED = millis();
} //end if usb is pressed
if(wirelessButton.isReleased()){
wirelessTimeRELEASED = millis();
wirelessTimeHOLD = wirelessTimeRELEASED - wirelessTimePRESSED;
if(wirelessTimeHOLD <= shortPressDURATION){
if(flashlightMode == true ) {
if( flashlightBrightness >= 30) {
flashlightBrightness = flashlightBrightness - 30;
}
}//end if flashlight mode is on short press wireless actions
if(flashlightMode == false) {
if(wirelessOn == false){
wirelessOn = true;
}
else{
wirelessOn = false;
} //end wireless module flip flop
}
}//end all short press wireless button actions
if(wirelessTimeHOLD > shortPressDURATION && wirelessTimeHOLD <= longPressDURATION){
if(moduleOn == false && moduleConnect == true){
moduleOn = true;
}
else{
moduleOn = false;
} //end extermal module flip flop
}
}//end wireless button pressed trigger actions
if (wirelessOn == true && inWirelessMODE == false){ //Wireless on actions (once)
lineOneTEXT = ("ON");
lineTwoTEXT = ("WIR");
lastDisplayTEXT = millis ();
digitalWrite(wirelessPin,HIGH);
inWirelessMODE = true;
} //end Pd on actions
if (wirelessOn == false && inWirelessMODE == true){ //Wireless off actions (once)
lineOneTEXT = ("OFF");
lineTwoTEXT = ("WIR");
lastDisplayTEXT = millis ();
digitalWrite(wirelessPin,LOW);
ledRingOFF ();
inWirelessMODE = false;
} //end Qc on actions
if (inWirelessMODE == true){ //breath blue led while charging
fill_solid( &(leds[0]), 24 /*number of leds*/, CRGB( 30, 0, 255) );
float breath = (exp(sin(millis()/2000.0*PI)) - 0.36787944)*5.0;
FastLED.setBrightness(breath);
FastLED.show();
}//end in wireless mode breathe blue led
if (usbQcON == true && inQcMODE == false){ //Qc on actions (once)
lineOneTEXT = ("ON");
lineTwoTEXT = ("USB");
lastDisplayTEXT = millis ();
digitalWrite(usbOnPIN,HIGH);
inQcMODE = true;
} //end Pd on actions
if (usbQcON == false && inQcMODE == true){ //Qc off actions (once)
lineOneTEXT = ("OFF");
lineTwoTEXT = ("USB");
lastDisplayTEXT = millis ();
digitalWrite(usbOnPIN,LOW);
inQcMODE = false;
} //end Qc on actions
if (moduleOn == true && inModuleMODE == false){ //module on actions (once)
lineOneTEXT = ("ON");
lineTwoTEXT = ("EXTR");
lastDisplayTEXT = millis ();
digitalWrite(modulePin,HIGH);
inModuleMODE = true;
} //end module on actions
if (moduleOn == false && inModuleMODE == true){ //module off actions (once)
lineOneTEXT = ("OFF");
lineTwoTEXT = ("EXTR");
lastDisplayTEXT = millis ();
digitalWrite(modulePin,LOW);
inModuleMODE = false;
} //end module on actions
if(moduleOn == true || usbQcON == true || wirelessOn == true) { //display battery percentage periodocally
if (currentMillis - lastDisplayTEXT > 2100) {
timeSinceUPDATE = millis();
if(timeSinceUPDATE - lastUpdateTIME >= voltageUpdateTIME) {
mapVoltages (); //map voltages onto displays and prencntages
displayOff();
matrixDisplayPRECENT (); //display battery percent
lastUpdateTIME = timeSinceUPDATE; //resetting the update timer
}
}//end update charging status screens
}//end display voltages
if(turnOnFINISHED == true){
if (currentMillis - lastDisplayTEXT <= 2000){ //display texts for two seconds
displayTexts();
}//end display texts
if (currentMillis - lastDisplayTEXT > 2000 && currentMillis - lastDisplayTEXT < 2100){
displayOff ();
}//end display texts
}
if (ringVoltageON == true && currentMillis - firstOnTIME >= 3000) { //after interval, turn off all LEDs and display
LEDFadeBLACK ();
displayOff ();
turnOnFINISHED = true;
ringVoltageON = false;
}//end LEDs fading to black.
if(currentMillis - lastInputVOLTAGEhigh > 3500) {
inputVoltageLOW = true;
}//end latching input voltage
if(inputVoltage > 10){
lastInputVOLTAGEhigh = currentMillis;
inputVoltageLOW = false;
}
if(chargingMode == true){ //action to do when input voltage is in range
inChargingMODE = true; //indicate that charging mode state;
for(int k = 0; k < 1; k++) {
LEDRingDisplayVOLTAGE ();
}//end initial voltage display
lastChargeCURRENT = millis();
timeSinceUPDATE = millis();
timeSinceFLASH = millis();
if(timeSinceUPDATE - lastUpdateTIME >= voltageUpdateTIME) {
mapVoltages (); //map voltages onto displays and prencntages
displayOff();
matrixDisplayPRECENT (); //display battery percent
ledRingOFF ();
LEDS.setBrightness(LEDBrightness); // 0-255 value
fill_solid( &(leds[0]), numLEDsVOLT, CRGB( greenLEDsINTENSITY, 180, 0) );
FastLED.show();
lastUpdateTIME = timeSinceUPDATE; //resetting the update timer
}//end update charging status screens
if(timeSinceFLASH - lastFlashTIME >= chargingFlashTIME) {
if(chargeFlashLED == false) {
leds[numLEDsVOLT].setRGB( greenLEDsINTENSITY, 180, 0);
FastLED.show();
chargeFlashLED = true;
}
else {
leds[numLEDsVOLT] = CRGB::Black; //set led to black
FastLED.show();
chargeFlashLED = false;
}
lastFlashTIME = timeSinceFLASH; //resetting the Flash timer
}//end flash charging status LED
if(batteryTemp <= 40 && chargingTemp <= 55){ //if temps are low, use full charging speed
if(inputVoltage < 6){ //if voltage is less than 6V use charge using 10W
pot.setPot(10);
} //end first 10W charging mode
if(inputVoltage >= 6 && inputVoltage < 14){ //15W charging mode
pot.setPot(20);
} //end 15W charging mode
if(inputVoltage >= 14 && inputVoltage < 17){ //30W charging mode
pot.setPot(25);
} //end 30W charging mode
if(inputVoltage >= 17 && inputVoltage < 21){ //40W charging mode
pot.setPot(35);
} //end 40W charging mode
if(inputVoltage >= 21 && inputVoltage < 28){ //60W charging mode
pot.setPot(54);
} //end 60W charging mode
delay(10);
}//end normal charging mode
else{
pot.setPot(10);
} //end thermal throttle
if(chargingAmp > 0.2){
lastCurrentCHECK = lastChargeCURRENT;
Serial.println("LOW CHARG CURR");
}
if(lastChargeCURRENT - lastCurrentCHECK >= chargeCurrentCHECK){
chargeCurrentLOW = true;
Serial.println("low charging current trigger");
}
digitalWrite(relayPin, HIGH);
}//end if charging mode is on
if(chargingMode == false && inChargingMODE == true ) {
inChargingMODE = false;
LEDFadeBLACK ();
displayOff ();
pot.setPot(0); //set pot to x% of highest value
delay(50);
digitalWrite(relayPin, LOW);
}
if(batteryVoltage <= fullBatteryVOLTAGE){
chargeCurrentLOW = false;
//Serial.println("charge resert");
}
if (overCurrentPROTEC == true || overTempPROTEC == true || overVoltPROTEC == true || batteryFaultPROTEC == true) { //activate warninng LED if system exceedes nominal value
displayTexts ();
if (currentMillis - preMillisWARN >= 1500 && warnTimesLED <= 4) {
LEDS.setBrightness(20);
fill_solid( &(leds[0]), 24 /*number of leds*/, CRGB( 0, 255, 0) ); //fill all leds red.
FastLED.show();
delay (100);
ledRingOFF ();
Serial.print("OVER CURRENT text 1");
preMillisWARN = currentMillis;
warnTimesLED ++;
}//end for loop warning lights
}//end over current protection
if(flashlightMode == true){
switch (ledMode) {
case 0: coolWhite(); break;
case 1: warmWhite(); break;
case 2: pureRed(); break;
case 3: pureOrange(); break;
case 4: pureYellow(); break;
case 5: pureGreen(); break;
case 6: pureBlue(); break;
case 7: purePurple (); break;
case 8: rainbow (); break;
case 9: confetti (); break;
case 10: rainbowComet (); break;
}//end define led modes
EVERY_N_MILLISECONDS( 30 ) { gHue++; }
FastLED.show();
}//end if flashlight mode on
}//end void loop
void readSensors() { //OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
batteryTempRAW = inMux.read(4); //read overall powerbank power consumption
chargingTempRAW = inMux.read(6); // read module power consumptionn
caseTempRAW = inMux.read(5); //read USB & wireless charging power consumption
moduleTempRAW = inMux.read(7); //read battery temp raw
batteryVoltageRAW = inMux.read(0); //read charging circuit temp
inputVoltageRAW = inMux.read(3); //read battery voltage
powerbankAmpRAW = inMux.read(2); //read charging input voltage
chargingAmpRAW = inMux.read(1); //see if module 1 is connected
moduleConnectRAW = analogRead(A6); //read module connect status
//calculating amps in and out:
Voltage = (chargingAmpRAW / 1023.0) * 5000; // Gets mV for modules amps
chargingAmp = ((Voltage - ACSoffset) / mVperAmp20A);
Voltage = (powerbankAmpRAW / 1023.0) * 5000; // Gets mV for modules amps
powerbankAmp = ((Voltage - ACSoffset) / mVperAmp20A);
//calculating temperatures:
R2 = R1 * ((float)batteryTempRAW / (1023.0 - (float)batteryTempRAW)); //calculating battery temp
logR2 = log(R2);
batteryTemp = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));
batteryTemp = batteryTemp - 273.15;
R2 = R1 * ((float)chargingTempRAW / (1023.0 - (float)chargingTempRAW)); //calculating charging temp
logR2 = log(R2);
chargingTemp = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));
chargingTemp = chargingTemp - 273.15;
R2 = R1 * ((float)caseTempRAW / (1023.0 - (float)caseTempRAW)); //calculating case temperature
logR2 = log(R2);
caseTemp = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));
caseTemp = caseTemp - 273.15;
R2 = R1 * ((float)moduleTempRAW / (1023.0 - (float)moduleTempRAW)); //calculating case temperature
logR2 = log(R2);
moduleTemp = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));
moduleTemp = moduleTemp - 273.15;
//calculating voltages:
VinMv = (batteryVoltageRAW * 5.0) / 1023.0; //battery voltage calculation
batteryVoltage = VinMv / (VdivR2/(VdivR0+VdivR2));
VinMv = (inputVoltageRAW * 5.0) / 1023.0; //input voltage calculation
inputVoltage = VinMv / (VdivR2/(VdivR1+VdivR2));
if ( moduleConnectRAW > 700 ) { //compute module connected or not
moduleConnect = 1;
}
else {
moduleConnect = 0;
}
powerOutputWATT = (batteryVoltage * powerbankAmp); //calculating power output in watts
Serial.println(" ");
Serial.print("battery voltage = ");
Serial.println(batteryVoltage);
Serial.print("input voltage = ");
Serial.println(inputVoltage);
Serial.print("battery temp = ");
Serial.println(batteryTemp);
Serial.print("charging circuit temp = ");
Serial.println(chargingTemp);
Serial.print("output circuit temp = ");
Serial.println(caseTemp);
Serial.print("module temp = ");
Serial.println(moduleTemp);
Serial.print("module connect = ");
Serial.println(moduleConnect);
Serial.print("output current = ");
Serial.println(powerbankAmp);
Serial.print("chgarging current = ");
Serial.println(chargingAmp);
Serial.print("output power = ");
Serial.println(powerOutputWATT);
Serial.println(" ");
//delay(1000);
}//end Void Readsensors.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxx
void interpretValues () {
if (powerbankAmp > currentLimit) { //if powerbank exceeds current limit, trigger overcurrent protection
overCurrentPROTEC = true;
warnTimesLED = 0;
outputOff ();
lineOneTEXT = ("OVER");
lineTwoTEXT = ("POW");
lastDisplayTEXT = millis ();
displayTexts ();
} //end if over current protection
else {
overCurrentPROTEC = false;
}
if (batteryTemp > 52 || caseTemp > 65 || chargingTemp > 66 || moduleTemp > 65) { //if these temperatures (in degrees C) are exceded, trigger over temp protection
outputOff ();
lineOneTEXT = ("OVER");
lineTwoTEXT = ("TEMP");
lastDisplayTEXT = millis ();
displayTexts ();
}//end if over temp protection
else{
overTempPROTEC = false;
}//end over general temp protection
if (batteryVoltage < minBatteryVOLTAGE || batteryVoltage > (maxBatteryVOLTAGE + 1)) { //if battery is under min voltage, trigger under voltage protection.
batteryFaultPROTEC = true;
outputOff ();
warnTimesLED = 0;
lineOneTEXT = ("BATT");
lineTwoTEXT = ("BAD");
displayTexts ();
}
else {
batteryFaultPROTEC = false;
}//end under voltage protection
if (batteryVoltage < emptyBatteryVOLTAGE && batteryVoltage > minBatteryVOLTAGE) { //low power shut off
outputOff ();
lineOneTEXT = ("LOW");
lineTwoTEXT = ("BATT");
matrix.fillScreen(LOW);
matrix.write();
matrix.setCursor(0,5);
matrix.print(lineOneTEXT);
matrix.write();
delay(800);
matrix.setCursor(0,5);
matrix.fillScreen(LOW);
matrix.write();
matrix.print(lineTwoTEXT);
matrix.write();
delay(800);
powerOff ();
} //end low voltage power off
if (inputVoltageLOW == false && inputVoltage < 28 && batteryFaultPROTEC == false && overTempPROTEC == false && chargeCurrentLOW == false ) { //if input voltage is over 4.5V, and if over 28V, dont charge to protect electronics
chargingMode = true;
}
else{
chargingMode = false;
}
//end if enter charging mode
if(moduleTemp > 60) { //if module temp is grater than x, turn it off
moduleOn = false;
digitalWrite(modulePin,LOW);
}//end module over heat
int higherTemp = max(caseTemp,chargingTemp); //takes the higher temperature value of the two sensors
//Serial.println(higherTemp);
if (fanOn == false && higherTemp > 42){ //if temperature is lower than fanOnTEMP, turn off fan
digitalWrite (fanPin, HIGH);
fanOn = true;
}
if (fanOn == true && higherTemp < 37){ //if temperature is lower than fanOnTEMP, turn off fan
digitalWrite (fanPin, LOW);
fanOn = false;
}//end fan on or off control
} //end interpret values XXXXXXXXXXXXXXXX
void displayTexts (){ //display two line texts for warning, status and power off/on
if(currentMillis - lastTextON > textDelay){
lastTextON = millis();
if(line1 == false){
line1 = true;
matrix.fillScreen(LOW);
matrix.write();
matrix.setCursor(0,5);
matrix.print(lineTwoTEXT);
matrix.write();
}
else{
matrix.setCursor(0,5);
matrix.fillScreen(LOW);
matrix.write();
matrix.print(lineOneTEXT);
matrix.write();
line1 = false;
displayTextCYCLE++;
}//end else
}
}//end matrix display texts
void LEDFadeBLACK () {
Serial.println("turning off leds");
for (int fadeValue = LEDBrightness; fadeValue >= 1; fadeValue --) {
LEDS.setBrightness(fadeValue);
FastLED.show();
//fadeValue --;
delay(20);
} //end reduceing value
ringVoltageON = false;
ledRingOFF ();
}//end LED fade balck
void mapVoltages () { //map voltages onto display value OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo
int ADCbatteryV = batteryVoltageRAW; //batteryVoltageRAW goes here
if( ADCbatteryV >= fullBatteryADC ) {
ADCbatteryV = fullBatteryADC;
}
if( ADCbatteryV <= emptyBatteryADC ) {
ADCbatteryV = emptyBatteryADC;
}
greenLEDsINTENSITY = map(ADCbatteryV, emptyBatteryADC, fullBatteryADC, 0, 255); //maps battery voltage to LED color, lower voltage, more red. Higher voltage, more green
numLEDsVOLT = map(ADCbatteryV, emptyBatteryADC, fullBatteryADC, 0, NUM_LEDS); //maps battery voltage to number of leds, higher voltage, more LEDs lit.
batteryPercentage = map(ADCbatteryV, emptyBatteryADC, fullBatteryADC, 0, 100); //maps battery voltage to a precentage number (0-100%)
}//end map Voltages
void LEDRingDisplayVOLTAGE () { //LED ring display voltage OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
//Serial.println(numLEDsVOLT);
LEDS.setBrightness(LEDBrightness); // 0-255 value
for(int i = 0; i <= numLEDsVOLT; i++) {
// Set the i'th led to red
leds[i] = CRGB(greenLEDsINTENSITY, 180, 0);
// Show the leds
FastLED.show();
delay(30);
} //end for loop led
} //end void LEDRingDisplayVOLTAGE
void matrixDisplayPRECENT () { //displays battery precentage onto matrix OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
matrix.setIntensity(1); // Use a value between 0 and 7 for brightness
matrix.setRotation(1);
matrix.setMirror(true); // set X-mirror true when using the WeMOS D1 mini Matrix LED Shield (X0=Seg1/R1, Y0=GRD1/C1)
matrix.setFont(&Picopixel);
if(batteryPercentage < 10) { //center screen if less than 10%
matrix.setCursor(5,5);
}//end if
if(batteryPercentage >= 10 && batteryPercentage < 100) { //center screen if between 10 and 100 percent
matrix.setCursor(3,5);
}//end if
if(batteryPercentage == 100) { //center screen if 100 percent
matrix.setCursor(1,5);
}//end if
matrix.print(batteryPercentage);
matrix.println("%");
matrix.write();
matrixVoltageON = true;
} //end matrixDisplayPRECENT;
//BEGIN LED modes in flashlightmode ----------------------------
void coolWhite () {
FastLED.setBrightness(flashlightBrightness); //set led to flashlight brightness.
fill_solid( &(leds[0]), 24 /*number of leds*/, CRGB( 255, 255, 255) ); //fill all leds cool white
}//end cool white set code
void warmWhite () { //warm white led mode
FastLED.setBrightness(flashlightBrightness); //set led to flashlight brightness.
fill_solid( &(leds[0]), 24 /*number of leds*/, CRGB( 200, 255, 30) ); //fill all leds warm white
}//end warm white set code
void pureRed () {
FastLED.setBrightness(flashlightBrightness); //set led to flashlight brightness.
fill_solid( &(leds[0]), 24 /*number of leds*/, CRGB( 0, 255, 0) ); //fill all leds red
}//end pure red set code
void pureOrange () {
FastLED.setBrightness(flashlightBrightness); //set led to flashlight brightness.
fill_solid( &(leds[0]), 24 /*number of leds*/, CRGB( 30, 255, 0) ); //fill all leds orange color
}//end pure orange set code
void pureYellow () {
FastLED.setBrightness(flashlightBrightness); //set led to flashlight brightness.
fill_solid( &(leds[0]), 24 /*number of leds*/, CRGB( 110, 255, 0) ); //fill all leds yellow color
}//end pure yellow set code
void pureGreen () {
FastLED.setBrightness(flashlightBrightness); //set led to flashlight brightness.
fill_solid( &(leds[0]), 24 /*number of leds*/, CRGB( 255, 0, 0) ); //fill all leds green
}//end pure green set code
void pureBlue () {
FastLED.setBrightness(flashlightBrightness); //set led to flashlight brightness.
fill_solid( &(leds[0]), 24 /*number of leds*/, CRGB( 0, 0, 255) ); //fill all leds warm blue
}//end pureBlue set code
void purePurple () {
FastLED.setBrightness(flashlightBrightness); //set led to flashlight brightness.
fill_solid( &(leds[0]), 24 /*number of leds*/, CRGB( 0, 255, 170) ); //fill all leds purple
}//end purple set code
void rainbow() {
// FastLED's built-in rainbow generator
FastLED.setBrightness(flashlightBrightness); //set led to flashlight brightness.
fill_rainbow( leds, NUM_LEDS, gHue, 3);
}//end rainbow mode
void confetti() { // random colored speckles that blink in and fade smoothly
FastLED.setBrightness(flashlightBrightness); //set led to flashlight brightness.
fadeToBlackBy( leds, NUM_LEDS, 10);
int pos = random16(NUM_LEDS);
leds[pos] += CHSV( gHue + random8(64), 200, 255);
}//end confetti
void rainbowComet() { // a colored dot sweeping back and forth, with fading trails
FastLED.setBrightness(flashlightBrightness); //set led to flashlight brightness.
fadeToBlackBy( leds, NUM_LEDS, 20);
int pos = beatsin16( 13, 0, NUM_LEDS-1 );
leds[pos] += CHSV( gHue, 255, 192);
} //end rainbowComet
//end flashlight Modes
void displayOff () {
Serial.print("display off");
matrix.fillScreen(LOW);
matrix.write();
} //end turning led display off
void ledRingOFF () {
Serial.print("Led ring off");
FastLED.clear(); // clear all pixel data
FastLED.show(); //this refeshes the led display data
}
void outputOff () {
Serial.print("Output off");
flashlightMode = false;
ledRingOFF ();
usbQcON = false;
moduleOn = false;
wirelessOn = false;
digitalWrite(usbOnPIN,LOW);
digitalWrite(modulePin,LOW);
digitalWrite(wirelessPin,LOW);
} //end turing modules off actions
void powerOff () {
Serial.print("Powering OFF");
flashlightMode = false;
outputOff();
displayOff();
lineOneTEXT = ("Powr");
lineTwoTEXT = ("OFF");
matrix.fillScreen(LOW);
matrix.write();
matrix.setCursor(0,5);
matrix.print(lineOneTEXT);
matrix.write();
delay(800);
matrix.setCursor(0,5);
matrix.fillScreen(LOW);
matrix.write();
matrix.print(lineTwoTEXT);
matrix.write();
delay(800);
digitalWrite(powerPin,LOW);
} //end poweroff actionsAnd this project is sponsored jlcpcb.com
- Support on my patreon pgaes
- And also donet me
- paytm,
- Gpay,
- phonepa,
- Using this number ......7091621107
Follow 🔙 me on facebook 📖 Rohit kumar
For thanks and support. Help me to inprove my projects and skills.
Thnaks for visiting my pages .
Thanks for visit my website❤❤❤
Thanks ❤🌹🙏❤🌹🙏.
