Laura long range radio

Laura utilises LoRa radios with at least one transmitter on an ATMega or STM32 acting as a sensor and another as a receiver on a Raspberry Pi running as a processor of the sensor readings. The software has been written to support the 868 MHz EU band only.

This project was designed to monitor the humidity of a remote location and as such has been written to support (initially) one of three humidity sensors boards, namely the DHT11, AHT10 and SHT3X.

The tranmistter can be a standard Arduino or compatible else a low power board run from 3 AA cells or equivalent such a Moteino or clone.

A version targeting the STM32 based B-L072Z-WRLAN1 board also exists either powered using libopencm3 or STM32 LL.

The Raspberry Pi has can be any model with a 40 pin header if the recommeneded LoRa board is used.




The ATMega was chosen for simplicity of development and easy availability. The client transmitter code is written in C and doesn't use the Arduino IDE or libraries. It should be easily ported to other processors.


For a fixed power installation an Arduino or any clone with a Dragino LoRa Shield or various alternatives for the 868MHz EU frequency band.


For the low power prototype a clone of the Moteino is used with a RFM95W radio module.

The ATmega fuse bits have been altered as below to allow the transmitter to operate at a lower voltage than the standard BOR or approx. 2V9. Both the MCU and radio may operate down to about 2V5 or even lower.



avrdude: safemode: Fuses OK (E:FF, H:D7, L:E2)

Three LIDL NiMH AA batteries in series were used to power a test board with the following outcome. All three batteries had seen a number of years of use previously and were fully charged.

The first message received was on Thursday, 21 October 2021, 14:51:10.

Oct 21 14:50:20 Rx
Oct 21 14:51:10 0xFF 0xFF 0x04 0x00 0x37 0x35 0x2E 0x31 0x25 0x32 0x30 0x2E 0x35 0x43
Oct 21 14:51:10     75.1%20.5C
Oct 21 14:51:10 RSSI = -47
Oct 21 14:51:10 RxDone

The final message received was on Wednesday, 30 March 2022, 08:43:50.

Mar 20 08:43:47 Rx
Mar 20 08:43:50 0xFF 0xFF 0x00 0x00 0x36 0x35 0x2E 0x38 0x25 0x31 0x36 0x2E 0x34 0x43
Mar 20 08:43:50     65.8%16.4C
Mar 20 08:43:50 RSSI = -60
Mar 20 08:43:50 RxDone

The duration was 159 days, 17 hours, 52 minutes and 40 seconds,

13,801,960 seconds
230,032 minutes (rounded down)
3833 hours (rounded down)
159 days (rounded down)
22 weeks (rounded down)
43.77% of a common year (365 days)


This documentation is work-in-progress, but fully operational code can be found below.

libopencm3 (obsolete)

Raspberry Pi


For development both an RPi3 and RPi3 has been tested but any with a 40 pin header will work with a Dragino LoRa/GPS HAT.

Whilst this project only utilises the radio, the GPS can be configured as an accurate time source using this guide.


Software is comprised of two components written in C, the ATMega client transmitter and RPi Linux server which receives messages and may post or publish them elsewhere.


The client transmitter supports three platforms and one of three sensors or no sensor at all.

The platforms are the Arduino UNO, MEGA2560 and Moteino all with the ATMega328 MCU.

Along with any sensor reading transmitted (humidity and temperature) the client will also send the current Vcc voltage level of the processor.

Fetch the code for AVR

hg clone

Build for the target and sensor

Arduino UNO with DHT11

The DHT11 is not an accurate device but is able to measure changes at least.

make -f SENSOR=DHT11

Arduino UNO without a sensor

Not using a sensor results in only the MCU Vcc being sent. This can be used for range tests when roaming.


Arduino MEGA2560 with SHT30

A more accurate device that has not been test extensively.

make -f SENSOR=SHT3X

Moteino or generic with AHT10

This device may not share an I2C bus but that is not an issue here. Under test it has been very reliable.

make -f SENSOR=AHT10

Program device

make -f SENSOR=AHT10 program



The RPi receiver server for Linux listens for messages which are logged and posted to a remote web server for inspection. Later messages will be published to Moquitto MQTT once this component has been written.

The web service code is also included and the purpose here is to allow roaming with a transmitter to evaluate signal range. An Arduino UNO with a power bank may last a few hours but will also require a dummy load for most power banks to stay operational.

Fetch the code

hg clone

Install it

make install-all

The service has been written to operate with runit.


The htdocs directory contains a PHP MVC application for posted messages. Example configuration if for NGINX (found in the routes subdirectory).


Work in progress AVR schematic.




TWI/I2C error recovery.

This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies