|Monitoring bat boxes with LoRa|
This page is an idea for adding LoRa capability to a bat box.
A popular kind of bat box is a flat wooden box with an opening on the bottom and mounted to a tree trunk or building. Bats can use these to sleep during the day (they hunt at night for insects). Some kinds of bats can even use a bat box to raise their young.
To check if a bat box is in use by bats, you can walk up to the tree that the box is mounted on and shine a light into it to see if there are any bats there. But I think it would be nice to investigate if this can be done automatically, without having to go to the individual box and without disturbing the bats with a light!
The basic idea is to mount some piece of electronics in or on the bat box that monitors if there are any bats in there. Periodically (say once a day), the presence of bats is broadcast using a LoRa (long range) radio transmitter to a central place (e.g. the internet).
PIR movement detection
To sense the presence of bats inside the bat box, I plan to use a PIR (passive infrared) detector module which can detect movement of warm bodies. A PIR typically has a low current requirement (say < 0.1 mA), so it can probably be turned on most of the time. Sleeping bats will likely not trigger the movement detection, but that's OK I think, knowing when they enter or leave the bat box is probably enough info.
PIR sensor investigation
I ordered a couple of different mini PIR sensors, so I could do some measurements on which PIR sensor is the 'best', meaning good sensitivity and low quiescent current.
The table below shows some of the properties I measured, including the supply current. Some sensors use a little more when activated, but this was so little that I didn't write it down separately. Also, all sensors I bought seem to have an internal regulator, so every one was fed with 5V, which is then down-regulated to some lower voltage on board the PIR module. This can be a problem because I plan to use a single lithium cell so I have only about 3.2V available.
|Image||Price||Claimed current||Measured current||Onboard regulator||Remarks|
|USD 1.99||< 0.1mA||15 uA||HT7530-1 (3.0V)||probably best candidate to investigate further: probably 3.3V compatible + very low idle current. See also this page, explaining it contains an AS312 PIR sensor, with the electronics on the board basically only doing some voltage regulation|
|USD 2.19||< 50uA||1 mA||7144 (4.4V)||probably worst candidate: high idle current, weird pitch (2mm?) connector, not 3.3V compatible!|
|USD 1.75||<60uA||75 uA||7133 (3.3V)||aka HC-SR505, it looks like it misses a some part connecting to the OUT pin!|
In relation to being 3.3V compatible, here's a guide on modifying a PIR module for 3.3V.
LoRa / The-Things-Network
I think the LoRa radio technology is perfectly suited as a transmission medium for sending the bat box occupancy data. LoRa has a larger range than similar radio technologies, has relative immunity to narrow-band interference and allows for low-power transmissions. There are already several LoRa gateways provided by the-things-network (TTN) that can receive and forward the data for free (no subscription needed, fair-use policy). If the LoRa network is down for some reason, no harm is done to the bats, possibly just a few days worth of data lost, and I think I can come up with a solution to that.
ESP32 with LoRa
There are nice boards containing an ESP32 with a LoRa radio, I think I'll use this one instead of an STM32
To power the electronics, I plan to use a LiFePO4 battery. A battery of this type has a voltage of around 3.2V, so it is capable of running the electronics directly, without a voltage regulator. It also has a quite large capacity (mAh per gram) and is relatively safe (doesn't catch fire easily, unlike some other lithium battery types).
Alternatively, just use a standard 18650 lithium cell and put a diode in series to drop the voltage by about 0.6V.
The basic idea is to indicate whether movement was detected within intervals of 15 minutes. So each day the electronics see 96 such intervals (24 hours, 4 intervals per hour). Encoded using 1 bit per interval, we can send the result of one day in just 12 bytes (excluding overhead from the LoRaWAN protocol, about 13 bytes and our own overhead, e.g. a time stamp).
If movement is detected by the PIR, the processor is woken up, it notes the movement in internal memory and turns off the PIR so it can sleep for the remainder of the 15 minute interval. This way, we conserve the maximum amount of energy in the battery and make it last as long as possible. (idea: use a solar panel to recharge).
Once a day, at some random time, the bat box sends all the data collected so far to the network application connected to the TTN.
time synchronisation algorithm
It would be nice for the node to know the time, so it can accurately report on time periods where movement was detected.
The LoRaWAN specification has the MAC commands DevTimeReq and DevTimeAns, however they are not supported by TTN yet. Using them even might give interoperability problems.
As an alternative, I can implement a similar thing myself.
To keep the time, we can use the (RTC) onboard the processor/board. I plan to synchronize the time using the following algorithm:
- in an uplink transmission from the bat box to the network, there is a field containing the UTC time (seconds since 1970/1/1) from the point of view of the bat box
- upon reception (a few seconds later), the network application compares the time field sent by the bat box with the actual time
- if the difference is beyond some threshold (say 1 minute), it prepares a down-link transmission with the required offset to correct the time
- when the bat box receives the down-link transmission, it updates its clock with the correction offset.
So, for example if a bat box powers up with no knowledge of the time at all, it'll start at UTC time 0. The network application will note a huge time error and prepare a down-link message with the correct offset. When the bat box receives the down-link message, it applies the offset to its clock and so updates itself to the correct time. It doesn't really matter how much time there is between an uplink and a downlink or when the downlink message is scheduled exactly, since the network sends a time *difference*, not an absolute time. Downlink messages are only sent when there is a large time error, so they should be relatively infrequent, reducing the network load on TheThingsNetwork.
- if something moves, send a message immediately, message contains timestamp (4 bytes) in seconds, send this at most once per 5 minutes
- every hour, send a summary of the past hour, message contains timestamp (4 bytes), plus 60 bits (8 bytes), one bit for each minute
- every day, send a summary of the past day, message contains timestamp (4 bytes), plus 288 bits (36 bytes), one bit for each 5 minute interval
- backend Java application: https://github.com/bertrik/lorabatboxbackend
Challenges and ideas to be implemented in the future:
- find some way to keep the electronics safe from weather, e.g. wrap it all in a kind of silicone pouch
- just use 1-minute resolution, send it once an hour -> requires just 8 bytes
- use the built-in RTC of the ESP32, use ESP32 low-power sleep