Arduino Leonardo (ATmega32U4) and RFM12B

I've just managed to get an RFM12B hooked up to an Arduino Leonardo. It's been a bit of port mapping nightmare!

The ATmega 32U4's  'special function' ports such as PWM, IRQ, SPI etc are quite different to the ATmega328. The Arduino port mapping table proves very useful, if a little difficult to interpret. I made a re-arranged table with the ports re-arranged into function groups. I'll publish it once I've tidied it up.

Once of the main differences is that the hardware ISP connections are no longer on digital pins 10,11,12 and 13. On the Leonardo they are

MISO -  Digital 14
SCK -   Digital 15
MOSI - Digital 16
SS -      Digital 17 

Unlike on the Arduino Uno These SPI pins are not accessible through any of the digital I/O pins, on om the Leonardo, their only accessible through the ICSP header. The SPI SS pin on the Leonardo is not broken out anywhere on the board, strangely it's used for the Rx LED. Can anyone explain why this is the case? It's not a big problem, we can use another pin as SS, digital 10 in this case.

The IRQ Interrupt connection is made to Digital 3 (INT0). This has moved from Digital 2 on the Arduino Uno.

The SEL connection is the same as with the Arduino UNO/ATmega328 goes to digital 10.

See the RFM12B documentation page for general info on RFM12B and details of how to interface with ATmega328: . 

Arduino Leonardo Connections to RFM12B via JeeLabs RFM12B breakout for level shifting to 3.3V
ICSP Header
Now the hardware is complete it's time to tackle the software. We use the RFM12B driver as part of the JeeLib library from JeeLabs: The library needs to be installed in the Arduino library's folder in the usual way. Arduino 1.0.1 is needed to be compatible with Leonardo.

To make the JeeLib library work with the Leonardo and RFM12B (hooked up as above) the following needs to be inserted into the RF12.cpp file on line 62 before the else // ATmega168, ATmega328, etc.

No change to RFM12.cpp is needed, just download the latest version, see update below.

#elif defined(__AVR_ATmega32U4__)

#define RFM_IRQ     0   //PD0, INT0, Digital3 
#define SS_DDR      DDRB
#define SS_PORT     PORTB
#define SS_BIT      6   //Dig10, PB6

#define SPI_SS      17     // PB0, pin 8, Digital17
#define SPI_MISO    14     // PB3, pin 11, Digital14
#define SPI_MOSI    16     // PB2, pin 10, Digital16
#define SPI_SCK     15     // PB1, pin 9, Digital15

I'm going to send JCW a git pull request to see if these changes can be integrated into the JeeLib library so it should work 'out of the box' in the future.

Update: Pull request has been merged, RF12 part of JeeLib Arduino library now has ATmega32U4 support :-) . Download it here:

For a simple RFM12B transmission demo/example see:

I'm planning on using the ATmega32U4 in the emonTx SMT that I'm currently working on. Spot the common thread in my last few blog posts!

High Accuracy Current Measurement Over a Wide Range

Measuring the current in a domestic property using a clip-on CT sensor can be quite challenging since the range in which it has to work over is very large, potentially several order of magnitude: up to 25000W and down to a few 10'sW. We would like to have good accuracy over this wide range. 

We have been exploring how to improve on the current emonTx. Robert Wall has written a page detailing the measurement implications of current emonTx ADC resolution at low current values when using the standard 100A max CT sensor and 18R burden resistor. 

A while back we came across an application note from ATmel detailing how to build a fully featured energy monitor using CT sensor, AC voltage measurement and the ATmega328 MCU. App-notes are a fantastic source for open-source hardware information. The ATmel energy monitor app-note is very comprehensive and well written. It's even got a Bill of Materials that specs down to individual resistors complete with their corresponding Farrnel order codes! 

Download the app-note .pdf here:

Diagram from Atmel app-note - potential divider resistor values where changed to enabled the AC signal to be biased to Vcc/2
The app-note circuit achieves good resolution and accuracy over a wide range by having a adjustable op-amp gain stage. Using the resistor values in the inverting op-amp the gain can be switched from -1.25, -10.26 and -69.11. The gain is switched by digital switching the Bilateral Switches (74HC4066). The gain of the op-amp is calculated as follows:

A couple of days a ago we built up a prototype of the above circuit, more an an exercise to check we can make it work rather than a scientific test, this would be difficult on a breadboard due to the sub-optimal circuit layout. A spare emonTx PCB was used as an easy way to connect the circuit up to an ATmega328 and RFM12B.

Adjustable gain op-amp CT sensor circuit - prototype 

