Batterilader projekt til opladning af 8 x 1.2v celler batteripakke styret af arduino
Arduino kode
int batsense = 0; //Indgang til batteri måling
int powerout = 5; //lade regulering 0 fuld 5 off
int lader = 4; //indikator at der lades
int ladeslut = 6; //indikator at ladning er slut
int ladetimeout = 18000; // hvor mange sekunder må der max lades
int tidgaaet = 0; //hvor langtid har vi ladet
int batvolt = 0; // Hvad er spændingen:
int batvolt2 =0; //mellemregnings tal
int batvoltlast = 0; // Hvad var spændingen sidst:
int batvoltcount = 0; // hvor mange gange er den ikke steget:
int maxbatvolt = 630; //maximal spænding på batterierne
int minbatvolt = 328; //minimum spænding på batterierne
int timeoutstop = 0; // flag for max tid for ladning
int voltstop = 0; //Flag for max splænding tilladt
int fuld = 0; // flag for normal opladning slut
int tiddelay = 1000; // 1 sek
int stabilbat = 10; //hvor mange sekunder skal batterispændinge være stabil eller faldende
float batterivoltfaktor = 0.0233463035;
int debugstate = 0;
int deltaller = 0;
int akkuvolt = 0;
void setup() {
// put your setup code here, to run once:
pinMode(powerout, OUTPUT);
pinMode(lader, OUTPUT);
pinMode(ladeslut, OUTPUT);
Serial.begin(9600);
digitalWrite(powerout, HIGH);
digitalWrite(lader, LOW);
digitalWrite(ladeslut, LOW);
analogReference(INTERNAL);
delay(3000);
}
void loop() {
batvolt = analogRead(batsense);
if (debugstate == 1) {
Serial.println(batvolt);
}
while (batvolt < 100) { //blink indtil der tilsluttes et batteri
batvolt = analogRead(batsense);
digitalWrite(lader, LOW);
delay(1000);
digitalWrite(ladeslut, HIGH);
delay(2);
digitalWrite(ladeslut, LOW);
fuld = 0;
timeoutstop = 0;
voltstop = 0;
tidgaaet = 0;
batvoltcount = 0;
if (debugstate == 1) {
Serial.println(batvolt);
}
}
if ((timeoutstop == 0) and (voltstop == 0) and (fuld == 0)) { // alt ok start ladning
digitalWrite(powerout, LOW);
digitalWrite(lader, HIGH);
digitalWrite(ladeslut, LOW);
}
akkuvolt += batvolt;
deltaller += 1;
if (deltaller == 10) {
batvolt2 = akkuvolt / 10;
deltaller = 0;
akkuvolt=0;
Serial.println(batvolt2);
Serial.println(batvoltcount+480);
if (batvolt2 > batvoltlast) { batvoltcount = 0; } else { if (batvolt2 <= batvoltlast) { batvoltcount += 1; } } batvoltlast = batvolt2;
}
if (batvoltcount >= stabilbat) { // har spændinge være stabil eller faldende i 10 minutter, må vi være færdige
fuld = 1;
if (debugstate == 1) {
Serial.println("Ladning er slut");
}
digitalWrite(powerout, HIGH);
digitalWrite(lader, LOW);
digitalWrite(ladeslut, HIGH);
while (batvolt > minbatvolt) {
batvolt = analogRead(batsense); if (batvolt < minbatvolt) { fuld = 0; batvoltcount = 0; digitalWrite(ladeslut, LOW); } }
}
if (batvolt >= maxbatvolt) { //maximal spænding på batterierne, sluk
voltstop = 1;
if (debugstate == 1) {
Serial.println("Maxspaending");
}
digitalWrite(powerout, HIGH);
while (batvolt > minbatvolt) { //blink indtil batterier bliver fjernet
delay(1000);
digitalWrite(lader, LOW);
digitalWrite(ladeslut, HIGH);
delay(1000);
digitalWrite(lader, HIGH);
digitalWrite(ladeslut, LOW);
batvolt = analogRead(batsense);
if (debugstate == 1) {
Serial.print("Batteri spaending: ");
Serial.println(batvolt * batterivoltfaktor);
}
if (batvolt < minbatvolt) {
voltstop = 0;
}
}
}
if (tidgaaet > ladetimeout) { // Nu har det taget for lang tid at lade batterierne, sluk
timeoutstop = 1;
if (debugstate == 1) {
Serial.println("Timeout");
}
digitalWrite(powerout, HIGH);
while (batvolt > minbatvolt) { //blink indtil batterier bliver fjernet
delay(1000);
digitalWrite(lader, LOW);
delay(1000);
digitalWrite(lader, HIGH);
batvolt = analogRead(batsense);
if (batvolt < minbatvolt) {
timeoutstop = 0;
tidgaaet = 0;
}
}
}
delay(tiddelay);
tidgaaet += 1;
if (debugstate == 1) {
Serial.print("Ladetid: ");
Serial.println(tidgaaet);
Serial.print("Batteri spaending:");
Serial.println(batvolt * batterivoltfaktor);
Serial.println(batvoltcount);
Serial.println(batvolt);
}
}
