• No results found

5 Analys och diskussion

Genom att optimera livslängden av bly-syra batterier kan man minska miljöpåverkan på samhället eftersom att de varar längre. Detta resulterar i att färre batterier behöver tillverkas. Eftersom det förbrukas mycket energi och miljöfarligt material som bly och svavelsyra för att tillverka dessa batterier. Det största användningsområdet för bly är idag inom bly-syra batterier. Bly är en metall som är giftig för människor och andra organismer redan vid mycket låga doser [42]. Genom ett minskat användande av bly minskar även dess utsläpp.

En optimerad livslängd av batterier är inte bara gynnsamt för miljön utan det är även ekonomiskt lönsamt. Dessa batterier är dyra att köpa, så ju längre de kan hålla desto mer pengar sparar konsumenterna. Om livslängden av batterier fördubblas, kan kostnaderna för batterierna halveras.

Arbetets mål var att hitta en metod för att optimera livslängden för solcellsladdade bly-syra batterier och använda sig av tilläggstjänster såsom uppskattning av laddningsnivån. Övervakning av effekten från solcellen och effekten ut till lasten med hjälp av en mobilapplikation var ytterligare en tilläggstjänst som ingick. Målet med detta arbete uppnåddes med hjälp av en konstruerad prototyp som kunde ladda upp batteriet på ett optimalt sätt med hjälp av CC/CV metoden. Den kunde även bryta uppladdningen då det var fulladdat, samt beräkna den uppskattade laddningsnivån i batteriet.

Laddningsnivån i batteriet mättes med hjälp av metoden Extended voltmeter då vi ville kunna mäta och beräkna laddningsnivån utan att behöva koppla bort lasten eller låta batteriet stå och vila under en period på 24 timmar. Eftersom metoden inte kunde implementeras i systemet under urladdning på grund av batterispänningens potentialhöjning användes en variant av strömmätningsmetoden. Detta gav inte exakta resultat då det inte togs hänsyn till förluster.

Med tanke på att ingen av de beprövade metoderna ger ett exakt värde på laddningsnivån och vi beräknade utan hänsyn till förluster uppskattar vi att felet kan uppgå till mellan 6% och 8% då batterier laddas ur. Detta anser vi är acceptabelt då vissa av dagens mobiltelefoner och datorer kan ha liknande felmarginaler.

42

Vid beräkning av laddningsnivån med metoden Extended voltmeter var det viktigt att felet i spänningsmätningen var så litet som möjligt. Ett mätfel på över 100 mV kunde ge ett fel på över 10% av laddningsnivån. Genom att ta medelvärdet under en minut gick felet ner till 10mV som mest vilket vi anser är acceptabelt.

En mobilapplikation utvecklades som kunde visa effekten som solcellen genererade, effekten över lasten och den uppskattade laddningsnivån. Det implementerades även en tilläggsfunktion, där det skickades ett varningsmeddelande till applikationen då batteriets laddningsnivå understeg en viss procentuell nivå. Lasten kunde även brytas från mobilapplikationen för att undvika att batteriet djupurladdades.

Det är svårt att säga hur mycket ett batteris livslängd ökar då det ansluts med prototypen och inga tester för detta har utförts under arbetet. Anledningen till detta är att sådana tester är väldigt tidskrävande och dyra att utföra. Ett sådant test kräver att man testar prototypen på ett stort antal batterier och ett stort antal batterier utan prototypen ansluten för att det ska ge ett rättvist resultat. Därefter jämförs resultaten med varandra, för att se vilka batterier som håller längst och hur mycket längre de håller med prototypen.

Det finns dock studier som visar hur ett batteris livslängd ökar då det laddas upp på ett optimalt sätt, inte djupurladdas eller överladdas till skillnad från batterier som kontinuerligt laddas upp och djupurladdas. Studierna visar att batterier som laddas ur på ett optimalt sätt kan hålla mer än dubbelt så länge än batterier som kontinuerligt djupurladdas [8].

