Compare commits
2 commits
18a87d8098
...
3109c1168e
Author | SHA1 | Date | |
---|---|---|---|
3109c1168e | |||
3fb84ac27b |
3 changed files with 98 additions and 13 deletions
|
@ -46,8 +46,10 @@ This repository contains the PlatformIO project with the mapper firmware. Copy c
|
||||||
|
|
||||||
If a Button is connected you can use the following functions:
|
If a Button is connected you can use the following functions:
|
||||||
|
|
||||||
* **Short press:** Schedule an imideate send, regardless of interval
|
* **Short press:** Schedule an imideate send, regardless of interval | In Setup Mode - cycle through Settings or Change Activated Setting
|
||||||
* **Long Press (>1s):** Enter Setup Mode, change interval with short press, use another long press to leave setup
|
* **Long Press (>1s):** Enter Setup Mode, Activate a Setting in Setup Mode
|
||||||
|
|
||||||
|
In Setup Mode a '>' in front of a Line identifies the selected option, a '>>' identifies an activated setting (can be changed by short press). Use long press to deactivate an activated setting
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,13 @@
|
||||||
//*******************************************************************
|
//*******************************************************************
|
||||||
// LoRa Config - Put Your Keys Here! MSB Left for all three
|
// LoRa Config - Put Your Keys Here! MSB Left for all three
|
||||||
//*******************************************************************
|
//*******************************************************************
|
||||||
unsigned char NwkSkey[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
|
||||||
unsigned char AppSkey[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
// Primary Keyset, will be used on Startup
|
||||||
unsigned char DevAddr[4] = { 0x00, 0x00, 0x00, 0x00 };
|
unsigned char NwkSkey_1[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||||
|
unsigned char AppSkey_1[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||||
|
unsigned char DevAddr_1[4] = { 0x00, 0x00, 0x00, 0x00 };
|
||||||
|
|
||||||
|
// Secondary ABP Keyset, can be selected via Setup
|
||||||
|
unsigned char NwkSkey_2[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||||
|
unsigned char AppSkey_2[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
|
||||||
|
unsigned char DevAddr_2[4] = { 0x00, 0x00, 0x00, 0x00 };
|
92
src/main.cpp
92
src/main.cpp
|
@ -3,6 +3,7 @@
|
||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
#include <SPI.h>
|
#include <SPI.h>
|
||||||
#include <Wire.h>
|
#include <Wire.h>
|
||||||
|
#include <EEPROM.h>
|
||||||
#include <LoRaWAN.h>
|
#include <LoRaWAN.h>
|
||||||
|
|
||||||
// OLED
|
// OLED
|
||||||
|
@ -26,8 +27,20 @@ enum Modes {
|
||||||
M_SETUP
|
M_SETUP
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum Settings {
|
||||||
|
S_NONE,
|
||||||
|
S_INTERVAL,
|
||||||
|
S_KEYSET,
|
||||||
|
S_EXIT
|
||||||
|
};
|
||||||
|
|
||||||
Modes amode = M_NORMAL; // Active Mode
|
Modes amode = M_NORMAL; // Active Mode
|
||||||
Modes omode = M_NORMAL; // Previous Mode
|
Modes omode = M_NORMAL; // Previous Mode
|
||||||
|
Settings cset = S_INTERVAL; // Current Setting
|
||||||
|
Settings aset = S_NONE; // Selected Setting
|
||||||
|
|
||||||
|
#define EEPROM_KEYSET_ADR 0
|
||||||
|
#define EEPROM_INTERVAL_ADR 1
|
||||||
|
|
||||||
// LoRa
|
// LoRa
|
||||||
#include "config.h" // Contains LoRa ABP Keys
|
#include "config.h" // Contains LoRa ABP Keys
|
||||||
|
@ -35,11 +48,12 @@ Modes omode = M_NORMAL; // Previous Mode
|
||||||
#define NSS PIN_PA5
|
#define NSS PIN_PA5
|
||||||
RFM95 rfm(DIO0, NSS);
|
RFM95 rfm(DIO0, NSS);
|
||||||
LoRaWAN lora = LoRaWAN(rfm);
|
LoRaWAN lora = LoRaWAN(rfm);
|
||||||
uint16_t Frame_Counter_Tx = 0x0000;
|
uint16_t Frame_Counter_Tx = 0x0001;
|
||||||
|
|
||||||
// Some Status Variables
|
// Some Status Variables
|
||||||
uint8_t interval = 20; // Sending Interval in Settings
|
uint8_t interval = 20; // Sending Interval in Settings
|
||||||
uint8_t packets = 0; // Sent LoRa Packets
|
uint8_t packets = 0; // Sent LoRa Packets
|
||||||
|
uint8_t keyset = 1; // LoRa KeySet
|
||||||
String statusmsg = "";
|
String statusmsg = "";
|
||||||
|
|
||||||
uint8_t loraBuffer[9]; // Lora Data Packet
|
uint8_t loraBuffer[9]; // Lora Data Packet
|
||||||
|
@ -60,14 +74,40 @@ uint16_t readSupplyVoltage() {
|
||||||
return reading;
|
return reading;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void loraKeySetup(uint8_t keyset) {
|
||||||
|
if (keyset == 1)
|
||||||
|
lora.setKeys(NwkSkey_1, AppSkey_1, DevAddr_1);
|
||||||
|
if (keyset == 2)
|
||||||
|
lora.setKeys(NwkSkey_2, AppSkey_2, DevAddr_2);
|
||||||
|
}
|
||||||
|
|
||||||
// Button Handler Function
|
// Button Handler Function
|
||||||
void handler(Button2& btn) {
|
void handler(Button2& btn) {
|
||||||
switch (btn.getClickType()) {
|
switch (btn.getClickType()) {
|
||||||
case SINGLE_CLICK:
|
case SINGLE_CLICK:
|
||||||
if (amode == M_SETUP) {
|
if (amode == M_SETUP) {
|
||||||
interval = interval += 10;
|
if (aset == S_INTERVAL) {
|
||||||
if (interval > 40)
|
interval = interval += 10;
|
||||||
interval = 10;
|
if (interval > 30)
|
||||||
|
interval = 10;
|
||||||
|
} else if (aset == S_KEYSET) {
|
||||||
|
keyset = keyset + 1;
|
||||||
|
if (keyset > 2)
|
||||||
|
keyset = 1;
|
||||||
|
loraKeySetup(keyset);
|
||||||
|
} else {
|
||||||
|
switch (cset) {
|
||||||
|
case S_INTERVAL:
|
||||||
|
cset = S_KEYSET;
|
||||||
|
break;
|
||||||
|
case S_KEYSET:
|
||||||
|
cset = S_EXIT;
|
||||||
|
break;
|
||||||
|
case S_EXIT:
|
||||||
|
cset = S_INTERVAL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
} else if (amode == M_NORMAL) {
|
} else if (amode == M_NORMAL) {
|
||||||
statusmsg = "Adhoc Request";
|
statusmsg = "Adhoc Request";
|
||||||
adhocsend = true;
|
adhocsend = true;
|
||||||
|
@ -77,9 +117,19 @@ void handler(Button2& btn) {
|
||||||
switch (amode) {
|
switch (amode) {
|
||||||
case M_NORMAL:
|
case M_NORMAL:
|
||||||
amode = M_SETUP;
|
amode = M_SETUP;
|
||||||
|
cset = S_INTERVAL;
|
||||||
break;
|
break;
|
||||||
case M_SETUP:
|
case M_SETUP:
|
||||||
amode = M_NORMAL;
|
if (cset == S_EXIT) {
|
||||||
|
aset = S_NONE;
|
||||||
|
amode = M_NORMAL;
|
||||||
|
EEPROM.update(EEPROM_KEYSET_ADR, keyset);
|
||||||
|
EEPROM.update(EEPROM_INTERVAL_ADR, interval);
|
||||||
|
} else if (aset == S_NONE) {
|
||||||
|
aset = cset;
|
||||||
|
} else {
|
||||||
|
aset = S_NONE;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -102,8 +152,25 @@ void updateDisplay() {
|
||||||
if (amode == M_SETUP) {
|
if (amode == M_SETUP) {
|
||||||
oled.println ("<< SETUP >>");
|
oled.println ("<< SETUP >>");
|
||||||
oled.println ("");
|
oled.println ("");
|
||||||
|
char tmp = ' ';
|
||||||
|
|
||||||
|
tmp = (cset == S_INTERVAL) ? '>' : ' ';
|
||||||
|
oled.print(tmp);
|
||||||
|
tmp = (aset == S_INTERVAL) ? '>' : ' ';
|
||||||
|
oled.print(tmp);
|
||||||
oled.print("Interval: ");
|
oled.print("Interval: ");
|
||||||
oled.println(interval);
|
oled.println(interval);
|
||||||
|
|
||||||
|
tmp = (cset == S_KEYSET) ? '>' : ' ';
|
||||||
|
oled.print(tmp);
|
||||||
|
tmp = (aset == S_KEYSET) ? '>' : ' ';
|
||||||
|
oled.print(tmp);
|
||||||
|
oled.print("ABP KeySet: ");
|
||||||
|
oled.println(keyset);
|
||||||
|
tmp = (cset == S_EXIT) ? '>' : ' ';
|
||||||
|
oled.print(tmp);
|
||||||
|
oled.println(" Exit Setup");
|
||||||
|
|
||||||
} else if (amode == M_NORMAL) {
|
} else if (amode == M_NORMAL) {
|
||||||
if (hasFix) {
|
if (hasFix) {
|
||||||
if (hasFix != oldFix){
|
if (hasFix != oldFix){
|
||||||
|
@ -119,7 +186,7 @@ void updateDisplay() {
|
||||||
oled.print("Int: ");
|
oled.print("Int: ");
|
||||||
oled.println(interval);
|
oled.println(interval);
|
||||||
oled.print("Packet: ");
|
oled.print("Packet: ");
|
||||||
oled.println(Frame_Counter_Tx);
|
oled.println(packets);
|
||||||
oled.print("Alt: ");
|
oled.print("Alt: ");
|
||||||
oled.println(buffer[3]);
|
oled.println(buffer[3]);
|
||||||
oled.print("Speed: ");
|
oled.print("Speed: ");
|
||||||
|
@ -139,7 +206,7 @@ void updateDisplay() {
|
||||||
oled.print("Int: ");
|
oled.print("Int: ");
|
||||||
oled.println(interval);
|
oled.println(interval);
|
||||||
oled.print("Packet: ");
|
oled.print("Packet: ");
|
||||||
oled.println(Frame_Counter_Tx);
|
oled.println(packets);
|
||||||
oled.print("Bat: ");
|
oled.print("Bat: ");
|
||||||
oled.println((float)readSupplyVoltage()/1000);
|
oled.println((float)readSupplyVoltage()/1000);
|
||||||
}
|
}
|
||||||
|
@ -166,9 +233,17 @@ void setup() {
|
||||||
oled.setFlipMode(1);
|
oled.setFlipMode(1);
|
||||||
oled.clear();
|
oled.clear();
|
||||||
|
|
||||||
|
// Get Settings from EEPROM
|
||||||
|
|
||||||
|
EEPROM.get(EEPROM_KEYSET_ADR, keyset);
|
||||||
|
if (keyset > 2) keyset = 1;
|
||||||
|
if (keyset < 1) keyset = 1;
|
||||||
|
EEPROM.get(EEPROM_INTERVAL_ADR, interval);
|
||||||
|
if (interval < 10 || interval > 30) interval = 20;
|
||||||
|
|
||||||
// Lora Initialization
|
// Lora Initialization
|
||||||
rfm.init();
|
rfm.init();
|
||||||
lora.setKeys(NwkSkey, AppSkey, DevAddr);
|
loraKeySetup(keyset);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Main Loop
|
// Main Loop
|
||||||
|
@ -186,6 +261,7 @@ void loop() {
|
||||||
|
|
||||||
gps.buildPacket(loraBuffer);
|
gps.buildPacket(loraBuffer);
|
||||||
lora.Send_Data((unsigned char *)&loraBuffer, sizeof(loraBuffer), Frame_Counter_Tx, SF7BW125, 0x01);
|
lora.Send_Data((unsigned char *)&loraBuffer, sizeof(loraBuffer), Frame_Counter_Tx, SF7BW125, 0x01);
|
||||||
|
packets++;
|
||||||
Frame_Counter_Tx++;
|
Frame_Counter_Tx++;
|
||||||
lastmillis = millis();
|
lastmillis = millis();
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in a new issue