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); } }