Mobilapplikationen som konstruerades för övervakning av batteriet tyckte vi var en bra funktion för systemet, då det kan vara bra att veta ett batteris laddningsnivå, samt intressant för användaren att se hur mycket effekt som genereras av solcellerna och hur stor effekt som lasten drar. Vi tyckte dock att det hade varit bättre lämpat med en LCD som visade denna information och en tryckknapp för att bryta lasten istället för mobilapplikationen. Anledningen till detta var att de flesta båtar inte har något WiFi som prototypen kan ansluta till och man brukar kanske inte befinna sig så långt från batteriet när man är ute med båten så att en applikation blir nödvändig. Då prototypen används vid till exempel ett hus eller en sommarstuga med WiFi så vore det bra att använda sig av mobilapplikationen istället för en skärm.

43

En stor del av arbetet har gått ut på att leta efter metoder som kan vara passande för att kontrollera uppladdningen och mäta laddningsnivån av batteriet. Olika metoder för detta har erhållits med hjälp av information från tidigare examensarbeten och vetenskapliga artiklar. Därefter analyserades ett flertal olika metoder för att kunna välja den metod som var mest passande för prototypen som konstruerades.

Vid uppladdning av batteriet användes metoden CC/CV, då den laddar batteriet på ett optimalt sätt. Genom att denna metod undviker att ladda batteriet med en skadlig hög ström i början och undviker att överladda batteriet då det är fulladdat. Vi valde att använda en IC från Texas Instruments som heter bq24450 eftersom den laddar batteriet med CC/CV metoden och den bryter även uppladdningen av batteriet då det är fulladdat. Kretsen var relativt billig att köpa, liten och enkel att implementera med den övriga kretsen.

Om vi hade haft mer tid skulle vi även undersöka metoden MPPT närmare. På pappret verkar det vara en effektiv metod för uppladdning, dock verkar den främst användas för större system. Vi har även läst att det kan vara svårt att implementera denna metod så att det fungerar som det ska. Av den anledningen valdes metoden bort för denna prototyp.

Den konstruerade prototypen visade sig fungera bra även i praktiken och klarade av att utföra de funktioner som planerat för att optimera livslängden av bly-syra batterier. Denna prototyp är något som skulle kunna vidareutvecklas och bli en attraktiv produkt på marknaden.

Beroende på vilken storlek det är på batteriet som ska regleras kan det komma att bli nödvändigt att variera storlekarna på transistorn och shuntresistorn i kretsen. Det kan på grund av det komma att bli nödvändigt att producera olika produkter för olika storlekar på batterierna som ska regleras. Detta kan vara en mindre lukrativ lösning om man vill ta denna produkt till produktion, då det ofta är billigare att producera och marknadsföra en produkt istället för flera. Det skulle dock vara väldigt liknande produkter som är uppbyggda på samma sätt utöver transistorerna och shuntresistorerna. Det var från början tänkt att man skulle kunna knappa in storleken på batteriet i applikationen och att prototypen skulle kunna ta fram en gräns för när lasten bör brytas. Detta valdes att inte göras då det visade sig vara nödvändigt att byta ut vissa komponenter i kretsen beroende på storleken av batteriet.

44

Det finns produkter att köpa som kan kan reglera uppladdningen av batterier på ett optimalt sätt då de matas från en solpanel. Det finns produkter som kan mäta ett batteris laddningsnivå. Det finns även produkter som kan göra både och, men så vitt vi vet så visar dessa produkter inte laddningsnivån med samma noggrannhet som den framtagna prototypen. Dessa produkter visar laddningsnivån i 25% intervaller, villket gör att de inte är anpassningsbara för olika batterier som har olika gränser för säker djupurladdning.