ATmega 328 ADC sample using VI sampler
The circuit worked first time with no hiccups. The above waveform is the RAW output from an ATmega 328's ADC, where one 100W light bulb and 30W laptop PSU was connected to the AC circuit being monitored. The high gain stage (x69.11) was active. To put this in perspective if the same sample was run on the current emonTx the signal would be so small as to be only just visible on the VI sampler. The spikes at the peak of the waveform is caused by the laptop's switch-mode PSU. The significantly increased amplitude of the signal will improve accuracy when monitoring low power levels. The app-note suggests accuracy of <1% over a wide range, possibly even better with careful PCB design. 

Although this multi-gain op-amp circuit adds significant complexity over the current emonTx current monitoring circuit it can be added for relatively low cost. One quad op-amp and two quad bilateral switches IC's cost about £1, this is enough for 4 x CT channels. We're planning to use this circuit design in the forthcoming emonTx SMT. As the name suggests this board will be designed for SMT components and will be assembled by pick-and-place. See this forum thread for a discussion regarding ideas for the emonTx SMT. Design is progressing well, more details on this soon. 

Installing emoncms on a raspberry pi

Update: we now have a more complete guide for installing emoncms on the Pi here:

Just got emoncms installed and running on the raspberry pi here, here are my installation notes:

1) Initial setup
Download the debian squeeze image from: and write to an SD card, following the guide here:

Insert the sd card into the pi, power it up connect up a screen, a keyboard and ethernet.

2) Enable SSH (optional)

You may at this point like to enable ssh in order to do the rest of the setup remotely from your 'normal' computer (running the pi in headless mode). I followed this guide, The main steps are:

$ sudo bash (Not sure if this is needed, apparently it is useful when performing a series of administrative tasks)

Crease a public RSA key:

$ ssh-keygen -t rsa

It will ask where you would like it saved and a pass-phrase, skip these questions by pressing enter. Once finished and the pattern has appeared enter the followin to enables ssh at boot:

$ sudo mv /boot/boot_enable_ssh.rc /boot/boot.rc

Then to start ssh:
$ sudo /etc/init.d/ssh start

Find the IP address of your pi ($ ifconfig -a) and then from your computer login to the raspberry pi via ssh, for example:

$ ssh [email protected]
(password: raspberry)

3) Update repositories
It may be worth making sure that all packages are up to date at this point:

$ sudo apt-get update

4) Install mysql

$ sudo apt-get install mysql-server mysql-client

When the blue dialog appears enter a password for root user, note the password down as you will need it later.

5) Install apache2

$ sudo apt-get install apache2

If apache fails to start (as it did for me) run the following:

$ sudo groupadd www-data
$ sudo usermod -a -G www-data www-data

6) Install php

$ sudo apt-get install php5 libapache2-mod-php5

$ sudo apt-get install php5-mysql

7) Enable mod rewrite

$ sudo a2enmod rewrite

$ sudo nano /etc/apache2/sites-enabled/000-default

Change (line 7 and line 11), "AllowOverride None" to "AllowOverride All".
Save and exit.

8) That completes the server installation, restart the server to make everything above operational:

$ sudo /etc/init.d/apache2 restart

Installing emoncms:

7) Install git (optional)

$ sudo apt-get install git-core

Follow this tutorial on creating keys etc:

Finally to download, in the /var/www folder type:

$ git clone [email protected]:openenergymonitor/emoncms3.git

Alternatively download emoncms and unzip to your server:

8) Create a MYSQL database

$ mysql -u root - p

Enter the mysql password that you set above.
Then enter the sql to create a database:

mysql> CREATE DATABASE emoncms;

9) Set emoncms database settings.
In the folder emoncms3/Includes rename default.settings.php to settings.php. In settings.php enter your mysql username (root) and password, host (localhost) and database name (if as above - emoncms).

10) In an internet browser, load emoncms:


That's should be it!

Next step is to get a jeelink running to receive and forward data from the emontx to the emoncms installation. Will update shortly.

emonTx single AC power supply - Part 1 Simulation

The current emonTx V2.x can monitor AC voltage, real power, power factor and direction of current flow, this is possible by using a plug-in 9V AC-AC transformer to provide a stepped-down AC voltage waveform. See Measuring AC Voltage with an AC to AC power adapter in the building blocks section for more details. The emonTx also requires an additional (separate) DC power source, this is usually provided by a 5V USB plug-in adaptor.

Obviously it's desirable to do away with one of the power supplies and to use the AC-AC adapter to provide both the AC signal and the DC power to the emonTx. Early tests indicated that using the AC signal to provide a DC power supply adversely effected the quality of the AC signal and therefore the voltage and real power reading of the emonTx. Full wave rectification with a bridge rectifier creates a power supply with floating supply rails and loading the AC-AC adaptor caused distortion of the AC sine wave sample signal.

