Skip to content
LoRa / LoRaWAN + TTN for MicroPython (ESP32)
Branch: master
Clone or download
Pull request Compare This branch is 16 commits ahead, 2 commits behind adafruit:master.
Type Name Latest commit message Commit time
Failed to load latest commit information.
docs Upload image. Apr 20, 2019
ulora Further tidy up. Apr 20, 2019
.gitignore adding pypi configuration Dec 4, 2018
.project Initial clean-up and commit. Apr 14, 2019
.pydevproject Initial clean-up and commit. Apr 14, 2019
LICENSE Initial clean-up and commit. Apr 14, 2019
README.rst Updated readme. Apr 27, 2019
_config.yml Set theme jekyll-theme-minimal Apr 24, 2019



Although successfully tested with limited functionality, this project is still currently work in progress and there is no guarantee that it works as intended.


This is an experimental port of Adafruit's CircuitPython Tiny LoRa / LoRaWAN driver to MicroPython which allows IoT things to transmit light payloads to The Things Network (TTN).

Original Adafruit repository from which this project has been forked is available here:


The aim is to enable LoRa / LoRaWAN capability on MicroPython ESP32 builds, using only minimal (and where possible) native MicroPython libraries. By in large the code resembles the original, but where applicable, libraries and syntax have been adapted for MicroPython. One notable modification is the omission of Adafruit's Bus Device library (replaced with native SPI libraries).

Being tested on

The project is currently being tested in a limited capacity using:

The premise of the port is that CircuitPython is equipped with a RF module, namely the RFM9x module. As the LoRa component of the RFM module is based on a Semtech SX1276, all of the code relating to the SPI communication should be transferrable. It may work with other SX127X variants.


Further information on CircuitPython can be found here:

Usage example

Note that DEVADDR, NWKEY and APP are shown against your device in the TTN console (if ABP has been configured).

SX1276 module requires a number of standard SPI pins (CS, SCK, MOSI and MISO), as well as IRQ and RST.

import utime
from ulora import TTN, uLoRa
# Refer to device pinout / schematics diagrams for pin details
LORA_CS = const(18)
LORA_SCK = const(5)
LORA_MOSI = const(27)
LORA_MISO = const(19)
LORA_IRQ = const(26)
LORA_RST = const(14)
LORA_DATARATE = "SF9BW125"  # Choose from several available
# From TTN console for device
DEVADDR = bytearray([0x00, 0x00, 0x00, 0x00])
NWKEY = bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
APP = bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
lora = uLoRa(
# ...Then send data as bytearray
lora.send_data(data, len(data), lora.frame_counter)

Throughout, the region (and therefore frequencies) defaults to "EU" unless explicitly specified.

Further information

The Semtech SX1276 LoRA transceiver datasheet can be found here:

The LoRaWAN specification can be found here:

Rosie the Red Robot blog post detailing the experience with this driver can be found here:

You can’t perform that action at this time.