Produkterna som finns att köpa för att erhålla den data som vår produkt kan erhålla är ofta dyra att köpa. Det finns även möjlighet till att reducera priset av prototypen genom att byta ut vissa komponenter till billigare och mer energisnåla alternativ. Om man köper in större mängder av komponenter kan man även få mängdrabatter på många av komponenterna och på det sättet reducera priset av produkten ytterligare. Detta skulle göra det möjligt att sälja produkten för ett lägre pris än andra produkter på marknaden som kan utföra samma ändamål och fortfarande gå med vinst. En sådan produkt skulle vara ekonomiskt realiserbar, genom att konsumenterna kan spara pengar genom att använda sig av produkten. Ett lämpligt batteri för dessa ändamål brukar kosta mellan 3000-5000 sek och om batteriets livslängd fördubblas kan konsumenten spara mellan 1500-2500 per batteri. Genom att de inte behöver köpa nya batterier lika ofta.

45

6 Slutsats

Målet med arbetet var att finna en metod för att optimera livslängden av ett bly- syra batteri. Detta målet uppnåddes med hjälp av en konstruerad prototyp som konfigurerades så att den kunde ladda upp batteriet på ett optimalt sätt, bryta uppladdningen då det var fulladdat och ge användaren möjligheten att bryta lasten så att batteriet inte laddades ur för mycket. Detta leder i sin tur till en optimerad livslängd för bly-syra batteriet och en minskad miljöpåverkan på samhället. Det gynnar miljön genom att det minskar blyutsläpp och energiförbrukning eftersom det inte behöver tillverkas lika många batterier. Prototypen visade sig fungera väl och något som skulle kunna vidareutvecklas till att bli en attraktiv produkt på marknaden. Ett annat mål var att produkten skulle vara ekonomiskt realiserbar. Ett batteris livslängd kan fördubblas genom att det laddas och urladdas på ett optimalt sätt jämfört med när det laddas ur helt. Detta kan resultera i att konsumenternas batterikostnader halveras då de använder prototypen.

47

Referenser

[1] Energimyndigheten. Solceller [internet]. Stockholm: Energimyndigheten; 2015 [uppdaterad 2018-01-08; hämtad 2018-03-23]. Hämtad från:

http://www.energimyndigheten.se/fornybart/solenergi/solceller/

[2] Exide. Så säkrar du livslängd och prestanda: Exide ger dig batterikoll i husbilen och husvagnen i sommar [internet]. Georgia, US: Exide; 2017 [uppdaterad 2017- 07-13; hämtad 2018-03-23]. Hämtad från:

http://news.cision.com/se/exide-technologies/r/sa-sakrar-du-livslangd-och-

prestanda--exide-ger-dig-batterikoll-i-husbilen-och-husvagnen-i-sommar,c2306899 [3] Power-sonic. Sealed Lead-Acid Batteries Technical Manual [internet]. San Diego: Power-sonic; c 2009 [c 2009; hämtad 2018-03-24]. Hämtad från: http://www.power-

sonic.com/images/powersonic/technical/1277751263_20100627-TechManual- Lo.pdf

[4] FIAMM-GS. Technical Handbook Valve-Regulated Lead-Acid Batteries [internet]. Vicenza: FIAMM-GS; okänt år [okänt år; 2018-03-24]. Hämtad från: www.laboe.at/fileadmin/content/downloads/Handbuecher/handbook.pdf [5] redaktörerna av Encyclopaedia Britannica. Electrolyte [internet]. Chicago, IL:

Encyclopaedia Britannica; 1998 [uppdaterad 2017-06-07; hämtad 2018-03-25]. Hämtad från: https://www.britannica.com/science/electrolyte

[6] Progressive dynamics. Battery Basics [internet]. Michigan, US: Progressive Dynamics; c 2018 [c 2018; hämtad 2018-03-24]. Hämtad från:

https://www.progressivedyn.com/service/battery-basics/

[7] Battery University. Sulfation and How to Prevent it [internet]. Vancouver: Battery University; 2012 [uppdaterad 2016-09-22; hämtad 2018-03-25]. Hämtad från:

http://batteryuniversity.com/learn/article/sulfation_and_how_to_prevent_it

[8] Battery University. How does the Lead Acid Battery Work [internet]. Vancouver: Battery University; 2011 [uppdaterad 2016-04-15; hämtad 2018-03-25]. Hämtad från:

http://batteryuniversity.com/learn/article/lead_based_batteries

[9] Battery University. What does Elevated Self-discharge Do [internet].

