|Project LoRaWAN dust Sensor|
|LoRaWAN airborne particulate matter sensor|
The plan is to create a system consisting of:
- a sensor that measures airborne particulate matter and sends the measurement data using LoRa/TheThingsNetwork to a central location.
- a backend that collects the data from TTN and forwards it to luftdaten.info
This has been done before by other people, but can't find any really good examples:
- source code location is obscure, I will publish all source code on github and put up documentation on this wiki
- payload format is non-standard, I'd like to use something relatively universal and standard, so I think I will try to use the Cayenne LPP format.
This has been done by TTN Ulm, see https://github.com/verschwoerhaus/ttn-ulm-feinstaub (the sensor code) and https://github.com/verschwoerhaus/ttn-ulm-muecke (the forwarder, in python)
Sensors join the network using OTAA (instead of ABP), that way I try to minimize the setup of each individual node.
So I'd like to just re-invent the wheel properly this time.
- Make it work with the 'old' LMIC library and ABP
- Try out the 'new' LMIC library at https://github.com/mcci-catena/arduino-lmic
- Experiment with OTAA, saving OTAA parameters, restoring OTAA parameters, see
- Finish the Java software (MQTT listener, payload decoder, luftdaten forwarder)
Useful links for the TTGO LoRa board:
The node is based on Arduino, in particular a TTGO ESP32 board with onboard LoRa chip. The sensor is an SDS-011, just like in the luftdaten project.
Luftdaten uses a cycle time of 145 seconds for the SDS011.
Proposed hardware connections:
- SDS011 5V to ESP32 5V
- SDS011 GND to ESP32 GND
- SDS011 TXD to ESP32 GPIO25
- SDS011 RXD to ESP32 GPIO34
Source code can be found on the github page.
Packets transferred over LoRa contain:
- structure version id: 2 bytes
- id for forwarding towards luftdaten (esp-XXXX number): 6 bytes
- PM10 value, encoded in units of 0.1 ug/m3: 2 bytes
- PM2.5 value, encoded in units of 0.1 ug/m3: 2 bytes
- temperature, encoded in units of 0.1 deg C: 2 bytes
- relative humidity, encoded in units of 0.1%, 2 bytes
Total: 16 bytes
Not present value is 0xFFFF. Encoding is big endian.
Would be nice to use Cayenne for this, but I don't know if Cayenne has an id for particulate matter.
To compile the code, platformio is used, see the github archive.
I will use a Java program to subscribe to this MQTT stream, decode the telemetry packets and forward them to luftdaten. There is no storage of measurement data in the Java application.
I've already developed some Java code that publishes the measurement values towards luftdaten.info. Also I've developed code before to subscribe to the TTN MQTT stream.