Story
Overview
The LoraWAN node for air quatity monitoring based on STM32WLE and SEN54 Sensirion sensor. This LoRaWAN node is designed for continuous air quality monitoring. The node operates autonomously and support remote commands via downlinks.
- LaraWAN node based on STM32WLE MCU (LORA-E5, Wio-E5), easy to integrate monitoring and control node (air quality monitoring, garden, intelligent home. etc.)
- You may connect load remotely by downlinks - via AO3400A transistor (on board)
- New Sensirion SEN54 sensor optimized
- MPPT and Li-Ion battery charger for power from 5V++ cheap solar panels.
- Sleep current as low as 0.9 mA
- 10+ years of autonomity with cheap 2W solar panel and standard 1850 Li-Ion battery
- More than 2 weeks work autonomity from fully charged 3500mA Li-Ion battery
- Ideal for sensor.community integration over LoRaWAN IoT, like TTN and Helium, no internet connection from your side needed!
- Full fledged with routed I/O ports - easy to solder - easy to add functionality (inputs, outputs, interfaces etc.)
Downlink commands supported
Reset the device via sending downlink to Port2 via LoRaWAN console:
FF FF FF FF FF FF
Set transmit period (in milliseconds) via downlink on Port2:
01 00 XX XX XX XX
(XX XX XX XX - milliseconds coded in hex (big endian), ex. for 5 minutes = 300,000 ms = 00 04 93 E0)
Set measuring period (in minutes) via downlink as for now provided together with LED_ON command in one 2-bytes downlink message on Port2: 01 XX - LED ON and measuring period = XX minutes, 00 XX - LED is OFF and measuring period = XX minutes. This LED enhanced with FET transistor, so you may connect some load (LOAD output) to be switched ON/OFF (see the schematic).
Uplink decoding / downlink encoding
The node uplink data packet containing 13 payload bytes with following data - PM1 concentration, PM2.5 concentration, PM10 concentration, temperature, humidity, volatile organic compound index (VOC), battery level related to volts, status of LED output. Decoder for payload on server side (uplink):
function Decoder(bytes, port, uplink_info) {
var decoded = {};
decoded.PM1 = ((bytes[0]*256 + bytes[1])/10.0).toFixed(2);
decoded.PM2_5 = ((bytes[2]*256 + bytes[3])/10.0).toFixed(2);
decoded.PM10 = ((bytes[4]*256 + bytes[5])/10.0).toFixed(2);
decoded.T = (-100.0 + bytes[6] + bytes[7]/100.0).toFixed(2);
decoded.RH = (bytes[8] + bytes[9]/100).toFixed(2);
decoded.VOC = ((bytes[10]*256 + bytes[11])/10.0).toFixed(2);
decoded.Battery = (bytes[12]*0.0238).toFixed(2);//battery , volts
decoded.LEDON = bytes[13];
decoded.RSSI = normalizedPayload.gateways[0].rssi.toFixed(0);
decoded.SNR = normalizedPayload.gateways[0].snr.toFixed(0);
decoded.FREQUENCY = normalizedPayload.frequency;
return decoded;
}
Downlink payload encoder example:
function Encoder(measurements, port) {
if(measurements.LED_ON.value) return [1];
else return [0];
}
More information
Follow the project and find more information on Hackaday pollutagNode2.
Integration with Sensor.Community (will appear also on aqicn.org / waqi.info) via easy-to-use pollutants.eu API (Webhook URL) via TTN network find here.
For Helium it is an integration guide here.
BOM List
Name | Designator | Quantity | Manufacturer Part | Manufacturer | Supplier | Supplier Part |
Resistor 30k | R11,R8,R2,R6 | 4 | CR0603-FX-3002ELF | Bourns | Mouser | 652-CR0603FX-3002ELF |
AO3400A | Q2 | 1 | AO3400A | Alpha & Omega Semiconductors | Digi-Key | 785-1000-1-ND |
PMV41XPAR | Q1 | 1 | PMV41XPAR | Nexperia | Mouser | 771-PMV41XPAR |
Capacitor 10uF | C11,C3,C2,C1,C7,C8 | 6 | GRM188R61C106KALD | Murata Electronics | Mouser | 81-GRM188R61C106KALD |
Resistor 82k | R9,R4 | 2 | RT0603FRE0782KL | KEMET | Mouser | 603-RT0603FRE0782KL |
SM06B-GHS-TB_LF__SN_ | J3 | 1 | SM06B-GHS-TB(LF)(SN) | JST | Mouser | 306-SM06BGHSTBLFSN |
142-0701-801 | J2 | 1 | 142-0701-801 | Cinch Connectivity Solutions | Mouser | 530-142-0701-801 |
Capacitor 0.1uF | C10,C4,C5,C6 | 4 | 06035C104KAT2A | AVX | Mouser | 581-06035C104KAT2A |
LTST-C171YKT | LED1,LED2 | 2 | LTST-C171YKT | Lite-On | Mouser | 859-LTST-C171YKT |
Resistor 2k | R1,R7,R10 | 3 | RC0603FR-072KL | Yageo | Mouser | 603-RC0603FR-072KL |
MPQ3413GJ-5-AEC1-P | IC2 | 1 | MPQ3413GJ-5-AEC1-P | Monolithic Power Systems (MPS) | Mouser | 946-MPQ3413GJ5AEC1P |
Capacitor 0.22uF | C9 | 1 | AC0603X7R9BB224 | KEMET | Mouser | 603-AC0603X7R9BB224 |
Resistor 120 Ohm | R5 | 1 | ERJ-U03J121V | Panasonic | Mouser | 667-ERJ-U03J121V |
Resistor 0.1 Ohm | R3 | 1 | CRL1206FWR100ELF | Bourns | Mouser | 652-CRL1206FWR100ELF |
Inductance 10uH | L2 | 1 | SRN3015BTA-100M | Bourns | Mouser | 652-SRN3015BTA-100M |
Inductance 2.2uH | L1 | 1 | SRN3015-2R2M | Bourns | Mouser | 652-SRN3015-2R2M |
LDCL015M33R | IC3 | 1 | LDCL015M33R | STMicroelectronics | Mouser | 511-LDCL015M33R |
PMEG2010AEH | D2,D1 | 2 | PMEG2010AEH-QX | Nexperia | Mouser | 771-PMEG2010AEH-QX |
LoRa-E5 | IC1 | 1 | 317990687 | SEEED STUDIO | Mouser | 713-317990687 |
CN3791 | IC4 | 1 | CN3791 | Consonance | LCSC | C154992 |
61300511121 | J1 | 1 | 61300511121 | Wurth | LCSC | C6461551 |