Vancouver: Battery University; 2011 [uppdaterad 2017-04-04; hämtad 2018-03- 25]. Hämtad från:

48

[10] Battery University. Absorbent Glass Mat (AGM) [internet]. Vancouver: Battery University; 2012 [uppdaterad 2017-10-11; hämtad 2018-03-25]. Hämtad från: http://batteryuniversity.com/learn/article/absorbent_glass_mat_agm

[11] Battery University. Gel Lead Acid Battery [internet]. Vancouver: Battery University; 2017 [uppdaterad 2017-10-11; hämtad 2018-03-25]. Hämtad från: http://batteryuniversity.com/learn/article/bu_201b_gel_lead_acid_battery [12] LEONICS. Basics of MPPT Solar Charge Controller [internet]. Bangkok: LEONICS; c 2009 [c 2009; hämtad 2018-03-28]. Hämtad från:

http://www.leonics.com/support/article2_14j/articles2_14j_en.php

[13] Battery University. Charging with Solar, Turbine [internet]. Vancouver: Battery University; 2011 [uppdaterad 2017-09-19; hämtad 2018-03-25]. Hämtad från: http://batteryuniversity.com/learn/article/charging_with_solar_and_turbine [14] Hua C, Lin M. A Study of Charging Control of Lead-Acid Battery for Electric Vehicles [internet]. Cholula; 2002 [hämtad 2018-03-20]. Hämtad från:

https://ieeexplore.ieee.org/document/930500/

[15] Texas Instruments. INTEGRATEDCHARGECONTROLLERFORLEAD- ACIDBATTERIES [internet]. Dallas: Texas Instruments; c 2009-2013 [c 2009- 2013; hämtad 2018-03-25]. Hämtad från:

http://www.ti.com/lit/ds/symlink/bq24450.pdf

[16] Analog Devices. Understanding How a Voltage Regulator Works [internet]. Norwood:Analog Devices; c 1995-2018 [c 1995-2018; hämtad 2018-03-25]. Hämtad från:

http://www.analog.com/en/technical-articles/how-voltage-regulator-works.html [17] EETimes. Signal Chain Basics (Part 19): Exploring and understanding linear voltage regulators [internet]. London: ASPENCORE; 2008 [uppdaterad 2008-08-2; hämtad 2018-03-25]. Hämtad från:

https://www.eetimes.com/document.asp?doc_id=1272466

[18] Electronics Tutorials. How to measure State-of-charge [internet]. London: ASPENCORE; 2016 [okänt; hämtad 2018-03-25]. Hämtad från:

https://www.electronics-tutorials.ws/power/switch-mode-power-supply.html [19] Santhanapoongodi R, Rajini V. A New State of Charge Estimation Algorithm for Lead Acid Battery [internet]. Chennai: IEEE; 2016 [hämtad 2018-03-20]. Hämtad från: https://ieeexplore.ieee.org/document/7557252/

[20] Piller S, Perrin M, Jossen A. Methods for state-of-charge determination and their applications [internet]. Elsevier Science; 2001. [Hämtad 2018-03-20]. Hämtad från:

49

[21] Battery University. How to measure State-of-charge [internet]. Vancouver: Battery University; 2011 [uppdaterad 2017-10-25; hämtad 2018-03-25]. Hämtad från:

http://batteryuniversity.com/learn/article/how_to_measure_state_of_charge

[22] redaktörerna av Encyclopaedia Britannica. Hydrometer [internet]. Chicago, IL: Encyclopaedia Britannica; 1998 [uppdaterad 2013-06-26; hämtad 2018-03-25]. Hämtad från:

https://www.britannica.com/technology/hydrometer

[23] ResistorGuide. shunt resistor [internet]. resistorguide.com: Resistor Guide; c 2018 [c 2018; hämtad 2018-03-25]. Hämtad från:

http://www.resistorguide.com/shunt-

resistor/#Position_of_the_shunt_in_the_circuit_for_current_measuring

