Some of you know, I really like lithium ion batteries
*shocked*
Shut it! This is a short post, I don’t need you hamming up the works.
Just wait till I show up in your videos….
You wouldn’t….
Hello….
Oh hell…..
Ok, lets not worry about that now.
I picked up a pretty sweet haul of batteries this week.
22lbs. I counted 107 2cell packs. 214 cells to check out. This is great, but I have a single opus charger that can do 4 cells at a time.
So 214 cells will take some time to process. I have done that game. So I wanted to do more cells. There are examples online of doing this with arduino’s and what not and since I am big fan of arduino’s anyways I decided to give that a shot. I built it out initially with an arduino uno. Using the awesome guidance of Adam Welch. If you don’t know who Adam is, you gotta check out his work.
Website: http://adamwelch.co.uk/
Youtube: https://www.youtube.com/channel/UCm5sG3-BXQZfVy3st2T_XKg
His work I used for this is here.
VIDEO
I modified the code a little as I didn’t have that screen. I have a 20×4 screen. I also updated mine to calculate the voltage reference from the internal 1.1v reference.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
*/
* Battery Capacity Checker
* Uses Nokia 5110 Display
* Uses 1 Ohm power resister as shunt - Load can be any suitable resister or lamp
*
* YouTube Video : https : //www.youtube.com/embed/qtws6VSIoYk
*
* http : //AdamWelch.Uk
*
* Required Library - LCD5110_Graph . h - http : //www.rinkydinkelectronics.com/library.php?id=47
*/
#include <LiquidCrystal_I2C.h>
#define gatePin 2
#define highPin A0
#define lowPin A1
boolean finished = false ;
int interval = 5000 ; //Interval (ms) between measurements
float mAh = 0.0 ;
float shuntRes = 1.0 ; // In Ohms - Shunt resistor resistance
float current = 0.0 ;
float battVolt = 0.0 ;
float shuntVolt = 0.0 ;
float battLow = 2.9 ;
LiquidCrystal_I2C lcd ( 0x27 , 20 , 4 );
unsigned long previousMillis = 0 ;
unsigned long millisPassed = 0 ;
void setup () {
analogReference ( INTERNAL );
Serial . begin ( 115200 );
lcd . init (); //initialize the lcd
lcd . backlight (); //open the backlight
Serial . println ( "Battery Capacity Checker v1.1" );
Serial . println ( "battVolt current mAh" );
pinMode ( gatePin , OUTPUT );
digitalWrite ( gatePin , LOW );
lcd . setContrast ( 68 );
lcd . clear ();
lcd . print ( "Battery" );
lcd . print ( "Check" );
lcd . print ( "Please Wait" );
lcd . print ( "AdamWelch.Uk" );
delay ( 2000 );
lcd . clear ();
}
void loop () {
voltRef = readVcc () / 1024.0 ;
Serial . print ( "Volt Ref: " );
Serial . println ( voltRef );
battVolt = analogRead ( highPin ) * voltRef / 1024.0 ;
Serial . print ( "Batt Vol: " );
Serial . println ( battVolt );
shuntVolt = analogRead ( lowPin ) * voltRef / 1024.0 ;
Serial . print ( "Shunt Val: " );
Serial . println ( shuntVolt );
Serial . println ();
Serial . println ();
/*
Serial.print(battVolt);
Serial.print("\t");
Serial.print(current);
Serial.print("\t");
Serial.println(mAh);
*/
if ( battVolt & gt ; = battLow && finished == false )
{
digitalWrite ( gatePin , HIGH );
millisPassed = millis () - previousMillis ;
current = ( battVolt - shuntVolt ) / shuntRes ;
mAh = mAh + ( current * 1000.0 ) * ( millisPassed / 3600000.0 );
previousMillis = millis ();
lcd . setCursor ( 0 , 0 );
lcd . print ( "Discharge " );
lcd . setCursor ( 0 , 1 );
lcd . print ( "Volt:" );
lcd . print ( battVolt );
lcd . print ( "v " );
lcd . setCursor ( 0 , 2 );
lcd . print ( "Current:" );
lcd . print ( current );
lcd . print ( "a " );
lcd . setCursor ( 0 , 3 );
lcd . print ( mAh );
lcd . print ( "mAh " );
lcd . print ( "Running " );
}
if ( battVolt & lt ; battLow )
{
digitalWrite ( gatePin , LOW );
finished = true ;
lcd . clear ();
lcd . print ( "Discharge" );
lcd . print ( "Voltage:" );
lcd . print ( battVolt );
lcd . print ( "v" );
lcd . print ( mAh );
lcd . print ( "mAh" );
lcd . setCursor ( 0 , 1 );
lcd . print ( "Complete" );
}
delay ( interval );
}
long readVcc () {
long result ;
// Read 1.1V reference against AVcc
ADMUX = _BV ( REFS0 ) | _BV ( MUX3 ) | _BV ( MUX2 ) | _BV ( MUX1 );
delay ( 2 ); // Wait for Vref to settle
ADCSRA |= _BV ( ADSC ); // Convert
while ( bit_is_set ( ADCSRA , ADSC ));
result = ADCL ;
result |= ADCH & lt ; & lt ; 8 ;
result = 1126400L / result ; // Back-calculate AVcc in mV
return result ;
}
Next step is to add a “charging” function with a tp4056 so I can charge then discharge.
Amazon – 5 for 6.95
Ebay – 10 for 4.95
Aliexpress – 10 < 2 bucks.
Once that is working I should be able to add a couple more modules. I have been really looking towards doing something with Brett Wattys 8 module charger. That things is INTENSE!!!
If you want to see all the info check out the secondlifestorage forum.
https://secondlifestorage.com/t-Brett-s-Arduino-8x-Smart-Charger-Discharger
He also has a portal he is setting up to help aggregate some numbers on how many cells the community has recycled.
Until later!!!
bye!!!!
Comments