TTN-Support
This commit is contained in:
parent
37d287276f
commit
2e901ad709
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
.vscode
|
||||||
|
TTN-configuration.h
|
@ -4,7 +4,6 @@
|
|||||||
|
|
||||||
#define USE_DISPLAY
|
#define USE_DISPLAY
|
||||||
#ifdef USE_DISPLAY
|
#ifdef USE_DISPLAY
|
||||||
|
|
||||||
#include <U8g2lib.h>
|
#include <U8g2lib.h>
|
||||||
#ifdef U8X8_HAVE_HW_SPI
|
#ifdef U8X8_HAVE_HW_SPI
|
||||||
#include <SPI.h>
|
#include <SPI.h>
|
||||||
@ -14,14 +13,19 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <Adafruit_NeoPixel.h>
|
#include <Adafruit_NeoPixel.h>
|
||||||
#define LED_PIN 18
|
#define LED_PIN 23
|
||||||
#define LED_COUNT 8
|
#define LED_COUNT 8
|
||||||
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
|
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
|
||||||
|
|
||||||
//U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ 15, /* data=*/ 4, /* reset=*/ 16);
|
|
||||||
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ 15, /* data=*/ 4, /* reset=*/ 16);
|
U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, /* clock=*/ 15, /* data=*/ 4, /* reset=*/ 16);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <SimpleLMIC.h>
|
||||||
|
SimpleLMIC ttn;
|
||||||
|
int TTNDebugLoopInterval = 1000;
|
||||||
|
uint32_t TTNDebugLoopMillis = millis() - TTNDebugLoopInterval;
|
||||||
|
int TTNSendLoopInterval = 10000;
|
||||||
|
uint32_t TTNSendLoopMillis = millis() - TTNSendLoopInterval;
|
||||||
|
|
||||||
int DisplayUpdateLoopInterval = 1000;
|
int DisplayUpdateLoopInterval = 1000;
|
||||||
uint32_t DisplayUpdateLoopMillis = millis() - DisplayUpdateLoopInterval;
|
uint32_t DisplayUpdateLoopMillis = millis() - DisplayUpdateLoopInterval;
|
||||||
@ -72,11 +76,17 @@ void setup(void)
|
|||||||
strip.begin();
|
strip.begin();
|
||||||
strip.show();
|
strip.show();
|
||||||
strip.setBrightness(50);
|
strip.setBrightness(50);
|
||||||
|
|
||||||
|
ttn.begin();
|
||||||
|
ttn.setSubBand(2);
|
||||||
|
ttn.onMessage(message);
|
||||||
|
ttn.join(devEui, appEui, appKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Function that is looped forever
|
// Function that is looped forever
|
||||||
void loop(void)
|
void loop(void)
|
||||||
{
|
{
|
||||||
|
ttn.loop();
|
||||||
unsigned long time_trigger = millis();
|
unsigned long time_trigger = millis();
|
||||||
if (iaqSensor.run()) { // If new data is available
|
if (iaqSensor.run()) { // If new data is available
|
||||||
output = String(time_trigger);
|
output = String(time_trigger);
|
||||||
@ -99,6 +109,18 @@ void loop(void)
|
|||||||
updateDisplay();
|
updateDisplay();
|
||||||
#endif
|
#endif
|
||||||
updateNeoPixel();
|
updateNeoPixel();
|
||||||
|
|
||||||
|
if (!ttn.isBusy() && ttn.isLink() && millis() - TTNSendLoopMillis > TTNSendLoopInterval)
|
||||||
|
{
|
||||||
|
TTNSendLoopMillis = millis();
|
||||||
|
Serial.println("Not Busy!");
|
||||||
|
Serial.println(iaqSensor.co2Equivalent);
|
||||||
|
Serial.println(sizeof(iaqSensor.co2Equivalent));
|
||||||
|
uint8_t buffer[sizeof(iaqSensor.co2Equivalent)];
|
||||||
|
::memcpy(buffer, &iaqSensor.co2Equivalent, sizeof(iaqSensor.co2Equivalent));
|
||||||
|
ttn.write(buffer, sizeof(buffer));
|
||||||
|
ttn.send();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Helper function definitions
|
// Helper function definitions
|
||||||
@ -168,6 +190,12 @@ void updateDisplay() {
|
|||||||
sprintf(displayText, "%20s", co2String);
|
sprintf(displayText, "%20s", co2String);
|
||||||
u8g2.drawStr(0,40,displayText);
|
u8g2.drawStr(0,40,displayText);
|
||||||
|
|
||||||
|
sprintf(displayText, "ttn.isBusy(): %d", ttn.isBusy());
|
||||||
|
u8g2.drawStr(0,50,displayText);
|
||||||
|
|
||||||
|
sprintf(displayText, "ttn.isLink(): %d", ttn.isLink());
|
||||||
|
u8g2.drawStr(0,60,displayText);
|
||||||
|
|
||||||
u8g2.sendBuffer();
|
u8g2.sendBuffer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -192,4 +220,22 @@ void updateNeoPixel(){
|
|||||||
strip.show();
|
strip.show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void printTTNDebug() {
|
||||||
|
Serial.print("ttn.isBusy(): ");
|
||||||
|
Serial.print(ttn.isBusy());
|
||||||
|
Serial.print(" ttn.isLink(): ");
|
||||||
|
Serial.print(ttn.isLink());
|
||||||
|
|
||||||
|
Serial.println();
|
||||||
|
}
|
||||||
|
|
||||||
|
void message(uint8_t *payload, size_t size, uint8_t port)
|
||||||
|
{
|
||||||
|
Serial.println("Received " + String(size) + " bytes on port " + String(port));
|
||||||
|
switch (port) {
|
||||||
|
case 1:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
31
TTN-configuration.template.h
Normal file
31
TTN-configuration.template.h
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
const char *devEui = "";
|
||||||
|
const char *appEui = "";
|
||||||
|
const char *appKey = "";
|
||||||
|
|
||||||
|
//config for Arduino Due, GPS connected to Serial2... Don't ask...
|
||||||
|
const lmic_pinmap lmic_pins = {
|
||||||
|
.nss = 10,
|
||||||
|
.rxtx = LMIC_UNUSED_PIN,
|
||||||
|
.rst = LMIC_UNUSED_PIN,
|
||||||
|
.dio = {2, 3, LMIC_UNUSED_PIN},
|
||||||
|
};
|
||||||
|
#define GPSSerial Serial2
|
||||||
|
|
||||||
|
//Config for TTGO T-Beam T22 v1.1
|
||||||
|
const lmic_pinmap lmic_pins = {
|
||||||
|
.nss = 18,
|
||||||
|
.rxtx = LMIC_UNUSED_PIN,
|
||||||
|
.rst = 23,
|
||||||
|
.dio = {26, 33, 32},
|
||||||
|
};
|
||||||
|
#define GPSSerial Serial1
|
||||||
|
//#define GPS_RX_PIN 34
|
||||||
|
//#define GPS_TX_PIN 12
|
||||||
|
|
||||||
|
//Heltec Lora 32 v2
|
||||||
|
const lmic_pinmap lmic_pins = {
|
||||||
|
.nss = 18,
|
||||||
|
.rxtx = LMIC_UNUSED_PIN,
|
||||||
|
.rst = 14,
|
||||||
|
.dio = {26, 34, 35},
|
||||||
|
};
|
44
decoder.js
Normal file
44
decoder.js
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
function decodeFloat32(bytes) {
|
||||||
|
var sign = (bytes & 0x80000000) ? -1 : 1;
|
||||||
|
var exponent = ((bytes >> 23) & 0xFF) - 127;
|
||||||
|
var significand = (bytes & ~(-1 << 23));
|
||||||
|
|
||||||
|
if (exponent == 128)
|
||||||
|
return sign * ((significand) ? Number.NaN : Number.POSITIVE_INFINITY);
|
||||||
|
|
||||||
|
if (exponent == -127) {
|
||||||
|
if (significand == 0) return sign * 0.0;
|
||||||
|
exponent = -126;
|
||||||
|
significand /= (1 << 22);
|
||||||
|
} else significand = (significand | (1 << 23)) / (1 << 23);
|
||||||
|
|
||||||
|
return sign * significand * Math.pow(2, exponent);
|
||||||
|
}
|
||||||
|
|
||||||
|
function decodeInt16(bytes) {
|
||||||
|
if ((bytes & 1 << 15) > 0) { // value is negative (16bit 2's complement)
|
||||||
|
bytes = ((~bytes) & 0xffff) + 1; // invert 16bits & add 1 => now positive value
|
||||||
|
bytes = bytes * -1;
|
||||||
|
}
|
||||||
|
return bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
function int16_LE(bytes, idx) {
|
||||||
|
bytes = bytes.slice(idx || 0);
|
||||||
|
return bytes[0] << 0 | bytes[1] << 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
function int32_LE(bytes, idx) {
|
||||||
|
bytes = bytes.slice(idx || 0);
|
||||||
|
return bytes[0] << 0 | bytes[1] << 8 | bytes[2] << 16 | bytes[3] << 24;
|
||||||
|
}
|
||||||
|
|
||||||
|
function Decoder(bytes, port) {
|
||||||
|
// Decode an uplink message from a buffer
|
||||||
|
// (array) of bytes to an object of fields.
|
||||||
|
var decoded = {
|
||||||
|
co2: decodeFloat32(int32_LE(bytes, 0)),
|
||||||
|
};
|
||||||
|
|
||||||
|
return decoded;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user