[24] HowToMechatronics. What is Hall Effect and How Hall Effect Sensors Work [internet]. howtomechatronics.com: howtomechatronics.com; c 2018 [c 2018; hämtad 2018-03-25]. Hämtad från:

https://howtomechatronics.com/how-it-works/electrical-engineering/hall-effect-hall- effect-sensors-work/

[25] Ramsden. Hall-Effect Sensors. första upplagan. Burlington. Newnes. 2006 https://books.google.se/books?id=R8VAjMitH1QC&printsec=frontcover&redir_esc= y#v=onepage&q&f=false

[26] Gil Knier. How do Photovoltaics Work? [internet]. NASA.gov: NASA; 2008 [2008-08-06; hämtad 2018-04-03]. Hämtad från:

https://science.nasa.gov/science-news/science-at-nasa/2002/solarcells

[27] Soltronik. Solarkoffer 100 Watt mit Solarregler, 12 V Solarmodul, Camping Garten Wohnmobil Solaranlage [internet]. Soltronik.de: Soltronik; okänt [okänt; hämtad 2018-04-02]. Hämtad från:

https://www.soltronik.de/solarkoffer/solarkoffer-100-watt-mit-solarregler-12-v- solarmodul-camping-garten-wohnmobil-solaranlage.html

[28] Future Electronics. What is a microcontroller? [internet]. Quebec: Future Electronics; okänt [okänt; hämtad 2018-04-05]. Hämtad från:

http://www.futureelectronics.com/en/Microcontrollers/microcontrollers.aspx [29] Raspberry Pi Foundation. Raspberry Pi 3 MODEL B+ [internet]. UK: Raspberry Pi Foundation; okänt [okänt; hämtad 2018-04-05]. Hämtad från: https://www.raspberrypi.org/products/raspberry-pi-3-model-b-plus/

[30]Arduino. Arduino Mega 2560 Rev3 [internet]. Arduino.cc: Arduino; c 2018 [c 2018; hämtad 2018-04-05]. Hämtad från:

50

[31]ST. STM32F3Discovery [internet]. Arizona: STMicroelectronics; c 2018 [c 2018; hämtad 2018-04-05]. Hämtad från:

http://www.st.com/en/evaluation-tools/stm32f3discovery.html

[32] AI. ESP-12F WiFi Module [internet]. elecrow.com: AI; okänt [okänt; hämtad 2018-04-05]. Hämtad från:

https://www.elecrow.com/download/ESP-12F.pdf

[33] Sparkfun. WiFi Module - ESP8266 [internet]. Colorado: Sparkfun; 2015 [okänt; hämtad 2018-04-05]. Hämtad från:

https://www.sparkfun.com/products/13678

[34] Linus Walleij. Pin Control Sybsystem – Building Pins and GPIO from the ground up [internet]. Linaro Kernel Workgroup, ST-Ericsson: okänt; okänt [okänt; hämtad 2018-04-07]. Hämtad från:

https://elinux.org/images/b/b6/Pin_Control_Subsystem_Overview.pdf

[35] Instructables. MICRO SD CARD TUTORIAL [internet]. instructables.com. Autodesk: 2017 [ 2017-05-02; hämtad 2018-04-07]. Hämtad från:

http://www.instructables.com/id/Micro-SD-Card-Tutorial/

[36] ThingSpeak. Learn More About ThingSpeak [internet]. Natick, MA: MathWorks: c 2018 [c 2018; hämtad 2018-04-17]. Hämtad från:

https://thingspeak.com/pages/learn_more

[37] Massachusetts Institute of Technology. MIT App Inventor [internet].

Massachusetts Avenue: Massachusetts Institute of Technology; c 2012-2017 [c 2012-2017; hämtad 2018-04-17]. Hämtad från:

http://appinventor.mit.edu/explore/about-us.html

[38] Circuit Basics. Basics of UART Communication [internet]. circuitbasics.com: Circuit Basics; 2016 [2016; hämtad 2018-04-17]- Hämtad från:

http://www.circuitbasics.com/basics-uart-communication/

[39] Rouse M. What is daemon? - Definition from WhatIs.com [hemsida pa Internet]. SearchMicroservices. 2017 [Hamtad 2017-05-14]. Hämtad från:

