LoRaProMini

LoRaProMini - A low power LoRaWAN Node

A LoRaWAN sensor node, based on ATmega328P MCU (Arduino Pro Mini) and RFM95W/SX1276 LoRa Transceiver.

PCB Front Assembled

The module can be used:

Features

Warning

LoRaProMini does not take care of the compliance with the duty cycle limitation. Please select only transmission intervals that are within the legal limits (1%/0.1%). Please also note that the interrupt inputs may cause additional transmissions if this function is activated.

PCB Ordering

:point_up: I still have a few PCBs left. If you are interested please contact me. Contact details can be found here: https://github.com/foorschtbar or visit my Tindie store:

I sell on Tindie

Example Applications

Environmental (Weather/Clima) Sensor

Outdoor Clima Sensor

Mailbox Monitor

Mailbox Monitor

Mailbox Monitor Mailbox Monitor

More pics

PCB Front and Back

PCB KiCad

The Things Stack configuration

How to use

  1. Manufacture the PCB. Here you find the Gerber files
  2. Assemble the PCB. Here you find the Bill of Materials (BOM)
    • Attention: The current version (v3.1) of the PCB has no ISP header! A pre-burned Atmega328P must be installed. I got one from an Arduino Pro Mini Board (3.3V 8 Mhz), because a completely assembled Arduino is cheaper than a single chip
  3. Flash config firmware (See How to flash)
  4. Start voltage calibration from menu
  5. Start configuration builder Configuration Builder
  6. Measure the voltage with a multimeter
  7. Insert multimeter voltage and the analog value in the Volts-per-bit (VPB) calculator to get VPB factor.
  8. If u have a adjustable power supply, try different voltages to find best factor. Warning: The maximum voltage is 6 Volt
  9. Fill out the other fields like activation methode, session keys and EUIs
  10. Write configuration to EEPROM using configuration menu
  11. Check written configuration via configuration menu
  12. Flash debug or release firmware (See How to flash)
  13. Finish

How to flash

avrdude-F -v -c arduino -p atmega328p -P <COM PORT> -b 57600 -D -U flash:w:<FIRMWARE FILE>:i

Example:

avrdude -F -v -c arduino -p atmega328p -P COM4 -b 57600 -D -U flash:w:firmware_1.0_config.hex:i

Firmware Changelog

Version 2.7

Version 2.6

Version 2.5

Version 2.4

Version 2.3

Version 2.2

Version 2.1

Version 2.0

Version 1.1

Version 1.0

PCB Changelog

Version 3.2

Version 3.1

Version 3.0

Version 2.2

Version 2.1

Version 2.0

Version 1.0

TTS Payload Formatter (formerly TTN Payload Decoder)

function decodeUplink(input) {
  var bytes = input.bytes;

  var itrTrigger = (bytes[0] & 0x1) !== 0; // Message was triggered from interrupt (bit 0)
  var itr0 = (bytes[0] & 0x2) !== 0; // Interrupt 0 (bit 1)
  var itr1 = (bytes[0] & 0x4) !== 0; // Interrupt 1 (bit 2)
  var bat = (bytes[1] << 8) | bytes[2]; // Battery
  var fwversion = (bytes[3] >> 4) + "." + (bytes[3] & 0xf); // Firmware version
  var temp1 = (bytes[4] & 0x80 ? 0xffff << 16 : 0) | (bytes[4] << 8) | bytes[5]; // BME Temperature
  var humi1 = (bytes[6] << 8) | bytes[7]; // BME Humidity
  var press1 = (bytes[8] << 8) | bytes[9]; // BME Pressure
  var temp2 =
    (bytes[10] & 0x80 ? 0xffff << 16 : 0) | (bytes[10] << 8) | bytes[11]; // DS18x Temperature

  var mbStatus = "UNKNOWN";
  if (itr0) {
    mbStatus = "FULL";
  } else if (itr1) {
    mbStatus = "EMPTY";
  }

  return {
    data: {
      interrupts: {
        itr0: itr0,
        itr1: itr1,
        itrTrigger: itrTrigger,
      },
      extra: {
        mbStatus: mbStatus,
        mbChanged: itrTrigger,
      },
      fwversion: fwversion,
      bme: {
        temperature: temp1 / 100,
        humidity: humi1 / 100,
        pressure: press1,
      },
      ds18x: {
        temperature: temp2 / 100,
      },
      battery: bat / 100,
    },
    warnings: [],
    errors: [],
  };
}

ToDo