Send BME280 data and voltage to TTN with STM32L0
- Download and install STM32CubeIDE (as of now version 1.4.2)
- Import this repo
- Open .ioc file and select "Project/Generate Code" (should download needed "firmware" files for the chip from ST)
- Build Release or Debug (currently RAM 95%, FLASH 88% used)
connect Gnd of all components
Not checked without, but generally recommended to use a small ceramic (~10nF) and big electrolyt condensator (~10µF) between + and - near STM pins
- Look at the ioc file with CubeMX pinout view.
- Vdd and Vdda to 1.8-3.3V
- Vss to Gnd
- PB9-Boot0 pulled to Gnd (~10k) to safely boot from flash
- STLink for flashing and debug: SWD, SWC, Gnd, NRst (and could provide Vdd via JP1)
- SDA=MOSI, SDC=MISO, others should be obvious
- Ant=~8cm wire (vary length and position to get best average RSSI as reported by TTN)
- NSS=CS, others should be obvious (DIO0, DIO5, MOSI, MISO, SCK and RESET)
RFM95W pin labels for reuse of ESP32 adapter breadboard (print with 600dpi)
Rx of a usb to serial converter sends at 115200. I use this command (serial port name ttyUSB_ser_red is defined in my /etc/udev/rules.d) pio device monitor -p /dev/ttyUSB_ser_red -b 115200
can be used without resistor. I use 1kOhm to save battery
Good resource for STM32 is Stefan Frings He has links to reference, datasheet, errata and more. E.g.:
-
Examples for LL are here: STM32Cube/Repository/STM32Cube_FW_L0_V1.11.2/Projects/NUCLEO-L073RZ/Examples_LL/RTC/RTC_ExitStandbyWithWakeUpTimer
-
Periodic wakeup timer is in Reference 22.4.6 (Periodic auto-wakeup)
-
1s to 18h periodic wakeup with ck_spre = 1s (see 22.4.3) and WUCKSEL [2:1] = 10
-
Enable by WUTE bit in RTC_CR register
-
Once setup it runs in normal and low power.
-
Sets WUTF flag in RTC_ISR if elapsed and reloads RTC_WUTR (timer counter). User resets WUTF
-
Set WUTIE bit in RTC_CR to generate interrupt to wake up from low power modes
-
System reset and Sleep, Stop, Standby have no influence on the WUT (wakeup timer)
-
Save Lora frame counter in backup register: Reference 22.7.20 RTC backup registers (RTC_BKPxR)
-
I couldnt make it work with LL lib, had to use big fat HAL for RCC and RTC. What is missing?
LL_RTC_DisableWriteProtection(RTC); LL_RTC_WAKEUP_Disable(RTC); while( !LL_RTC_IsActiveFlag_WUTW(RTC) ); LL_RTC_WAKEUP_SetClock(RTC, LL_RTC_WAKEUPCLOCK_CKSPRE); LL_RTC_WAKEUP_SetAutoReload(RTC, 3); // wake up every 3+1 s LL_RTC_EnableIT_WUT(RTC); LL_RTC_WAKEUP_Enable(RTC); LL_RTC_EnableWriteProtection(RTC); while( LL_RTC_IsActiveFlag_WUTW(RTC) ); LL_RTC_ClearFlag_WUT(RTC); NVIC_ClearPendingIRQ(RTC_IRQn);
Works fine. Power consumption much lower than with my similar ATTiny84 board
TTN migrated from V2 to V3. After they reactivated the device id ranges of the old network I could register the devices with the same devId, AppsKey and NwsKey. After ~2 weeks the devices started showing up in the console -> code works unchanged with V3! Config example in this post: https://www.thethingsnetwork.org/forum/t/migrate-old-abp-device-to-v3
Not needed. by far the most power is consumed by sending. These tasks are not relevant
- Sleep while waiting for sensor or transmitter (90% of the ~100ms active cycle is waiting)
- Cut power of sensor and transmitter between measurements? Standby consumption is already quite low. Works fine for a long time now. No problems so far
- Check recommended hookup of STM32L011K4 (capacitors, boot mode lines, reset, ...?). Since it works, it is probably ok as described above :)
- PCBs for coin cell or 2xAAA: coin cell not at all good at low temp -> abandoned for BMP280 (outdoor) variants
- 3D-printed housings