http://searchmicroservices.techtarget.com/definition/daemon

[40] Rouse M. What is HTTP (Hypertext Transfer Protocol)? - Definition from WhatIs.com [hemsida pa Internet]. SearchWinDevelopment. 2017 [Hamtad 2017- 05-14]. Hämtad från:

51

[41]Sparkfun. ASC712 [internet]. Colorado: Sparkfun; 2015 [okänt; hämtad 2018-05-04]. Hämtad från:

https://www.sparkfun.com/datasheets/BreakoutBoards/0712.pdf

[42] Linderholm. Fakta om bly [internet]. Stockholm: Naturvårdsverket: 2018 [uppdaterad 2018-02-13; hämtad 2018-05-12]. Hämtad från:

https://www.naturvardsverket.se/Sa-mar-miljon/Manniska/Miljogifter/Metaller/Bly- Pb/

53

Bilaga 1

#include <Wire.h> #include <SoftwareSerial.h> #include <Timer.h> #define RX 10 #define TX 11 //---//

String AP = "Honor8"; // SSID

String PASS = "3c1da75161f6"; // PASSWORD //---Pin assignment---// const int CurrentRead1 = A3;//Current load side const int CurrentRead2 = A4;//Current source side const int VoltageRead1 = A8;//PV voltage

const int VoltageRead2 = A6;//Load voltage const int VoltageRead3 = A2;//Charging voltage //const int VoltageRead4 = A6;//BQ state

//---Measurment variables---// int RawValueI1 = 0; //Current raw value load side

int RawValueI2 = 0;//Current raw value source side int RawValueV1 = 0;//Voltage raw value PV

54

int RawValueV3 = 0;//Voltage raw value CHG voltage int mVperAmp = 100;

int ACSoffset = 2500;

double Amps1 = 0;//Current load side double Amps2 = 0; //Current source side float Voltage1 = 0; //PV voltage

float Voltage2 = 0; //Load Voltage float Voltage3 = 0; //CHG voltage int RelayPin = 4;//Digital pin for relay char input = 1;//Switching variabel float Pin;//Input power

float Pout;//Output power

//---SOC calc variables---// float SOC;//State of charge during charging

float DSOC;//State of charge during discharging float Vbat;//Battery voltage

float v1;//Lower voltage for SOC-algorithm float v2;//Upper voltage for SOC-algorithm int S1;//

int S2;

float C = 105.0;//Battery rated capacity

55

float LastSOC;//Previous SOC for discharge SOC calculation float DrawnAh;//Drawn Ah of average current

float LastAh;//Ah of previous SOC float NewAh; //---// Timer t; String transmit; String CIPSEND; SoftwareSerial esp8266(RX, TX); void setup() {

pinMode(CurrentRead1, INPUT);//load current pinMode(CurrentRead2, INPUT);//load current pinMode(VoltageRead1, INPUT);//PV voltage pinMode(VoltageRead2, INPUT);//Load voltage pinMode(VoltageRead3, INPUT);//CHG voltage pinMode(RelayPin, OUTPUT);//Relay

digitalWrite(RelayPin, LOW);//Relay off from start (Load NC) Serial.begin(9600);//open serial port

esp8266.begin(115200);//open software serial port

//---Establish connection with WiFi hotspot---// esp8266.println("AT\r\n");

56

esp8266.println("AT+CWJAP=\"" + AP + "\",\"" + PASS + "\r\n"); }

//----Extended voltmeter method charging table for 12V battery---// float ChgTbl[][5] = { {0, 2.625, 5.25, 10.5, 21.0}, {10, 11.7, 12.1, 12.4, 12.6}, {20, 12.3, 12.4, 12.6, 12.8}, {30, 12.5, 12.6, 12.8, 13.0}, {40, 12.6, 12.8, 13.0, 13.2}, {50, 12.7, 13.0, 13.1, 13.4}, {60, 12.8, 13.1, 13.2, 13.5}, {70, 12.9, 13.2, 13.4, 13.6}, {80, 13.0, 13.3, 13.6 , 14.0}, {90, 13.1, 13.6, 14.1, 15.4}, {100, 13.5, 14.1, 15.2, 16.0} };

