attnode/Firmware/README.md

2 KiB

TinyLoRa Firmware

Example Sensor Node Firmware with a BMP/E280 or SHT21 Sensor. Used Sensor has to be set via #define in the src/secconfig.h (HAS_BME280 or HAS_SHT21). Please change the values in src/secconfig.h to your Keys from https://console.thethingsnetwork.org. Device has to be set to ABP Mode. Also since there is no permanent storage to store the Frame Counter, please disable the Frame Counter Check in the TTN console.

For a complete explanation of the Parameters possible in the secconfig.h see https://www.ttgw.de/sites/tinylora/20-firmware

The code also supports the RFM69W wireless module instead of the RFM95W LoRa module. For this purpose you need a receiver. Example code for a receiver in python (tested on a Raspberry Pi, RFM69 connected via SPI) can be found at https://www.seiichiro0185.org/git/IOT/sensord

Project was created using PlatformIO Atmel-AVR Framework

Decoder for the TTN Application

function Decoder(bytes, port) {
  var decoded = {};

  if (bytes.length == 16) {
    // Old Payload Format
    decoded.t = ((bytes[0]) | (bytes[1] << 8 ) | (bytes[2] << 16 ) | (bytes[3] << 24)) / 100.0;
    decoded.p = ((bytes[4]) | (bytes[5] << 8 ) | (bytes[6] << 16 ) | (bytes[7] << 24)) / 100.0;
    decoded.h = ((bytes[8]) | (bytes[9] << 8 ) | (bytes[10] << 16 ) | (bytes[11] << 24)) / 100.0;
    decoded.v = ((bytes[12]) | (bytes[13] << 8 ) | (bytes[14] << 16 ) | (bytes[15] << 24)) / 1000.0;
  } else {
    // New Payload Format
    // We always have Battery Voltage (uint8_t)
    decoded.v = (bytes[0] * 20) / 1000.0;

    // Temperature (int32_t)
    if (bytes.length >= 5)
      decoded.t = ((bytes[1]) | (bytes[2] << 8 ) | (bytes[3] << 16 ) | (bytes[4] << 24)) / 100.0;
  
    // Humidity (int32_t)
    if (bytes.length >= 9)
      decoded.h = ((bytes[5]) | (bytes[6] << 8 ) | (bytes[7] << 16 ) | (bytes[8] << 24)) / 100.0;

    // Atmospheric Pressure (int32t)
    if (bytes.length >= 13)
      decoded.p = ((bytes[9]) | (bytes[10] << 8 ) | (bytes[11] << 16 ) | (bytes[12] << 24)) / 100.0;
  }

  return decoded;
}