There has been an interesting form thread on the topic of using a single AC power supply for the emonTx. There were number of suggestions for circuits to achieve this. Many of the circuits suggested looked feasible but some added considerable complexity and components such as centre-tapped or isolating transformers. We are keen to use an off-the-shelf certified power supply unit wherever direct connection to mains power is involved. 

Recently Robert Wall contacted us with a single AC power supply circuit design based on a half-wave rectifier and LDO linear voltage regulator. The circuit only requires an additional two capacitors, two diodes and one resistor to supplement the components we already have on the emonTx PCB. Robert has been very helpful offering his expertise and experience as an Electronic Engineer to the project. The technical testing report on the SCT-013-000 CT and Mascot AC-AC adapter in the building blocks section are all Robert's work. 

Note: this circuit design is still in development, we are currently at the simulation stage

Fig1. Half wave rectifier AC-DC power supply and AC voltage sample 
The key to Robert's circuit is current limiting resistor R1, this limits the current draw from capacitor C1. The resistor value was chosen to attempt to charge C1 gradually over the positive half cycle. See the labelled waveforms below to see how this works in practice simulation! C2 is a de-coupling capacitor and R3-R5 reduce the AC sample to the correct magnitude and bias ready to be sampled by the ATmega328 ADC. 
Fig2. Simulation waveforms under normal operating conditions
To demonstrate the effect of the current limiting resistor R1 the simulation was ran with R1= 1 ohm, see the labelled waveforms in Fig.3 below. The capacitor C1 now charges up quicker drawing more current from the AC-AC adapter, this loads the adapter creating a 'dip' in the AC sample waveform. This will negatively effect the voltage and real power reading on the emonTx. 
Fig. 3 Demonstrating the effect of low value current limiting resistor R1
Simulation has indicated that with a current draw of about 8mA (ATmega328) and using the Mascot AC-AC power adapter with a mains voltage of about 240Vrms results in a -6mV difference in the Vrms of the sample waveform when compared with a perfect sine wave. This should be small enough to not adversely effect the AC voltage and real power reading, a tweaking of the calibration will probably be required.

The next step is to move beyond the virtual; build up a prototype to see if it performs in practice like the simulation suggests!

I've posted the LTspice simulation files used to generate the simulation waveforms on the forum:

View your power data as a histogram in emoncms

This blog post details how to view your power data as a histogram in emoncms. This is a really useful feature implemented in emoncms by Paul Allen  (MarsFlyer on Gitub: So a really big thank you to Paul for this!

The histogram shows the energy (KWh) used at a particular power (watts) which allows analysis of what types of devices (low / medium / high) are using the most energy. 

Here is the histogram visualisation for my house, embedded directly from emoncms.
Click on a particular day to see a histogram of that day:

Viewing your power data as a histogram

1) Send power data to emoncms see here for details of doing this with an emontx and emonbase: see Build a home electricity energy monitor

2) Click on the power input to bring up the input configuration page. Set up processes as in the screenshot, one power process, one kwhd process and one histogram process:

3) Click on Feeds to bring up the feed/list page, click on the histogram feed:

4) In the histograms feed/view page click on the graph type histogram:

5) Once you have been logging histogram data for a few hours you will start to see histogram bars form at the different levels of power that you use. This histogram graph shows energy used at a particular power for all time. So is a really useful tool for measuring what is the total energy used by the electric immersion water heater for example, we've used 62 kWh @ 3500W since April 13th.

6) To view your histogram data at a daily basis as in the first embedded visualisation above enter your feed id's and apikey in the following emoncms visualisation url:

All the source code for the histogram functionality is available in the main emoncms3 repository on github

Paul Allen has achieved some remarkable reductions in energy use over the last 4 years and uses a version of the histogram beautifully to visualise the changes, see his blog post here: Personal experiences of saving 42% on my electricity use

Measurement of heat loss in a hot water cylinder

Carrying on from the last blog post about measuring heat flux in and out of a hot water cylinder.

Heat loss from a hot water cylinder should be proportional to the temperature differential between the inside and the outside of the cylinder by a constant: Watts of heat loss per kelvin. See heat conductivity.

Watts of heat loss can be calculated from the temperature reduction per unit time of the average cylinder temperature. If we plot heat loss against average cylinder temperature we should get a linear relationship where the slope of the line of best fit is the heat loss factor, see graph 2 below.

This constant the heat loss factor for a particular cylinder is a useful measure in evaluating the performance of a cylinder.

My hot water is heated with a 3kW electric immersion heater. I wanted to know how much heat would be lost if I leave the immersion heater on all the time at a given temperature and so how much energy I could save by only putting the immersion heater on specifically when its needed i.e for a bath in the evening.

The results

