I bought a wireless thermometer, which had 2 wireless temperature sensors and a display unit. One of the sensors was suitable for measuring sauna temperature and other was meant for outdoor usage.
Well...it turned out that sensor in bathroom, measuring sauna temperature, was too far from the display unit located in living room and occasionally sauna temperature was not available. In overall wireless communication between sensors and display unit was rather unreliable.
I decided to build a proper wireless thermometer around Arduino Pro Mini. I wanted to have system with:
- Main unit with external LCD display.
- Display connected to main unit with cable so main unit box can be hidden below table/stand.
- Display with always on backlight
- Indoor-, outdoor- and sauna temperatures as well as date and time shown by display.
- Separate wireless sensor unit measuring outdoor and sauna temperature.
- No batteries involved, old mobile phone charger to supply power.
Temperature Sensor:
Naturally choice for a temperature sensor is Dallas DS18B20. It uses 1-Wire bus, which requires only single dedicated GPIO for the communication. In addition several sensors can be attached to the same line and Arduino has SW library support for it. After soldering wires to sensor TO-92 packages I covered those with few additional layers of heat shrink rubber tube to protect it from moisture.Wireless Link:
From DealExtreme.com I found cheap wireless module which can be used both as a receiver and a transmitter. The module is build around Nordic Semiconductor nRF905 chip. Its operation mode is controlled by 6 GPIOs and communication is handled via SPI bus.nRF905 chip itself supports 433/868/915MHz frequency bands. However module included built-in antenna for 433MHz so upper bands can not be used without changing the antenna. There were also available other models with connector for external antenna.
![]() |
| nRF905 wireless module |
Power supply voltage:
nRF905 power supply supports only voltages between 1.9V and 3.6V. This is a problem as I had only 5V Arduino Mini's available. Fortunately those were working just fine with lower voltage during testing period. In this application I haven't noticed any problems with supplying VCC from 3.3V regulator to both Arduino and wireless module. It also removes need for separate voltage level shifter between wireless module and GPIOs.Sensor Unit:
Sensor unit is located in the bathroom and it measures both outdoor and sauna temperatures. Temperature sensors are connected to it with 2..3 meters long wires, which are hidden behind crown molding. One of the sensors is wired outdoor via the vent close to unit.Sensor unit contains 3.3V regulator, Arduino Pro Mini and nRF905 wireless module. The whole system is powered by a external power supply.
![]() |
| Sensor unit components soldered to the vero board |
Temperatures are measured and sent to main unit once a minute. The whole unit is placed inside white plastic box and attached to to roof.
![]() |
| Sensor unit installed in the bathroom with sensor wires behind crown molding. Box lid is still missing in the picture. |
Main Unit + Display:
Similarly as sensor unit, main unit contains 3.3V regulator, Arduino Pro Mini and nRF905 wireless module. It also includes single sensor for measuring indoor temperature, LCD display and DS3231 RTC module.Display type is 2.8" TFT and it can be connected to Arduino via SPI. SPI bus availability was one of the main criteria for selecting this display model. There are also lot of Arduino compatible displays models with 13-pin control bus, but I had only few free GPIOs left in the Arduino after connecting nRF905, temperature sensor and RTC module.
Sharing the same control bus with nRF905 solved the GPIO problem as only 2 additional GPIO are needed for the SPI communication with the display.
Display HW is controlled by inbuilt ILI9341 driver chip. Adafruit graphics library has support for this model so the display was woken up and connectivity verified quite easily with their test SW.
The library can be used for printing text and drawing two color bitmaps to the display. Default fonts included in the library are perfect for prototyping, but when those are scaled up the result is quite rough. I spent some time for studying the internals of font drawing so I was able to replace original fonts with my own, which had correct size to this purpose.
![]() |
| Display on top of loudspeaker. Main unit is hidden below the loudspeaker stand. Display is in the time mode. |
My original plan was to show all the temperature and time information in the single display. I realized quite soon that those are not anymore readable if fitted to the display at the same time.
In the current solution outdoor temperature is constantly shown in the top of the display. The lower half is shared between time information and rest of temperatures. The display changes every 10 seconds between time and temperature mode. In time mode time and date are shown (picture above). In temperature mode indoor and sauna temperatures are displayed (picture below).
![]() |
| Early prototype of main unit in beta testing before making the vero board. Display is in the temperature mode. |
Then I took a shortcut and decided that time and date information can be set only by sending a special message to the main unit via nRF905. Due to this limitation, and after few power cut offs which reset all time and date information, I decided to add a DS3231 RTC module to the main unit.
RTC is connected to Arduino via I2C bus. The module includes small battery to maintain time information in case of VCC is not available. With RTC information I added also SW support for automatically adjusting time for daylight saving time changes.
![]() |
| Main unit without a lid. Display wires at top right. DS3231 RTC module installed afterwards. |






No comments:
Post a Comment