Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision |
spark_counter [2015/10/25 18:40] – add pictures kingkevin | spark_counter [2015/12/07 15:36] – add Orange Pi kingkevin |
---|
The spark counter is a custom electricity meter. | The spark counter is a custom electricity meter with wireless data logging capability. |
| |
On one side I have: | On one side I have: |
* a [[#Raspberry Pi|Raspberry Pi single board computer]] to store the measurements in an [[https://influxdb.com/|influxDB time series database]] | * a [[#Raspberry Pi|Raspberry Pi single board computer]] to store the measurements in an [[https://influxdb.com/|influxDB time series database]] |
* a [[http://grafana.org/|grafana graphical monitoring tool]] to display the electricity consumption | * a [[http://grafana.org/|grafana graphical monitoring tool]] to display the electricity consumption |
| |
| {{:spark_counter:dsc02371.jpg?0x300|complete spark counter}} |
| |
====== peacefair PZEM-004 ====== | ====== peacefair PZEM-004 ====== |
| |
The [[http://www.aliexpress.com/wholesale?catId=0&SearchText=peacefair|peacefair]] [[http://www.aliexpress.com/wholesale?catId=0&SearchText=peacefair+pzem-004|PZEM-004]] is a simple power meter. | The [[http://www.aliexpress.com/wholesale?catId=0&SearchText=peacefair|peacefair]] [[http://www.aliexpress.com/wholesale?catId=0&SearchText=peacefair+pzem-004|PZEM-004]] is a simple power meter ({{:spark_counter:peacefair_pzem-004_porduct.pdf|datasheet}}). |
It: | It: |
* measures voltages 80-260 V AC | * measures voltages 80-260 V AC |
* provides a TTL UART port to query these values (or set an alarm so to beep when a provided power threshold is reached) | * provides a TTL UART port to query these values (or set an alarm so to beep when a provided power threshold is reached) |
| |
{{:spark_counter:dsc02361.jpg?0x200|}} | {{:spark_counter:dsc02361.jpg?0x200|PZEM-004 front}} |
{{:spark_counter:dsc02359.jpg?0x200|}} | {{:spark_counter:dsc02359.jpg?0x200|PZEM-004 back}} |
| |
The voltage measurement is done over the power input port. | The voltage measurement is done over the power input port. |
A drawing on the back of the device will describe how to connect the wires. | A drawing on the back of the device will describe how to connect the wires. |
| |
{{:spark_counter:dsc02328.jpg?0x200|}} | {{:spark_counter:dsc02328.jpg?0x200|PZEM-004 opto-couplers}} |
| |
The meter also provides a UART port to query the measured values. | The meter also provides a UART port to query the measured values. |
I removed the pizeo-element to prevent this annoying sound. | I removed the pizeo-element to prevent this annoying sound. |
| |
{{:spark_counter:dsc02344.jpg?0x200|}}{{:spark_counter:dsc02325.jpg?0x200|}}{{:spark_counter:dsc02327.jpg?0x200|}} | {{:spark_counter:dsc02344.jpg?0x200|PZEM-004 board front}} |
| {{:spark_counter:dsc02325.jpg?0x200|PZEM-004 board back}} |
| {{:spark_counter:dsc02327.jpg?0x200|PZEM-004 board IC}} |
| |
The power meter uses a single chip solution, the [[http://www.sdicmicro.com/products.html?ic=SD3004|SDIC microelectronics SD3004]] ({{:spark_counter:sd3004_datasheet_v0.2c.pdf|datasheet}}). | The power meter uses a single chip solution, the [[http://www.sdicmicro.com/products.html?ic=SD3004|SDIC microelectronics SD3004]] ({{:spark_counter:sd3004_datasheet_v0.2c.pdf|datasheet}}). |
====== ATmega328P ====== | ====== ATmega328P ====== |
| |
| {{:spark_counter:dsc02354.jpg?0x200|development board}} |
| {{:spark_counter:dsc02365.jpg?0x200|development setup}} |
{{ :spark_counter:ic_dev_arduino_nano-30.svg?400|Arduino Nano pinout}} | {{ :spark_counter:ic_dev_arduino_nano-30.svg?400|Arduino Nano pinout}} |
| |
| |
USART to query the power meter, SPI to communicate with the nRF24L01+, and the nRF24L01+ protocol are implemented in C (using a lot of interrupts). | USART to query the power meter, SPI to communicate with the nRF24L01+, and the nRF24L01+ protocol are implemented in C (using a lot of interrupts). |
The source code is available [[https://to.do|in this git]]. | The source code is available [[https://git.cuvoodoo.info/kingkevin/spark_counter/tree/master|in this git]]. |
I prefer directly writing in the registers as described in the [[http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf|datasheet]] rather than using an [[https://www.arduino.cc/en/Main/Software|abstract IDE]] and [[https://github.com/TMRh20/RF24|libraries]]. | I prefer directly writing in the registers as described in the [[http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf|datasheet]] rather than using an [[https://www.arduino.cc/en/Main/Software|abstract IDE]] and [[https://github.com/TMRh20/RF24|libraries]]. |
This way I learn how it works in details. | This way I learn how it works in details. |
====== nRF24L01+ ====== | ====== nRF24L01+ ====== |
| |
{{:spark_counter:dsc02353.jpg?0x150|}} | {{:spark_counter:dsc02353.jpg?0x150|nRF24L01+ module}} |
{{ :spark_counter:nrf24l01_pinout.jpg?250|nRF24L01+ pinout}} | {{ :spark_counter:nrf24l01_pinout.jpg?250|nRF24L01+ pinout}} |
| |
| |
On the [[#ATmega328P|micro-controller]] side I implemented the complete SPI-based protocol using the [[https://www.nordicsemi.com/eng/content/download/2726/34069/file/nRF24L01P_Product_Specification_1_0.pdf|datasheet]]. | On the [[#ATmega328P|micro-controller]] side I implemented the complete SPI-based protocol using the [[https://www.nordicsemi.com/eng/content/download/2726/34069/file/nRF24L01P_Product_Specification_1_0.pdf|datasheet]]. |
The source code is available [[https://to.do|in this git]]. | The source code is available [[https://git.cuvoodoo.info/kingkevin/spark_counter/tree/master|in this git]]. |
| |
On the [[#Raspberry Pi|computer]] side I use the [[https://github.com/TMRh20/RF24|RF24 library]]. | On the [[#Raspberry Pi|computer]] side I use the [[https://github.com/TMRh20/RF24|RF24 library]]. |
====== Raspberry Pi ====== | ====== Raspberry Pi ====== |
| |
| {{:spark_counter:dsc02375.jpg?0x200|RPi setup}} |
{{ :spark_counter:pi-gpio-header-26-sm.png?200|RPi P1 header}} | {{ :spark_counter:pi-gpio-header-26-sm.png?200|RPi P1 header}} |
| |
| |
To receive the measurements I used a [[#nRF24L01+|nRF24L01+ transceiver]] with the [[https://github.com/TMRh20/RF24|RF24 library]]. | To receive the measurements I used a [[#nRF24L01+|nRF24L01+ transceiver]] with the [[https://github.com/TMRh20/RF24|RF24 library]]. |
The source code is available [[https://to.do|in this git]]. | The source code is available [[https://git.cuvoodoo.info/kingkevin/spark_counter/tree/master|in this git]]. |
The values are then simply stored in an [[https://influxdb.com/|InfluxDB]] time series database for visualisation in [[http://grafana.org/|grafana]]. | |
| |
[[http://elinux.org/RPi_Low-level_peripherals#P1_Header|RPi]] - nRF24L01+ connection: | [[http://elinux.org/RPi_Low-level_peripherals#P1_Header|RPi]] - nRF24L01+ connection: |
| GPIO9/MISO | P1_21 | 7 | MISO | | | GPIO9/MISO | P1_21 | 7 | MISO | |
| GPIO24 | P1_18 | 8 | IRQ | | | GPIO24 | P1_18 | 8 | IRQ | |
| |
| The values are then simply stored in an [[https://influxdb.com/|InfluxDB]] time series database for visualisation in [[http://grafana.org/|grafana]]. |
| |
| {{:spark_counter:grafana.png?0x200|grafana visualization}} |
| |
| ====== Orange Pi ====== |
| |
| There is no armel build of grafana for the Raspberry Pi, and compiling it from source wasn't possible because 256MB of RAM aren't enough. |
| Thus I tried to use a Orange Pi since it was also lying around. |
| |
| The [[http://www.orangepi.org/orangepipc/|Orange Pi PC]] is a cheap [[http://www.aliexpress.com/item/Orange-Pi-PC-ubuntu-linux-and-android-mini-PC-Beyond-and-Compatible-with-Raspberry-Pi-2/32448079125.html|$15 alternative]] to the Raspberry Pi 2. |
| This single board computer is based on an [[https://linux-sunxi.org/H3|Allwinner H3 (sun8iw7p1)]] SoC with ARM Cortex-A7 @ 1.8GHz, and 1 GB of RAM. |
| That should be plenty to compile and run grafana. |
| |
| For this price the hardware is unbeatable, but the software support is quite poor (outdated but indicating [[http://www.orangepi.org/Docs/FAQ.html|FAQ]]). |
| Only Android supports the video hardware acceleration currently. |
| The official [[http://www.orangepi.org/downloadresources/|images]] are old (e.g. Android 4.2.2), but there are newer images made available by the community: |
| * such as [[http://www.orangepi.org/orangepibbsen/forum.php?mod=viewthread&tid=755|Android]], with weird [[http://www.orangepi.org/Docs/SDcardinstallation.html#Install_Android_OS_image|installation process]] |
| * various [[http://www.orangepi.org/orangepibbsen/forum.php?mod=viewthread&tid=342|linux]] |
| Since I'll only use it as server I decided to go with debian jessie minimal. |
| |
| The pin header is the same as the [[http://www.raspberry-projects.com/pi/pi-hardware/raspberry-pi-2-model-b/rpi2-model-b-io-pins|40-pin Raspberry Pi]]. |