I have selected a period of time here where both hot water and the immersion heater where not used. Leaving only solar hot water heat input and heat loss from the cylinder as the only drivers of the system. The solar hot water coil is in the bottom of the cylinder which heat's the cylinder relatively evenly compared with the immersion heater making it ideal for this test. I have filtered out all positive heat gain so that we can see the heat loss clearly:


The conclusion is that we are saving about 1.6 kWh/d from reduced heat loss (30C temperature difference over 23 hours), which is a good saving from something relatively easy to do. It may be that we are saving more than this from reduced hot water demand in the first place by not having hot water on tap all day but this is another thing to test.

If your monitoring hot water cylinder temperature It would be great to see how these figures compare.

Download the source code:

Measuring heat flux in and out of a hot water cylinder

The heat input into a solar hot water cylinder is usually measured using a flow meter and two temperature sensors. Flow meters are quite expensive and require plumbing work to install. At OpenEnergyMonitor we're all for non-invasive monitoring methods! So..

Can the heat flux in and out of a hot water cylinder (a fixed volume of water) be approximately calculated by measuring the average temperature change in the cylinder in kelvin per second and then multiplying by the volume of the cylinder and the specific heat of water?

This method may only require two temperature sensors so will be considerably easier and more affordable than installing a flow meter.

I've used an emonTx with two DS18B20 temperature sensors one positioned in the temperature sensor sleeve that is in the bottom half of the cylinder and the other positioned in the temperature sensor sleeve in the top half of the cylinder. The emontx is also monitoring the solar hot water collector temperature, controlling the solar hot water system and monitoring house electric consumption and solar pv electricity generation :)

Calculating heat flux
Heat Flux (Watts J/s) = Specific heat of Water (4186 J/kg/K) x Volume of cylinder (Litres) 
x temperature change per second (K/s)
The result
The heat flux is the blue plot and average cylinder temperature is the red plot. I have selected a period of time where the electric immersion heater is on. Feel free to explore the data by using the zoom and pan buttons.

I'm surprised by how good the initial results seem to be. I know that the electric immersion heater consumes about 3400W from my electricity monitoring and the heat flow input calculated via the above method gives pretty much the same power input plus or minus a few hundred watts or so.

Questions for further development
What is the minimum number of temperature sensors needed and what are their optimum positions to give best results? What is the effect of stratification?

Download the source code:

Emoncms multilingual support

The latest update to emoncms adds a basic implementation of multilingual support.

Adding a language

1) Make a copy of the folder Views/en and call it the language your creating a translation for, i.e cy for welsh:

.. or use a language that has already been translated from the emoncms_languages repo, i.e cy... (feel free to send a pull request with your translations)

2) If your creating a new translation, translate each view script inside your language folder.

3) Add your language to the language options in index.php:

Change the line:
$lang =  $_GET['lang']; if ($lang=='en') $_SESSION['lang'] = $lang; else $lang = null;

to (with your chosen language code)
$lang =  $_GET['lang']; if ($lang=='en' || $lang=='cy') $_SESSION['lang'] = $lang; else $lang = null;

2) Add your language to the user_view language selector.
Until a better implementation is created, this needs to be done for each language.
In Views/en/user_view.php

add (or your chosen language)

<option value="cy">Welsh</option>

<option selected value="en">English</option>

Repeat this for the user_view that belongs to the language your adding and set the selected attribute to the added language.

Any thoughts on a better way of implementing this is as always welcome.

emonGLCD Solar PV PWM LED Proportional Indication

The tri-colour LED's on the emonGLCD V1.3 are connected the the hardware digital PWM lines on the Atmega328. This allows the brightness to be smoothly controlled in 0-255 steps.

Up-until now we have not made use of this feature.

The video below shows a demo of Solar PV generation and power consumption ramping up and down. The tri-colour LEDs smoothly increase in intensity green or red depending on the amount of power being imported or exported.

This should serve as a nice at-a-glance visual indicator to how much power is being imported or exported at any given time. At the moment the example has been configured so that the LED's are at their brightest when 4kW's are being exported or imported. In the future it would be great if the display learnt what size PV system (kWp) is installed.

It would be possible to implement a similar feature on the Home Energy Monitor display to indicate the level of power being consumed, but this will have to be done carefully not to annoy the user! The problem with this is what constitutes a high level of consumption? To be useful the display needs to 'learn' what's high and what normal level of consumption.

Thanks to Rob Walker and the discussion on this thread for help in implementing this. Rob has also implemented proportional control of the white LED backlight level based on the light level in the room measured by the on-board light sensor (LDR)..nice!

All these changes and some other minor improvements have been committed to the emonGLCD github repository: Please test and report feedback on the forums.

Update: The single CT Home Energy Monitor emonGLCD example sketch has been updated to also include proportional red LED PWM brightness control corresponding to the amount of energy being consumed.