//---Vectors for storing measurments---// float LoadCurrentVector[15] = {};

int index1 = 0;

float ChgCurrentVector[15] = {}; int index2 = 0;

57

int index3 = 0; int LoopCount = 0;

//---// void loop() {

ReadData;//Get App command and store in "Input" if (input == 49) {//Turn off relay if input is 1

digitalWrite(RelayPin, LOW); }

else if (input == 48 && SOCCalibration == 1) {//Turn on relay if input is 0 and SOC has been calculated during charging

digitalWrite(RelayPin, HIGH); }

ReadSensors(); //Read sensor values LoopCount++; // if (Pin < Pout) { if (LoopCount == 15) { if (Pout < 0) { Pout = 0; }

int IDSOC = DSOC; for (int i = 0; i < 5; i++) {

58

}

LoopCount = 0; }

}

else if (Pin > Pout) { if (LoopCount == 15) { if (Pout < 0) {

Pout = 0; }

int ISOC = SOC;

for (int i = 0; i < 5; i++) { SendData(Pin, Pout, ISOC); } LoopCount = 0; } } delay(4000); } void ReadSensors() {

//---Load current read--- //

59

for (int i = 0; i < 50; i++) { LoadCurrent = LoadCurrent + (((0.0048875855327468 * analogRead(CurrentRead1) - 2.5) / 0.1) + 0.0453); } LoadCurrent = LoadCurrent / 50; LoadCurrentVector[index1] = LoadCurrent;//Store in current vector index1++;

//---Charging current read--- ---//

float ChargingCurrent; for (int i = 0; i < 50; i++) { ChargingCurrent = ChargingCurrent + (((0.0048875855327468 * analogRead(CurrentRead2) - 2.5) / 0.1) + 0.0453); } ChargingCurrent = ChargingCurrent / 50;

ChgCurrentVector[index2] = ChargingCurrent;//Store in current vector index2++;

//---Voltage reading---// RawValueV1 = analogRead(VoltageRead1);

60

Voltage1 = Voltage1 - 0.541;//Compensate for reading error RawValueV2 = analogRead(VoltageRead2);

Voltage2 = (RawValueV2 * 24.64 ) / 1024.0;//Convert raw value Voltage2 = Voltage2 - 0.7278;//Compensate for reading error RawValueV3 = analogRead(VoltageRead3);

Voltage3 = (RawValueV3 * 15.4631578947 ) / 1024.0;//Convert raw value Voltage3 = Voltage3 - 0.671;//Compensate for reading error

ChgVoltageVector[index3] = Voltage3;//Store in Voltage vector index3++;

//---//

if (index1 == 15 && index2 == 15 && index3 == 15) { //When 15 readings have been made (about 1min)

float LCAvr = 0; float CCAvr = 0; float Vavr = 0;

//---Calculate average load current---// for (int i = 0; i < 15; i++) {

LCAvr = LCAvr + LoadCurrentVector[i]; }

LCAvr = LCAvr / 15;

//---Calculate average charging currnt---// for (int i = 0; i < 15; i++) {

61

CCAvr += ChgCurrentVector[i]; }

CCAvr = CCAvr / 15;

//---Calculate average charging voltage---// for (int i = 0; i < 15; i++) {

Vavr += ChgVoltageVector[i]; }

Vavr = Vavr / 15;

//---Calculate SOC during discharge--- -//

if ((CCAvr - LCAvr) < 0) {

float DisChgCurrent = LCAvr - CCAvr;

if (SOCCalibration == 2) {//If latest SOC calculation was during dischare, subtract from that

LastSOC = DSOC;

DrawnAh = DisChgCurrent / 60; LastAh = (C / 100) * DSOC; NewAh = LastAh - DrawnAh; DSOC = (NewAh * 100) / C; }

else if (SOCCalibration == 1) { //If latest SOC was calculated during charging, use as reference

62

LastSOC = SOC; DrawnAh = DisChgCurrent / 60; LastAh = (C / 100) * SOC; NewAh = LastAh - DrawnAh; DSOC = (NewAh * 100) / C; SOCCalibration = 2;

}

//---calculate power in and out---// Pin = Voltage1 * CCAvr;

Pout = Voltage2 * LCAvr;

//---// index1 = 0;

index2 = 0; index3 = 0; }

