ATmega (Arduino) decoding of Blue Line Innovations [PowerCost Monitor™](http://www.bluelineinnovations.com/powercost-monitor-2 "PowerCost Monitor™") and Black & Decker [Power Monitor EM100B](http://servicenet.blackanddecker.com/Products/Detail/EM100B "Power Monitor EM100B") real time household electricity consumption data. Forked from CapnBry/Powermon433 to provide a simple serial logger and some usage instructions.
Tested with:
A working PowerCost Monitor™ or Power Monitor EM100B (the meter transmitter is identical) installation is assumed.
#define DEFAULT_TX_ID 0xfff8
line in the Arduino sketch to use
your device ID. This way, your installation will default to
decoding your meter, and won't need the monitor button pressed
every time you restart your Arduino. Once you're satisfied that you
have your ID set correctly, you may wish to ‘lock’ the ID by
uncommenting the #define TX_ID_LOCK
line and re-uploading the
sketch to your Arduino.#define TEMPERATURE_F
line. But don't blame me if you get haunted
by ghostly 18th century European oxter guff …If you're having difficulties, Bryan's original sketch prints more diagnostic messages than this one. If you are using a wire antenna, check it's the right length …
The RFM69 receiver boards described by Bryan (see below) are lovely, but:
If you don't want to use an RFM69, you really want to use a superheterodyne 433.92 MHz receiver instead of a super-regenerative receiver board.
A superheterodyne board:
A super-regenerative board:
These boards often have repeated pads. The one I'm using (marked “3953 A434”) works for me when connected as follows:
Board Arduino
===== =======
GND → GND
DATA → D8
DATA → D8
+5V → 5V
…
+5V → 5V
GND → GND
GND → GND
ANT → Antenna (164.5 mm wire as simple ¼-wave monopole)
The antenna length is critical. I had initially cut mine to 168 mm, and it didn't work at all.
The Parallax 433 MHz RF Transceiver uses a Linx TRM-433-LT transceiver chip, and comes with a nice stub antenna attached. Wiring is simple:
Board Arduino
===== =======
1 GND → GND
2 VIN → 5V
3 DATA → D8
4 TX/RX → 5V
5 PDN → GND
6 RSSI → not connected
Although this board is expensive, it's:
If time is money for you, the Parallax might be a good option.
Data line from a superheterodyne receiver should in run to pin Digital 8. I've tried using a superregenerative receiver but the sensitivity was too low to receieve anything. Your results may be better than mine.
To use an RF69 / RFM69W / RFM69HW / RFM69CW / RFM69HCW connect:
RFM Arduino
=== =======
NSS → D10
MOSI → D11
MISO → D12
SCK → D13
DIO2 → D8
ANA → Antenna (164.5 mm wire as simple ¼-wave monopole)
GND → GND
3.3V → 3V3
With the RF69 module, a frequency of 433.845MHz is tuned with a 50khz receive bandwidth. My module can receive data on this frequency right down to a 1.3Khz bandwidth so I am pretty sure this is accurate. The AFC and FEI blocks don't appear to work no matter where I trigger them, so I can't use them to adjust the frequency. Perhaps they only work on FSK and this is ASK/OOK.
Standard auto LNA gain and 'peak' mode OOK threshold are used which does a good job of adjusting receiver sensitivity. The module registers are assumed to be at their default values on startup, so be sure to reset the module if switching from code that uses packet or FSK mode.
Use a 164.398mm wire antenna for quarter wavelength monopole.
Included in this package is a not-very-well-thought-out example script
loop.sh
you can run to log data from your power monitor. Check the
comments for requirements.
Arduino boards reset if a new serial connection is made. It's by design more than anything else, but is annoying if you're making many short logging runs. In theory, for an Arduino Uno, you can put a 10 µF capacitor across, but I haven't had much success with that.
As I'm only logging a file once a day, it's not so much of a problem for me.
The temperature decoding may not exactly match the display, mainly because we're using a simple lookup table and interpolating values. The temperature sensor can be inaccurate anyway, as it's in a black box often in full sun, and it will often read +10°C over ambient.