76 758 läst ·
328 svar
77k läst
328 svar
Projektidé: Bygga egen laddbox till elbilen/laddhybriden
Då var lådan ihopskruvad. Den kommer nog att öppnas några gånger till, jag har exempelvis fortfarande inte stoppat in knappen för att manuellt byta laddström. Skickar med en bild så att ni ser hur det blev. Satte fast skärmen med tejp runt plasten bara, men brun packtejp skulle ju inte se bra ut. Det är då (aldrig annars ;-) man uppskattar att frun håller på med scrapbooking. Jag tycker att det ser helt OK ut men denna mönstrade tejp.
Notera också embryot till tilläggsprojektet med strömmätning som ligger bredvid, detta så att jag kan mäta laddströmmen exakt. Parallellt med att jag skriver det här så gör jag ett försök med att lura bilen till att ladda snabbare, vi får se hur det går. Jag återkommer rörande detta när/om jag lyckats återupprepa en snabb laddning flera gånger.
Edit: Har hunnit testa en sak till också. Det verkar som om min bil laddar på med full ström upp till 80% av batteriet (nu också verifierat via batterimätaren i bilen). Sedan vilar den en stund, innan den fortsätter att ladda med en lägre laddström. Jag har testat att försöka trigga igång bilens laddning igen under denna period, dels genom att ställa ned spänningen in till bilen (12V) till 0V och sedan slå på den igen, men det hjälpte inte. Hittade då en bugg i koden, det visade sig att jag inte ställde ned laddströmmen på 0A utan bara på 1A och då kan har jag fortfarande en PWM-våg jag och då kan jag inte trigga bilen till att börja om laddningen. Får rätta buggen och köra om testet någon annan dag. Det är sällan kod är buggfri.
Inloggade ser högupplösta bilder
Logga in
Skapa konto
Gratis och tar endast 30 sekunder
Notera också embryot till tilläggsprojektet med strömmätning som ligger bredvid, detta så att jag kan mäta laddströmmen exakt. Parallellt med att jag skriver det här så gör jag ett försök med att lura bilen till att ladda snabbare, vi får se hur det går. Jag återkommer rörande detta när/om jag lyckats återupprepa en snabb laddning flera gånger.
Edit: Har hunnit testa en sak till också. Det verkar som om min bil laddar på med full ström upp till 80% av batteriet (nu också verifierat via batterimätaren i bilen). Sedan vilar den en stund, innan den fortsätter att ladda med en lägre laddström. Jag har testat att försöka trigga igång bilens laddning igen under denna period, dels genom att ställa ned spänningen in till bilen (12V) till 0V och sedan slå på den igen, men det hjälpte inte. Hittade då en bugg i koden, det visade sig att jag inte ställde ned laddströmmen på 0A utan bara på 1A och då kan har jag fortfarande en PWM-våg jag och då kan jag inte trigga bilen till att börja om laddningen. Får rätta buggen och köra om testet någon annan dag. Det är sällan kod är buggfri.
Redigerat:
Besserwisser
· Västra Götalands
· 11 234 inlägg
Om du skickar CAD-fil i lämpligt format så skall jag (3D) skriva ut en plastbit åt dig i lämplig färg. Du får välja mellan vit, svart, blå och röd!pacman42 skrev:
Tack, men jag tror att jag klarar mig utan detta. Bekymret var alltså infästningen, inget annat. Den genomskinliga plastbiten hade jag redan (har även en grå). Det hade nog gått lösa på annat sätt, men nu blev det tejp för enkelhetens skull.
Man hittar ju buggar när man försöker använda sig av grejerna. Jag tog med mig laddboxen när jag åkte bort i helgen för att kunna ladda med lägre ström i vägguttaget hos en kompis (6A är ju default i koden). Men laddboxen ville inte alls fungera så det blev att ladda med originalladdaren och 9A istället, under övervakning. När jag kom hem så pluggade jag in min box igen för att börja felsöka den, då fungerade den plötsligt igen. Vad kunde felet vara?
Började läsa koden och hittade det väldigt snabbt, det var mjukvaran som lade sig i en evig loop och väntade på att kunna ansluta till mitt WiFi hemma. En kompis hade samma fel i en lösning han designat, så jag anade vad jag skulle leta efter. Tyvärr förstod jag inte det då, för i så fall hade jag bara satt upp en AP i telefonen med samma SSID och lösenord som jag har hemma...
Två rättningar i koden har nu gjorts:
1) en timeout på ca 30s har införts och sedan bootar den upp i enbart AP-mode istället. Jag har också lagt till AP-mode...
2) jag skriver ut på displayen innan jag startar med övrig setup, nämligen "Waiting for WiFi Xs". X räknar ned till 0 från 30s.
Jag har även lagt in att displayen blir svart om laddaren inte varit ansluten till en bil under fem minuter (dvs befunnit sig i state 12 i mer än 300 000 ms). På detta sätt så sliter jag inte ut OLED-displayen i onödan.
Tur att man kan uppgradera via WiFi, det hade blivit mycket skruvande i lådan annars. Fortsätter med uppsnyggningen av koden också, så snart blir även denna tillgänglig.
Jag har inte hunnit köra tillräckligt med tester för att försöka lura laddningen till att gå snabbare ännu. Det är dock inte så nödvändigt då jag på 2h får 80% av batteriet laddat, dvs jag får runt tre mil av fyra möjliga på två timmar. Denna del går inte att snabba upp. Att snabba på de senare delarna av laddningsfasen ytterligare känns därför inte riktigt nödvändigt, men det hade varit intressant att testa det ändå. Bara för att, men det kommer nog aldrig att ske. Det finns nämligen viktigare saker, som att få igång strömmätning. Jag har dock väldigt ont om tid denna veckan.
Började läsa koden och hittade det väldigt snabbt, det var mjukvaran som lade sig i en evig loop och väntade på att kunna ansluta till mitt WiFi hemma. En kompis hade samma fel i en lösning han designat, så jag anade vad jag skulle leta efter. Tyvärr förstod jag inte det då, för i så fall hade jag bara satt upp en AP i telefonen med samma SSID och lösenord som jag har hemma...
Två rättningar i koden har nu gjorts:
1) en timeout på ca 30s har införts och sedan bootar den upp i enbart AP-mode istället. Jag har också lagt till AP-mode...
2) jag skriver ut på displayen innan jag startar med övrig setup, nämligen "Waiting for WiFi Xs". X räknar ned till 0 från 30s.
Jag har även lagt in att displayen blir svart om laddaren inte varit ansluten till en bil under fem minuter (dvs befunnit sig i state 12 i mer än 300 000 ms). På detta sätt så sliter jag inte ut OLED-displayen i onödan.
Tur att man kan uppgradera via WiFi, det hade blivit mycket skruvande i lådan annars. Fortsätter med uppsnyggningen av koden också, så snart blir även denna tillgänglig.
Jag har inte hunnit köra tillräckligt med tester för att försöka lura laddningen till att gå snabbare ännu. Det är dock inte så nödvändigt då jag på 2h får 80% av batteriet laddat, dvs jag får runt tre mil av fyra möjliga på två timmar. Denna del går inte att snabba upp. Att snabba på de senare delarna av laddningsfasen ytterligare känns därför inte riktigt nödvändigt, men det hade varit intressant att testa det ändå. Bara för att, men det kommer nog aldrig att ske. Det finns nämligen viktigare saker, som att få igång strömmätning. Jag har dock väldigt ont om tid denna veckan.
Snyggt jobbat! Kul tråd det här. Som du nämner har jag också läst att Outlandern gör det där med någon kalibreringsfas vid vissa nivåer. Vet inte om du har kommit runt det problemet än, och/eller om det ens är en bra idé (de gör det väl av någon anledning), men det finns en polsk filur som bygger laddboxar också som påstår att det är en balansering av cellerna och att hans låda kan komma runt detta för att göra laddningen snabbare: https://evtun.com/chargers.html
PHEV uses twice (at empty battery and at almost full battery) kind of pre-balancing. This means it stops charging (exactly charges with <0.2A) for about 25 minutes in total. This makes time of charging with any charger longer by these 25 minutes. Accelev reduces this time to about 2 min, increasing speed of charging from zero to full.
Jo jag har sett hans projekt, både på hemsidan och på någon projektsajt från innan han kommersialiserade det hela. Jag har inte lyckats hitta den initiala balanseringsfasen mer än på en gammal logg med 9A (10A skall det vara, men min medföljande laddare ger ca 9A - troligen för att ha marginal på säkringen) laddning, så jag undrar om det är något som bara görs ibland. Jag kommer nog att försöka gå runt den om den inträffar ofta.halper skrev:
Hmm, det kan bli lite problematiskt att fånga upp förändringar i strömförbrukningen utan att säkringarna går. Kollade på min statistik från igår och noterade att jag under en rätt kort tid igår (15 minuter) hade totalt 58A på tre faser. Det mesta av detta var dessutom på bara två faser så gissningsvis så låg dessa två på runt 24A var under denna kvarten. Jag hade inte stoppat i laddsladden till bilen, eftersom jag visste att vi skulle laga mat. Och tur var väl det. En 20A säkring skall ju tåla 20A i en timme ungefär.
Under en timme så låg nämligen inte strömmen på de två faserna under 16A i snitt mätt på femminutersperioder. Detta gör att jag inte har råd med någon fördröjning i strömförbrukningen mot bilen, jag måste ha nästintill realtid om jag skall kunna kräma på med 16A. Även med 6A så riskerar ju säkringarna att gå om man har andra energitjuvar igång. Bara elpannan ligger på 13A per fas när den kör igång på full effekt (exempelvis när den skall göra en varmvattentopp för att undvika Salmonella).
Jag måste ju ligga på gränsen för att säkringarna skall gå rätt ofta. Det känns tryggt att jag börjar få koll på detta.
Under en timme så låg nämligen inte strömmen på de två faserna under 16A i snitt mätt på femminutersperioder. Detta gör att jag inte har råd med någon fördröjning i strömförbrukningen mot bilen, jag måste ha nästintill realtid om jag skall kunna kräma på med 16A. Även med 6A så riskerar ju säkringarna att gå om man har andra energitjuvar igång. Bara elpannan ligger på 13A per fas när den kör igång på full effekt (exempelvis när den skall göra en varmvattentopp för att undvika Salmonella).
Jag måste ju ligga på gränsen för att säkringarna skall gå rätt ofta. Det känns tryggt att jag börjar få koll på detta.
Du har nog missuppfattat utlösningstiderna för säkringarna lite, du behöver inte vara så nervös. Tumregelmässigt kan du räkna med runt 1.6 x In för 1 h så korta toppar upp mot det säg 5-10 min påverkar inte varken på kort eller lång sikt. Givetvis bra att inte överlasta regelmässigt lång tid men med din möjlighet att styra har du inga problem att få det bra.
Googlade på det och jag hade naturligtvis kommit ihåg fel. Jag tänkte på tumregeln som är att en 16A säkring skall hålla i en timme om den belastas med 20A. Och detsamma med en 20A säkring som belastas med 25A. På ett ungefär. Vill man räkna noggrannare så är det tydligen 1,2x för automatsäkringar och 1,8x för smältsäkringar. Dvs, man har stora marginaler så länge man har de tröga propparna.
Jag har rätt goda marginaler alltså om jag skall styra laddströmmen baserat på detta.
Jag har rätt goda marginaler alltså om jag skall styra laddströmmen baserat på detta.
Min lösning innehåller ju tre stackade kretskort, detta är väldigt trångt i lådan och riskerar ge problem med kylningen av spänningsregulatorn (7805). Jag gör nu en rev2 av kretskortet (det innehåller ju inga kostsamma saker) där jag istället gör det långsmalt och bara sätter fast CPUn ovanpå. Det blir mycket lättare att bygga ut på detta kort i framtiden (om jag kommer på någon mer elektronikfiness). Dessutom så passar jag på att göra om alla anslutningar utifrån till Dupont-kontakter för att lättare kunna plocka i och ur sakerna.
Detta känns iofs lite sent, då laddboxen fungerar nu, men jag blev riktigt less på lösningen jag hade då jag skulle montera knappen i elektroniklådan också, det blev väldigt trångt. Så nu gör jag det och passar samtidigt på att ändra om från 1V till 3.3V mätning av spänningen från bilen också (byter resistorer i spänningsdelaren). Lika bra att jag har samma saker på mitt kretskort som finns i ritningarna. Och att mjukvaran i min box är exakt samma som jag om några dagar skall publicera för er.
Detta känns iofs lite sent, då laddboxen fungerar nu, men jag blev riktigt less på lösningen jag hade då jag skulle montera knappen i elektroniklådan också, det blev väldigt trångt. Så nu gör jag det och passar samtidigt på att ändra om från 1V till 3.3V mätning av spänningen från bilen också (byter resistorer i spänningsdelaren). Lika bra att jag har samma saker på mitt kretskort som finns i ritningarna. Och att mjukvaran i min box är exakt samma som jag om några dagar skall publicera för er.
OK, nu är min laddbox helt klar. Eller helt klar blir den aldrig då den innehåller mjukvara...
Nedan har vi koden jag gjort, kanske inte den snyggaste men den fungerar. Den är ett hopkok av olika externa lösningar, men även mina egna lösningar. Läs och begrunda om ni vill bygga er egen lösning. Den går att använda som den ser ut nu, men ni kanske har andra önskemål/krav än vad jag har.
Globala variabler är bra att använda sig av i Arduino-miljön, detta då stacken är begränsad.
Jag planerar att införa ett fjärde laddläge, automatisk laddström, men jag vet inte riktigt än om det behövs. Just nu ställer jag strömmen automatiskt oavsett vad jag ställt in laddboxen på, jag använder den inställda strömmen som ett maxtak bara.
Jag har också gjort en tredje revision av hårdvaran, jag återkommer med bilder och detaljerade beskrivningar av denna. Det mesta finns dock givet redan, resten är finjusteringar. Har dock bytt ut SSR-reläet till ett mindre som bara klarar 2A, detta för att få mer plats i lådan. Det styr ju ändå bara en kontaktor. I övrigt så handlar det nya kretskortet i huvudsak om att göra det enklare att koppla in och ur det genom att jag lödit in dupont-pinnar på kortet och ansluter alla externa saker (relä, bil, tryckknapp, display, 12V/GND) med dupont-kablar.
Jag funderar på att bygga ytterligare en laddbox också, en som är förberedd för trefas och har ett uttag av type-2. Denna skulle jag då alltid kunna ha med i bilen. Slutpriset på denna boxen blev knappt 1000kr. Jag gissar att man hamnar på 1500kr med trefas och uttag i lådan. Men det är en fråga för nästa år i så fall...
WiFi-settings.h :
ChargeBox.ino :
Nedan har vi koden jag gjort, kanske inte den snyggaste men den fungerar. Den är ett hopkok av olika externa lösningar, men även mina egna lösningar. Läs och begrunda om ni vill bygga er egen lösning. Den går att använda som den ser ut nu, men ni kanske har andra önskemål/krav än vad jag har.
Globala variabler är bra att använda sig av i Arduino-miljön, detta då stacken är begränsad.
Jag planerar att införa ett fjärde laddläge, automatisk laddström, men jag vet inte riktigt än om det behövs. Just nu ställer jag strömmen automatiskt oavsett vad jag ställt in laddboxen på, jag använder den inställda strömmen som ett maxtak bara.
Jag har också gjort en tredje revision av hårdvaran, jag återkommer med bilder och detaljerade beskrivningar av denna. Det mesta finns dock givet redan, resten är finjusteringar. Har dock bytt ut SSR-reläet till ett mindre som bara klarar 2A, detta för att få mer plats i lådan. Det styr ju ändå bara en kontaktor. I övrigt så handlar det nya kretskortet i huvudsak om att göra det enklare att koppla in och ur det genom att jag lödit in dupont-pinnar på kortet och ansluter alla externa saker (relä, bil, tryckknapp, display, 12V/GND) med dupont-kablar.
Jag funderar på att bygga ytterligare en laddbox också, en som är förberedd för trefas och har ett uttag av type-2. Denna skulle jag då alltid kunna ha med i bilen. Slutpriset på denna boxen blev knappt 1000kr. Jag gissar att man hamnar på 1500kr med trefas och uttag i lådan. Men det är en fråga för nästa år i så fall...
WiFi-settings.h :
Kod:
#define APADDRESS apIp(192, 168, 111, 1)
const char* apSsid = "EVBox";
const char* apPassword = "apPassword";
const char* ssid = "HomeSSID";
const char* password = "homePassword";
ChargeBox.ino :
Kod:
extern "C" {
#include "user_interface.h"
}
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WiFiAP.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPUpdateServer.h>
#include "WiFi-settings.h"
ESP8266HTTPUpdateServer httpUpdater;
ESP8266WebServer server(80);
os_timer_t myTimer;
const String swVersion = "2.0";
//------------------------------------------------------------------------------
// Simple I2C test for ebay 128x64 oled.
// Display three rows
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
// 0X3C+SA0 - 0x3C or 0x3D
#define I2C_ADDRESS 0x3C
// Define proper RST_PIN if required.
#define RST_PIN -1
SSD1306AsciiWire oled;
//------------------------------------------------------------------------------
// WiFi AP settings
boolean apMode=false;
String clientIp;
IPAddress APADDRESS; // Private network address: local & gateway
//______________________________________________________________________________
const int relayPin = D6;
// transistor makes a pull down Reverse order for RELAY_ON and RELAY_OFF for other SSR relays!
#define RELAY_ON HIGH
#define RELAY_OFF LOW
const int pwmPin = D5; // PWM connected to digital pin 9
unsigned char amps = 6;
unsigned char currState = 6;
unsigned char state=12;
unsigned int lastStateChange = 0;
unsigned char relayOn=0;
unsigned int analogVals[] = {0, 220, 440, 660, 880};
unsigned int lastReads[5];
unsigned int buttonPress=0;
String webString=""; // String to display
// Generally, you should use "unsigned long" for variables that hold time
unsigned long currentTime = 0; // will store when last read was done
int count = 0;
int value = 0;
const int AnalogIn = A0;
unsigned int isr=0;
void setAmpere(unsigned int ampere) {
unsigned int invPercent;
invPercent = 1023 - (1023*ampere/60); // "1023 - " due to inverted PWM with single transistor, 60A at 100% (--> 0%)
analogWrite(pwmPin, invPercent);
}
void storeAmpere(unsigned int ampere) { //store current
if (ampere>16) {
ampere=16;
}
/* if (ampere<2) {
ampere=2;
}*/
amps = ampere;
if (12 != state) {
setAmpere(amps);
}
}
void setState(unsigned char newState) {
if (state != newState) {
switch (newState) {
case 3:
case 6:
state=newState;
setAmpere(amps);
digitalWrite(relayPin, RELAY_ON);
relayOn=1;
break;
case 9:
state=newState;
digitalWrite(relayPin, RELAY_OFF);
relayOn=0;
setAmpere(amps);
break;
case 12:
default:
state=newState;
digitalWrite(relayPin, RELAY_OFF);
relayOn=0;
digitalWrite(pwmPin, LOW);
break;
}
}
}
//------------------------------------------------------------------------------
void printDisplay(String row1, String row2, String row3, String row4, String row5) {
oled.setFont(System5x7); // System5x7, Adafruit5x7
oled.clear();
oled.set2X();
oled.println(row1);
oled.println(row2);
oled.println(row3);
oled.set1X();
oled.println(row4);
oled.println(row5);
}
//------------------------------------------------------------------------------
///////////////////////////////////////////////
void printState() {
String r1="EVbox " + swVersion;
String r2, r3, r4, r5, t;
r2 = "I:" + String(amps) + "A";
switch (state) {
case 3:
t = "Ventilated Charging";
break;
case 6:
t = "Charging";
break;
case 9:
t = "Connected";
break;
case 12:
t = "Waiting";
break;
default: t = "Error";
break;
}
r3 = "S:" + String(state) + " " + String(t);
if (apMode) {
r4 = String(apIp.toString());
r4 = "AP " +r4; //.substring(9);
} else {
r4 = String(WiFi.localIP().toString());
r4 = "STA " + r4; //.substring(9);
}
printDisplay(r1, r2, r3, r4, r5);
}
///////////////////////////////////////////////
///////////////////////////////////////
unsigned char actButton = 0;
const int buttonPin = D7;
unsigned char buttonVerify=0;
void rotCurrent() { // manually set current, can be overridden by automatic settings.
switch (currState) {
case 6:
currState = 10;
break;
case 10:
currState = 16;
break;
case 16:
currState = 6;
break;
default:
break;
}
storeAmpere(currState);
printState();
Serial.print("currState: " + String(currState) + " \n");
}
int readVal=0;
void buttonChk() {
readVal = digitalRead(buttonPin);
if (readVal < 1) { // if button pressed, pullDown resistor used
buttonPress++;
if (!actButton) {
actButton = 1;
buttonVerify=0;
}
else { // active
if (buttonVerify == 10) { // Ten consequtive interrupts is a long enough button press
Serial.print("Button pressed long enough\n");
rotCurrent();
}
}
buttonVerify++;
}
else { //// if not pressed
if (actButton) {
actButton = 0;
}
}
}
///////////////////////////////////////
int verCount=0;
int ver0=0;
int ver3=0;
int ver6=0;
int ver9=0;
int ver12=0;
int readingIn = 0;
int lastRead = 0;
int prevCarState = 0;
bool active = 0;
unsigned int verify = 0;
unsigned int lastVerify=0;
///////////////////////////////////////////////////
void carChk() {
int carState=0;
if (12==state) {
if (millis() > 300000 + lastStateChange) {
printDisplay("", "", "", "");
lastStateChange = millis();
}
}
readingIn = analogRead(AnalogIn);
if (((analogVals[1]-analogVals[0])/2) <= readingIn) {
verCount++;
if (((analogVals[4]-analogVals[3])/2+analogVals[3]) <= readingIn) {
ver12++;
lastReads[4] = readingIn ;
} else if (((analogVals[3]-analogVals[2])/2+analogVals[2]) <= readingIn) {
ver9++;
lastReads[3] = readingIn ;
} else if (((analogVals[2]-analogVals[1])/2+analogVals[1]) <= readingIn) {
ver6++;
lastReads[2] = readingIn ;
} else {
ver3++;
lastReads[1] = readingIn ;
}
}
else
{
lastReads[0] = readingIn ;
ver0++;
}
if (30<verCount) { // with more than 30 samples, flank reads are filtered out
if (ver3+ver6 > ver9+ver12) { // ugly solution but it works in reality
if (ver3>ver6) {
carState=3;
} else {
carState=6;
}
} else {
if (ver9>ver12) {
carState=9;
} else {
carState=12;
}
}
verCount=0;
ver0=0;
ver3=0;
ver6=0;
ver9=0;
ver12=0;
}
if (0 < carState) {
if (carState != prevCarState) {
verify = prevCarState;
prevCarState = carState;
setState(carState);
printState();
lastStateChange = millis();
}
}
count = verCount;
//count++;
}
///////////////////////////////////////
void /* inline */ timerISR(void *pArg){
isr = (isr+1) % (3600*1000*24);
buttonChk();
carChk();
}
//------------------------------------------------------------------------------
void setupDisplay() {
Wire.begin();
Wire.setClock(400000L);
#if RST_PIN >= 0
oled.begin(&Adafruit128x64, I2C_ADDRESS, RST_PIN);
#else // RST_PIN >= 0
oled.begin(&Adafruit128x64, I2C_ADDRESS);
#endif // RST_PIN >= 0
}
//------------------------------------------------------------------------------
void handle_root() {
webString=
"\n EvBox: v"+swVersion +
"\n CarState: "+String((int)state) +
"\n Current: "+String((int)amps) + "A" +
"\n Relay: " + (relayOn ? "On":"Off") +
"\n" +
"\n Debug commands:" +
"\n /debug - self explaining" +
"\n /on - relay on" +
"\n /off - relay off" +
"\n /rotate - rotate max current (6/10/16A)" +
"\n /set?ampere=# - set current [unsigned] ampere" +
"\n /read - read current ampere setting (unsigned)" +
"\n /reboot - self explaining" +
"\n";
server.send(200, "text/plain", webString); // send to someones browser when asked
delay(100);
}
void handle_read() {
webString=
String((int)amps) + "\n";
server.send(200, "text/plain", webString); // send to someones browser when asked
delay(100);
}
void handle_reboot() {
webString=
"Going down in 3s!\n";
server.send(200, "text/plain", webString); // send to someones browser when asked
delay(3000);
ESP.restart();
}
void handle_debug() {
webString="Count: "+String((int)count) +
"\n prevCarState: "+String((int)prevCarState) +
"\n CarState: "+String((int)state) +
"\n LastReads [0,3,6,9,12]: " + String((int)(lastReads[0])) + " " + String((int)(lastReads[1])) + " " + String((int)(lastReads[2])) + " " +String((int)(lastReads[3])) + " " +String((int)(lastReads[4])) +
"\n LastCnt [0,3,6,9,12]:" + String((int)(ver0))+ " " + String((int)(ver3))+ " " +String((int)(ver6))+ " " +String((int)(ver9))+ " " +String((int)(ver12))+
"\n LastRead :" +String((int)readingIn)+
"\n Current: "+String((int)amps) + "A" +
"\n Relay: "+String((boolean)relayOn) +
"\n buttonPress: "+String((unsigned int)buttonPress) +
"\n buttonVal: "+String((unsigned int)readVal) +
"\n ISR-count: "+String((int)isr) +
"\n" +
"\n Debug commands:" +
"\n /debug - self explaining" +
"\n /on - relay on" +
"\n /off - relay off" +
"\n /rotate - rotate max current" +
"\n /set?ampere=# - set current [unsigned] ampere" +
"\n /read - read current ampere (unsigned)" +
"\n /restart - self explaining" +
"\n";
server.send(200, "text/plain", webString); // send to someones browser when asked
}
void handle_on() {
digitalWrite(relayPin, RELAY_ON);
relayOn=1;
handle_root();
}
void handle_off() {
digitalWrite(relayPin, RELAY_OFF);
relayOn=0;
handle_root();
}
void handle_rotate() {
rotCurrent();
handle_root();
}
void handle_set() { // message += "Ampere set http://192.168.1.xxx/set?ampere=255
unsigned char ampere=0;
String tmp;
String message = "Number of args received: ";
message += server.args();
message += "\n";
for (int i = 0; i < server.args(); i++) {
message += "Arg n " + (String)i + " : ";
/* if ("value" == httpServer.argName(i)) {
value = (int)httpServer.arg(i);
}*/
message += server.argName(i) + ": ";
message += server.arg(i) + "\n";
}
if (0<server.args()) {
tmp = server.arg(0);
ampere = tmp.toInt();
storeAmpere(ampere);
printState();
}
handle_root();
}
///////////////////////////////////
void setup(void)
{
unsigned int waitCounter=0;
// You can open the Arduino IDE Serial Monitor window to see what the code is doing
Serial.begin(115200); // Serial connection from ESP-01 via 3.3v console cable
pinMode(relayPin, OUTPUT);
pinMode(pwmPin, OUTPUT);
digitalWrite(relayPin, RELAY_OFF);
digitalWrite(pwmPin, LOW);
setupDisplay();
printDisplay("Waiting", "for WiFi", "Press key", "for AP mode");
delay(5000);
// Timer initialisation
os_timer_setfn(&myTimer, timerISR, NULL);
os_timer_arm(&myTimer, 5, true); // 5ms between timer interrupts.
Serial.print("Timer initialized \n");
if (0<buttonPress) {
WiFi.mode(WIFI_AP);
WiFi.softAPConfig(apIp, apIp, IPAddress(255, 255, 255, 0)); // subnet FF FF FF 00
WiFi.softAP(apSsid, apPassword);
delay(1000);
(void)wifi_station_dhcpc_start();
Serial.print("AP at IP address: ");
Serial.println("AP SSID:" + String(apSsid));
Serial.print("AP at IP address: ");
Serial.println(apIp);
apMode=true;
} else {
// Connect to WiFi network
WiFi.begin(ssid, password);
WiFi.mode(WIFI_STA); // WIFI_AP_STA
Serial.print("\n\r \n\rWorking to connect");
// Wait for connection
while ((WiFi.status() != WL_CONNECTED) && (60<waitCounter)){
printDisplay("Waiting", "for", "WiFi", String((60-waitCounter)/2)+"s");
delay(500);
Serial.print(".");
waitCounter++;
}
if (60<=waitCounter) {
Serial.print("\n\r \n\rWiFi Client timed out, no WiFi available");
} else {
Serial.println("");
Serial.println("EVBox Reading Server");
Serial.print("Connected to SSID: ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP().toString());
}
}
if ((waitCounter<60) || (apMode)) {
server.on("/", handle_root);
server.on("/reboot", handle_reboot);
server.on("/read", handle_read);
server.on("/set", handle_set);
server.on("/on", handle_on);
server.on("/off", handle_off);
server.on("/rotate", handle_rotate);
server.on("/debug", handle_debug);
httpUpdater.setup(&server);
server.begin();
Serial.println("HTTP server started");
Serial.print("HTTPUpdateServer ready! Open http://");
Serial.print(WiFi.localIP());
Serial.print("/update in your browser\n");
Serial.println("HTTP server started");
}
printState();
}
void loop(void)
{
server.handleClient();
}
Den funktionen är väl för att skydda batteriet? Cellerna blir väl varma när dom närmar sig fulladdat och är inte alla celler helt balanserade och i samma skick så kan ju vissa av dom kanske ta skada av för hård laddning i slutfasen?pacman42 skrev:
Har hunnit testa en sak till också. Det verkar som om min bil laddar på med full ström upp till 80% av batteriet (nu också verifierat via batterimätaren i bilen). Sedan vilar den en stund, innan den fortsätter att ladda med en lägre laddström. Jag har testat att försöka trigga igång bilens laddning igen under denna period, dels genom att ställa ned spänningen in till bilen (12V) till 0V och sedan slå på den igen, men det hjälpte inte.
Det som framkommit i trådar på nätet är att den initiala lastbalanseringen (som jag bara ser ibland på min bil) inte tillför något i den frågan utan lika gärna kan göras i efterhand. Nu körs den så sällan på min bil vid tillfällen då jag verkligen behöver ladda batteriet snabbt (pga att jag strax skall iväg igen) så att jag inte tycker den är ett bekymmer ändå. Jag var mest nyfiken på om jag kunde återupprepa det beteende som andra på nätet sett, dvs att man kan lura bilen till att hoppa över den initiala lastbalanseringen...useless skrev:
Det har inte hänt mycket med laddboxen de senaste veckorna, den används och fungerar bra.
Just nu så slåss jag istället med hur jag skall kunna styra förvärmning av min MItsubishi Outlander PHEV från min mobiltelefon, vilket inte är det lättaste. Trots att bilen bara står mindre än tio meter bort så räcker inte WiFi för att styra den, utan jag måste gå ned på bottenvåningen och sträcka ut telefonen mot bilen för att det skall fungera.
Av den anledningen har jag börjat göra reverse engineering på protokollet som används mellan bil och telefon. Jag har kommit en bra bit på vägen, men jag tror inte att jag kommer att komma i mål med detta utan att lägga allt för mycket tid.
Istället har jag nu stoppat in en extra mobiltelefon i bilen och utvecklat ett script för "Tasker" för att styra denna telefon via SMS så att den kan sätta på uppvärmning av kupén åt mig. Jag utvecklar parallellt en annan app (också som script i Tasker) i min vanliga telefon som sedan skickar SMS till telefonen i bilen. För att telefonen skall få en bra batteritid så är varken WiFi eller mobildata aktivt till vardags, jag kan dock med SMS aktivera mobildata och "Taskviewer" så att jag kan kolla laddstatusen vid de tillfällen då jag inte använder min egen laddbox.
Lösningen har sina brister, men den fungerar faktiskt rätt bra ändå, även om jag har några "buggar" att ta hand om (ibland får man felmeddelanden från appen och jag måste utveckla mina script till att agera korrekt på dessa också - just nu får jag bara ett SMS som talar om att scriptet misslyckades).
Jag har även börjat kolla på delar till en ny laddbox. Jag vill gärna ha en box fast monterad hemma, samt ytterligare en när jag inte är hemma och laddar bilen. Det verkar som att det skall gå att få tag på ett Mennekes/Typ-"-uttag för under 1000kr från Kina. Med detta så kan man bygga en laddbox för användning med sin befintliga bilkabel som man antagligen redan har (jag vet ingen med elbil/laddhybrid som inte har en sådan i bilen för anslutning till offentliga laddplatser). Jag kommer dock inte att påbörja denna box förrän efter nyår. Men å andra sidan så kanske jag inte bygger den alls då jag snart får laddstolpe på jobbet och iom detta har laddstolpar på de flesta platser där jag ofta befinner mig, samt att jag har min redan byggda laddbox hemma. Vi får se hur jag gör...
Just nu så slåss jag istället med hur jag skall kunna styra förvärmning av min MItsubishi Outlander PHEV från min mobiltelefon, vilket inte är det lättaste. Trots att bilen bara står mindre än tio meter bort så räcker inte WiFi för att styra den, utan jag måste gå ned på bottenvåningen och sträcka ut telefonen mot bilen för att det skall fungera.
Av den anledningen har jag börjat göra reverse engineering på protokollet som används mellan bil och telefon. Jag har kommit en bra bit på vägen, men jag tror inte att jag kommer att komma i mål med detta utan att lägga allt för mycket tid.
Istället har jag nu stoppat in en extra mobiltelefon i bilen och utvecklat ett script för "Tasker" för att styra denna telefon via SMS så att den kan sätta på uppvärmning av kupén åt mig. Jag utvecklar parallellt en annan app (också som script i Tasker) i min vanliga telefon som sedan skickar SMS till telefonen i bilen. För att telefonen skall få en bra batteritid så är varken WiFi eller mobildata aktivt till vardags, jag kan dock med SMS aktivera mobildata och "Taskviewer" så att jag kan kolla laddstatusen vid de tillfällen då jag inte använder min egen laddbox.
Lösningen har sina brister, men den fungerar faktiskt rätt bra ändå, även om jag har några "buggar" att ta hand om (ibland får man felmeddelanden från appen och jag måste utveckla mina script till att agera korrekt på dessa också - just nu får jag bara ett SMS som talar om att scriptet misslyckades).
Jag har även börjat kolla på delar till en ny laddbox. Jag vill gärna ha en box fast monterad hemma, samt ytterligare en när jag inte är hemma och laddar bilen. Det verkar som att det skall gå att få tag på ett Mennekes/Typ-"-uttag för under 1000kr från Kina. Med detta så kan man bygga en laddbox för användning med sin befintliga bilkabel som man antagligen redan har (jag vet ingen med elbil/laddhybrid som inte har en sådan i bilen för anslutning till offentliga laddplatser). Jag kommer dock inte att påbörja denna box förrän efter nyår. Men å andra sidan så kanske jag inte bygger den alls då jag snart får laddstolpe på jobbet och iom detta har laddstolpar på de flesta platser där jag ofta befinner mig, samt att jag har min redan byggda laddbox hemma. Vi får se hur jag gör...
Besserwisser
· Västra Götalands
· 11 234 inlägg
Jag såg appropå det att man i branschen tydligen använder en ganska kul enhet för hur snabbt man laddar: km/h. Som alltså skall tydas som att man får exv. 60 km körsträcka per timme laddning.
Det är ju en logiskt korrekt tillämpning av begreppet, men ser ju lite kul när man ser det första gången. "Min Tesla gör 60 km/h just nu. Fast den står still på garageuppfarten..."
Det är ju en logiskt korrekt tillämpning av begreppet, men ser ju lite kul när man ser det första gången. "Min Tesla gör 60 km/h just nu. Fast den står still på garageuppfarten..."