//---Calculate SOC during charging---// else if ((CCAvr - LCAvr) > 0) {

float ChCurr = CCAvr - LCAvr;

ChgLookup(ChCurr, Vavr);//Calculate SOC Pin = Voltage1 * CCAvr;

Pout = Voltage2 * LCAvr; index1 = 0;

63 index2 = 0; index3 = 0; SOCCalibration = 1; } } }

//---Send data function---// void SendData(float Pin, float Pout, int SOC) {

esp8266.write("AT+CIPMUX=1\r\n");//number of connections delay(500);

esp8266.write("AT+CIPSTART=2,\"TCP\",\"184.106.153.149\",80\r\n");//establish TCP connection with Thingspeak

transmit = "GET /update?api_key=WM37P70RQSFSZGIX&field1=";//HTTP request string transmit += String(Pin); transmit += "&field2="; transmit += String(Pout); transmit += "&field3="; transmit += String(SOC); transmit += "\r\n\r\n"; CIPSEND = "AT+CIPSEND=2,";//

CIPSEND += transmit.length();//Tells that data will be sent and length of following string

64

esp8266.println(CIPSEND);//send command delay(100);

esp8266.print(transmit);//Send request string delay(200); esp8266.write("AT+CIPCLOPSE\r\n");//Close connection delay(200); } //---// void ReadData() { esp8266.write("AT+CIPMUX=1\r\n"); delay(500); esp8266.write("AT+CIPSTART=2,\"TCP\",\"184.106.153.149\",80\r\n"); transmit = "GET /channels/486448/fields/4/last";

transmit += "\r\n\r\n"; CIPSEND = "AT+CIPSEND=2,"; CIPSEND += transmit.length(); esp8266.println(CIPSEND); delay(100); esp8266.print(transmit); delay(200); while (esp8266.available()) {

65

Input = esp8266.readStringUntil('\n');//Read HTTP reasponse and store in Relay variable

}

esp.write("AT+CIPCLOPSE\r\n"); }

//---Charge SOC Lookup---//

}

NewCol(A, ChgTbl, Vbat); }

//---Charging new column function--- ---//

void NewCol(float I, float ChgTbl[][5], float Vbat) { int i; int j; float Vu[10]; float Vo[10]; float Iu; float Io; float TempCol[11][2] = {{10, 0}, {20, 0},

66 {30, 0}, {40, 0}, {50, 0}, {60, 0}, {70, 0}, {80, 0}, {90, 0}, {100, 0}, {0, 0} }; for (i = 1; i < 5; i++) {

if (I > ChgTbl[0][i] && I < ChgTbl[0][i + 1]) { Iu = ChgTbl[0][i]; Io = ChgTbl[0][i + 1]; for ( j = 1; j < 11; j++) { Vu[j - 1] = ChgTbl[j][i]; Vo[j - 1] = ChgTbl[j][i + 1]; } for ( j = 0; j < 10; j++) {

TempCol[j][1] = ((Vo[j] - Vu[j]) / (Io - Iu)) * (I - Iu) + Vu[j]; }

67 } for (int k = 0; k < 11; k++) { if (Vbat == TempCol[k][1]) { SOC = TempCol[k][0]; return; }

else if (Vbat > TempCol[k][1] && Vbat < TempCol[k + 1][1]) { v1 = TempCol[k][1]; S1 = TempCol[k][0]; v2 = TempCol[k + 1][1]; S2 = TempCol[k + 1][0]; SOC = ((S2 - S1) / (v2 - v1)) * (Vbat - v1) + S1; return; } } } //---//

69

TRITA TRITA-CBH-GRU-2018:52

Related documents