Let’s start this blog out by looking at a project..
So, wouldn’t it be cool to have the ultimate open source (well, mostly) indoor/outdoor thermo- and hygrometer with multiple wireless sensors and a sleek HTML5 based interface? Of course it would! I’m not the first one to make one of these. In fact, the guy who made the Arduino library for the radio modules I’m going to use has made something very similar: Low-Power Wireless Sensor Node
I often pick my projects in order to learn some new skill or technology. But in this case there’s also a potentially useful gadget in the end. The new technologies for me this time will be energy-efficient embedded design, wireless communications, backend design (perhaps even some NoSQL), and a dynamically updated HTML5 frontend. Oh, and responsive design. It must look nice on both “real” computers and tablets/phones.
Some preliminary features and specifications:
- Raspberry PI as base station
- nRF24L01+ based radio modules
- DHT22 temperature & humidity sensors
- Battery-powered Atmel ATTiny based sensor boards
- Arduino Uno as prototype platform for the sensor boards
- HTML5 based frontend (WebSockets, SVG graphics, …)
- Database backend that stores all measurements (perhaps MongoDB)
Let’s look over these features one by one.
Raspberry PI as base station
Every hobby project needs either a Raspberry PI or an Arduino to score blogosphere points, amirite? Besides, it’s also offers good value for money. At Open Space Aarhus, my friendly local hackerspace, we recently did a group-buy of these. We ended up paying 275 DKK (approx. $47) including taxes and shipping for a B-model. That’s not too bad considering the Danish 25% VAT..
But why a Raspberry Pi, you might ask. Well, besides its relatively powerful CPU, good Linux support, and built-in LAN interface, it also provides hardware SPI pins in its GPIO header. This is very useful for communicating with the radio modules described below.
nRF24L01+ based radio modules
I used to think that 2.4GHz wireless modules were too expensive for a project like this. Not anymore! These bad boys cost me $1.20 apiece on Ebay. I got 10 of them, so if I don’t break any I’ll end out with 10 wireless sensor modules. The nRF24L01 chip (and cheap modules) has become quite popular among hobbyists it seems. Well, count me in. So instead of messing around with RF design and other low-level radio stuff, I can concentrate on a nice and tidy SPI based interface where all the gritty details have been taken care of. It’s even battery-friendly due to its multiple sleep modes. More on this later…
For the base station I’ve chosen a much more potent radio module. It uses the same chip, but with additional amplifiers and a proper antenna. It cost me more than all the other radio modules combined, but it’s an attempt at extending the range of the system. Besides the amplifiers, the board is more or less identical to the others. The pin header is exactly the same.
Of course, someone already implemented an Arduino library for these modules: Getting Started with nRF24L01+ on Arduino
It has even been ported to work with the SPI hardware on the Raspberry PI: RF24RP
It took me a bit of debugging to get the example code running on the Pi. I’ll get back to that in a later post.
DHT22 temperature & humidity sensors
There’s not much sense in making sensor nodes without sensors. I considered several alternatives until I noticed the DHT22 sensor type. It’s a combined temperature and humidity sensor with a very good range (0…100% RH and -40…125 degrees Celsius) and adequate precision for this purpose (+/- 2-5% RH and +/- 0.5 degrees Celcius).
I found a great deal on AM2302 sensors on Ebay. They are basically the same as DHT22. My preliminary tests indicate that they are sufficiently accurate.
Adafruit has made an Arduino library for it: DHT-sensor-library
Battery-powered Atmel ATTiny based sensor boards
In order for this project to be a success, the sensor nodes must be able to run for several months between battey changes. It might be better to pursue other architectures than Atmel AVR (e.g. the very power efficient TI MSP430 series), but the Atmel MCUs are familiar to me.
At some point I will draw up some PCBs for this. Stay tuned…
Arduino Uno as prototype platform for the sensor boards
At the early stages of the project, it’s nice to have a simple prototype platform. I’m using an Arduino for this. When the code starts to mature, I’ll switch to a custom prototype board based on an ATTiny chip.
HTML5 based frontend (WebSockets, SVG graphics, …)
Continuously updating sensor measurements provide a nice real-life data source for a dynamic HTML5 website. More on this later…
Database backend that stores all measurements (perhaps MongoDB)
I want to store all measurements in order to make various statistics. Both simple stuff like the temperature development during the last 24 hours as well as more advanced calculations are interesting. More on this later…
Next stop: Make prototype perf board hardware