98 lines
3.4 KiB
Markdown
98 lines
3.4 KiB
Markdown
the spark counter is a custom electricity meter with wireless data logging capability.
|
||
|
||
on one side I have:
|
||
* peacefair PZEM-004 power meter to measure the electricity consumption
|
||
* ATmega328P micro-controller to read the measurements out
|
||
* nRF24L01+ radio to transmit the values
|
||
|
||
on the other side:
|
||
* nRF24L01+ radio to receive the values
|
||
* Raspberry Pi single board computer to store the measurements in an influxDB time series database
|
||
* grafana graphical monitoring tool to display the electricity consumption
|
||
|
||
more information is available in the [wiki](https://wiki.cuvoodoo.info/doku.php?id=spark_counter).
|
||
|
||
arduino_nano
|
||
============
|
||
|
||
Arduino Nano firmware for the remote power meter side of the spark counter.
|
||
|
||
the source files are written in C and intended for the Atmel ATmega328P micro-controller.
|
||
This does not use the Arduino IDE.
|
||
It requires avrdude and avr-libc.
|
||
|
||
Connect the peacefair PZEM-004 power meter to the UART port of the Arduino Nano and the nRF24L01+ radio transceiver to the SPI port (detailed information in `nrf24.h`).
|
||
The spark counter firmware will periodically read the measurement values from the power meter (voltage, current, power, energy) and send them using the radio transceiver.
|
||
|
||
The destination address and channels for the radio communication can be set in EEPROM.
|
||
The format is the following:
|
||
- 4 bytes source address
|
||
- 4 bytes destination address
|
||
- 1 byte channel number
|
||
- 1 byte CRC8-ibutton checksum over the previous data
|
||
The default values are defined in `main.h` but will be overwritten by the raw EEPROM data in `eeprom.bin`.
|
||
Don't forget to use `make eeprom` to write the configuration data on the micro-controller.
|
||
|
||
The source code is interrupt driven when possible (timers, USART, SPI, nRF24 IRQ).
|
||
|
||
Arduino - nRF24L01+ connection
|
||
------------------------------
|
||
|
||
ATmega328P signal,ATmega328P pin,Arduino Nano pin,nRF24L01+ board pin,nRF24L01+ signal
|
||
GND,GND,GND,1,GND
|
||
,3V3 (add cap.),2,VCC
|
||
I/O,PB1,D9,3,CE
|
||
SS,PB2,D10,4,CSN
|
||
SCK,PB5,D13,5,SCK
|
||
MOSI,PB3,D11,6,MOSI
|
||
MISO,PB4,D12,7,MISO
|
||
INT0,PD2,D2,8,IRQ
|
||
|
||
rpi
|
||
===
|
||
|
||
Raspberry Pi program for the computer side of the spark counter.
|
||
|
||
the source files are written in C and require the [RF24 library](https://tmrh20.github.io/RF24/RPi.html) for the nRF24L01+ radio transciever and libcurl to save the measurement data in the influxdb time series database.
|
||
|
||
on the Raspberry Pi the [raspian](https://www.raspberrypi.org/downloads/raspbian/) OS is installer and the bcm2835 SPI kernel module is enabled (through `rasp-config`).
|
||
|
||
connect to nRF24L01+ to the SPI port of the Raspberry Pi and set up an influxdb database.
|
||
|
||
note
|
||
----
|
||
|
||
if you see the following error while compiling the RF24 eamples:
|
||
error: ‘sleep’ was not declared in this scope
|
||
add the folling line to the corresponding source file:
|
||
#include <unistd.h>
|
||
error seen in `gettingstarted.cpp`, `gettingstarted_call_response`, and `transfer.cpp`
|
||
|
||
RPi - nRF24L01+ connection
|
||
--------------------------
|
||
|
||
RPi signal,RPi pin,nRF24L01+ board pin,nRF24L01+ signal
|
||
GND,P1_20,1,GND
|
||
+3V3,P1_17,2,VCC
|
||
GPIO25,P1_22,3,CE
|
||
GPIO8/CE0#,P1_24,4,CSN
|
||
GPIO11/SCLK,P1_23,5,SCK
|
||
GPIO10/MOSI,P1_19,6,MOSI
|
||
GPIO9/MISO,P1_21,7,MISO
|
||
GPIO24,P1_18,8,IRQ
|
||
|
||
pzem-004_probe.rb
|
||
=================
|
||
|
||
a simple script to query measurement values from the peacefair PZEM-004 power meter.
|
||
connect the power meter UART port using a USB to UART converter.
|
||
|
||
TODO
|
||
====
|
||
|
||
arduino_nano:
|
||
- use encryption for the RF communication (AES-128)
|
||
|
||
rpi:
|
||
- provide influxdb hostname, username, and password as parameter
|