A simple EVSE (electric vehicle supply equipment or "wall charger") built using an Arduino and open source software.
Inspired by OpenEVSE and Arduino EV J1772 Charging Station.
I use Domoticz, Mosquitto and Node-RED to control the charging with the ArduinoEVSE.
Domoticz, Mosquitto and Node-RED run on a Raspberry Pi. I connected the smart meter with a P1 to USB adapter. This gives me the total household load. I use a ABB EV3 012-100 kWh meter that I read through a Modbus RS486 to USB adapter. This gives me the actual charging current and also measures the total kWh charged for financial purposes.
By setting up some dummy switches and sensors in Domoticz and connecting them to the ArduinoEVSE through Node-RED, I can start, stop and monitor the charging through the Domoticz app.
For load balancing I use the output of the smart meter on the P1 port to measure the total load. My house has a 3x25A connection that must not be exceeded.
To measure the actual current the EV is drawing, I installed a separate kWh meter on the EVSE group that I read using Modbus RS486 every 20 seconds.
In Node-RED I set up some flows to do the load balancing calculations and send the maximum allowed current (current limit) to the ArduinoEVSE via MQTT.
I got the Arduino Uno WiFi Rev2 board.
And 2 Proto Shields (Uno Size) to solder the custom circuits on and be able to easily plug it onto the Arduino.
On the bottom Proto Shield I soldered the Control Pilot circuit and together with the DC/DC converter.
I used screw terminals for connecting the CP lead from the charging cable and for connecting the AC relay.
The finished Pilot shield looks like this:
On the top Proto Shield I soldered the relay and the status LED.
The finished Relay shield looks like this:
Then I put everything into an enclosure with DIN rail and attached the AC contactor: This AC contactor is 3 phase, normally open and rated for 400V 40A which is more that sufficient for my use case.
Some EVSEs have a Ground Fault Circuit Interrupter built-in, but I chose to externalize it and put it in my fuse box next. I used a ABB F200 B Type residual current circuit breakers that is also sensitive to DC currents.
The project uses PlatformIO to build and upload the firmware to the Arduino. You can use the VSCode plugin or install PlatformIO CLI.
Create a file src/arduino_secrets.h
:
#define WIFI_SSID "myssid"
#define WIFI_WPA_PASS "mypass"
#define MQTT_HOST "192.168.1.44"
#define MQTT_USERNAME "arduino"
#define MQTT_PASSWORD "arduino"
This is needed to set the WiFi and MQTT settings until it is possible to configure them through some other means.
Make sure your Arduino is connected to your computer and is detected by PlatformIO:
pio device list
Run PlatformIO to build and upload the firmware. It should download the necessary libraries automatically:
pio run -t upload
After this is successful you can disconnect the Arduino and it will run the firmware on its own.
To run all the tests:
pio test -e native
The Arduino EVSE will not start charging by itself. It can be controlled through MQTT.
Once connected to WiFi, the Arduino will try to connect to a MQTT broker. The default topic names are ArduinoEVSE/in
for commands and ArduinoEVSE/out
for status updates.
Every couple of seconds the Arduino will send a status message on the ArduinoEVSE/out
topic:
Status message: <State>,<VehicleState>,<CurrentLimit>,<PilotVoltage>
See ChargeController.h
for the different state values.
Send a message on the ArduinoEVSE/in
topic to do the following:
-
Start Charging message:
1
-
Stop Charging message:
0
-
Set Current Limit message:
2,<CurrentLimit>
for example2,16.0
. This can be used for external load balancing logic. -
Report the actual charging current:
3,<ActualCurrent>
for example3,15.9
. This is needed for the internal load balancing and/or smart charging logic and requires the charging current is measured somehow externally. -
Report mains meter values:
4,<ImportCurrentL1>,<ImportCurrentL2>,<ImportCurrentL3>,<ExportCurrentL1>,<ExportCurrentL2>,<ExportCurrentL3>
for example4,2.9,0.1,0.0,0.0,0.0,0.0
. This is needed for the internal load balancing and/or smart charging logic and requires an external kWh meter or reading it from the P1 port of a smart meter.