The spark abacus is a system to monitor electricity consumption.
A micro-controller collects data from various electricity meters placed at the entry of the 3-phase 4-wire mains electricity distribution installation, and sends it over a local network to a computer storing the values in a database.
The measurements can then be visualized.
More information is available on the [wiki](https://wiki.cuvoodoo.info/doku.php?id=spark_abacus).
4 LEDs have been added to show the current activity:
- power (red): shows if the board is power (the voltage regulator works).
- heart beat (green): shows if the firmware is running correctly. It starts when all the setup of all peripherals is complete (including connecting to the WiFi network) and toggles every second.
- query (yellow): goes on when starting to query the measurement values from all electricity meters, and goes off when it received all values.
- submit (blue): goes on when it start submitting the values to the database (using an HTTP POST on influxDB), and goes off when the submission succeeded.
Note: don't use the onboard LED on PC13 on the blue pill as switching it heavily influences the RTC.
Connections LED (cathode) <-> board (all LED anodes are connected to the +3.3V rail):
To record these impulses a timer input capture is used.
The number of impulses determines the energy used.
It is stored in a backup register, keeping the value in memory even when the board is powered down as long as a (coin cell) battery is connected to VBAT.
The interval between impulses allow to calculate the current power consumption.
The time has a resolution of 0.91 ms (leading to a power calculation error of <1%).
This 1-phase 2-wire electricity meter provides a UART interface.
For the 3-phase 4-wire power distribution installation I used 3 meters, one per phase.
Because each command includes a device address, they can be connected to the same UART port (one individual addresses have been set).
All meters are periodically (see RTC) sequentially queried for their measurements (voltage, current, power, energy).
The used addresses are hard coded in `main.c`
A timer is used to guarantee a minimum (undocumented in the specification) time between requests in order to improve the response success.
Connections 3xPZEM-004T <-> board:
- 5V, 1; +5V (+3.3V is not sufficient)
- RX, 2; PA2, USART2_TX
- TX, 3, PA3, USART2_RX
- GND, 4; ground
Note: when connecting multiple meters one the same UART bus only keep one of the pull-up resistors (across all meters) on the TX pin (on the opto-coupler output), else the low level is not low enough for the micro-controller to correctly decode the signal.
This 1-phase 2-wire electricity meter provides an RS-485 interface using the ModBus RTU protocol.
For the 3-phase 4-wire power distribution installation I used 3 meters, one per phase.
They can be connected to the same RS-485 bus once individual addresses have been set.
The used meter IDs (aka. slave address) are hard coded in `main.c`
A UART to RS-485 converter is used to be able to communicate with the meters.
The SDM120 ModBus protocol document provide by Eastron specify the commands and registers, but the timing (important) is specified in the SDM630 ModBus protocol document.
Connections 3xSDM120 <-> board:
- VCC; +5V
- GND; ground
- DI; PB10, USART3_TX
- DE; PB1 (shared with RE since one is active low while the other is active high)
- RE; PB1 (shared with DE since one is active low while the other is active high)
The ESP-01 WiFi module (based on the ESP8266 chip) is used to join the local network, connect to an InfluxDB database using HTTP, and store the measurement values gathered from the electricity meters.
Once all measurements from all meters have been collected, the firmware will connected to the InfluxDB database to submit the values using and HTTP POST request.
The hostname, port, database name, user name, and password are hard coded in `main.c`.