diff --git a/README.md b/README.md
index 535852a..dcbf2fd 100644
--- a/README.md
+++ b/README.md
@@ -43,6 +43,7 @@ After connection with APRX based DIGI it can be used as KISS-TNC
* ((AUT TX)) - information about sending automatic positioning frame when GPS is turned off
* ((KISSTX)) - information about sending the frame sent by KISS
* ((WEB TX)) - sending frame as requested via HTTP
+* ((TEL TX)) - information about sending telemetry
## How to binary first flash readme... (thanx SP6VWX)
* Download the appropriate binary file for your board from: https://github.com/SQ9MDD/TTGO-T-Beam-LoRa-APRS/releases
@@ -64,7 +65,7 @@ After connection with APRX based DIGI it can be used as KISS-TNC
* In the left column click on the ANT-shaped icon, choose your board and click on "Upload". COM port should be detected automatically Wait for procedure to finish and keep reading
## Configuring parameters
-Wait for the board to reboot, connect to "N0CALL AP" WiFi network, password is: xxxxxxxxxx (10 times "x") and point your browser to "192.168.4.1". Hover your mouse to textboxes to get useful hints.
+Wait for the board to reboot, connect to "N0CALL AP" WiFi network, password is: xxxxxxxxxx (10 times "x") and point your browser to "http://192.168.4.1" (http, not http*s*). Hover your mouse to textboxes to get useful hints.
### WiFi Settings
you can scan for local SSID or manually type in name and password
diff --git a/data_embed/index.html b/data_embed/index.html
index 6e94212..25a51f9 100644
--- a/data_embed/index.html
+++ b/data_embed/index.html
@@ -101,6 +101,26 @@
+
+
+
Telemetry Settings
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Fixed Beaconing Settings
diff --git a/include/preference_storage.h b/include/preference_storage.h
index 084f0ac..c61a7d0 100644
--- a/include/preference_storage.h
+++ b/include/preference_storage.h
@@ -6,7 +6,7 @@
#define ENABLE_PREFERENCES
extern Preferences preferences;
-// MAX 15 chars for preferenece key!!!
+// MAX 15 chars for preference key!!!
static const char *const PREF_WIFI_SSID = "wifi_ssid";
static const char *const PREF_WIFI_PASSWORD = "wifi_password";
static const char *const PREF_AP_PASSWORD = "ap_password";
@@ -35,6 +35,14 @@ static const char *const PREF_APRS_FIXED_BEACON_PRESET = "aprs_fixed_beac";
static const char *const PREF_APRS_FIXED_BEACON_PRESET_INIT = "aprs_fix_b_init";
static const char *const PREF_APRS_FIXED_BEACON_INTERVAL_PRESET = "aprs_fb_interv";
static const char *const PREF_APRS_FIXED_BEACON_INTERVAL_PRESET_INIT = "aprs_fb_in_init";
+static const char *const PREF_ENABLE_TNC_SELF_TELEMETRY = "tnc_tel";
+static const char *const PREF_ENABLE_TNC_SELF_TELEMETRY_INIT = "tnc_tel_i";
+static const char *const PREF_TNC_SELF_TELEMETRY_INTERVAL = "tnc_tel_int";
+static const char *const PREF_TNC_SELF_TELEMETRY_INTERVAL_INIT = "tnc_tel_int_i";
+static const char *const PREF_TNC_SELF_TELEMETRY_SEQ = "tnc_tel_seq";
+static const char *const PREF_TNC_SELF_TELEMETRY_SEQ_INIT = "tnc_tel_seq_i";
+static const char *const PREF_TNC_SELF_TELEMETRY_MIC = "tnc_tel_mic";
+static const char *const PREF_TNC_SELF_TELEMETRY_MIC_INIT = "tnc_tel_mic_i";
// SMART BEACONING
static const char *const PREF_APRS_SB_MIN_INTERVAL_PRESET = "sb_min_interv";
static const char *const PREF_APRS_SB_MIN_INTERVAL_PRESET_INIT = "sb_min_interv_i";
diff --git a/platformio.ini b/platformio.ini
index 789c4e3..2e4ac2f 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -31,27 +31,29 @@ lib_deps =
build_flags =
-Wl,--gc-sections,--relax
-D 'KISS_PROTOCOL' ; leave enabled
- -D 'CALLSIGN="N0CALL-0"' ; can be set from www interfeace
- -D 'DIGI_PATH="WIDE1-1"' ; can be set from www interfeace
- -D 'FIXED_BEACON_EN' ; can be set from www interfeace
- -D 'LATIDUDE_PRESET="0000.00N"' ; can be set from www interfeace
- -D 'LONGITUDE_PRESET="00000.00E"' ; can be set from www interfeace
- -D 'APRS_SYMBOL_TABLE="/"' ; can be set from www interfeace
- -D 'APRS_SYMBOL="["' ; can be set from www interfeace
- -D 'MY_COMMENT="Lora Tracker"' ; can be set from www interfeace
- -D 'SHOW_ALT' ; can be set from www interfeace
- -D 'SHOW_BATT' ; can be set from www interfeace
- -D 'SHOW_RX_PACKET' ; can be set from www interfeace
- -D 'SHOW_RX_TIME=10000' ; can be set from www interfeace
+ -D 'CALLSIGN="N0CALL-0"' ; can be set from www interface
+ -D 'DIGI_PATH="WIDE1-1"' ; can be set from www interface
+ -D 'FIXED_BEACON_EN' ; can be set from www interface
+ -D 'LATIDUDE_PRESET="0000.00N"' ; can be set from www interface
+ -D 'LONGITUDE_PRESET="00000.00E"' ; can be set from www interface
+ -D 'APRS_SYMBOL_TABLE="/"' ; can be set from www interface
+ -D 'APRS_SYMBOL="["' ; can be set from www interface
+ -D 'MY_COMMENT="Lora Tracker"' ; can be set from www interface
+ -D 'SHOW_ALT' ; can be set from www interface
+ -D 'SHOW_BATT' ; can be set from www interface
+ -D 'SHOW_RX_PACKET' ; can be set from www interface
+ -D 'SHOW_RX_TIME=10000' ; can be set from www interface
-D 'TXFREQ=433.775' ; set operating frequency
-D 'SPEED_1200' ; comment out to set 300baud
-D 'TXdbmW=23' ; set power
- -D 'ENABLE_OLED' ; can be set from www interfeace
- -D 'ENABLE_LED_SIGNALING' ; can be set from www interfeace
+ -D 'ENABLE_OLED' ; can be set from www interface
+ -D 'ENABLE_LED_SIGNALING' ; can be set from www interface
-D 'NETWORK_TNC_PORT=8001' ; default KISS TCP port
- -D 'MAX_TIME_TO_NEXT_TX=120000L' ; can be set from www interfeace
- -D 'FIX_BEACON_INTERVAL=1800000L' ; can be set from www interfeace
+ -D 'MAX_TIME_TO_NEXT_TX=120000L' ; can be set from www interface
+ -D 'FIX_BEACON_INTERVAL=1800000L' ; can be set from www interface
-D 'NETWORK_GPS_PORT=10110' ; GPS NMEA Port
+ -D 'ENABLE_TNC_SELF_TELEMETRY' ; can be set from www interface
+ -D 'TNC_SELF_TELEMETRY_INTERVAL=3600L' ; can be set from www interface (seconds)
-D 'SHOW_OLED_TIME=15000' ; OLED Timeout
[env:ttgo-t-beam-v1.0]
diff --git a/src/TTGO_T-Beam_LoRa_APRS.ino b/src/TTGO_T-Beam_LoRa_APRS.ino
index a6d9bd8..c49c958 100644
--- a/src/TTGO_T-Beam_LoRa_APRS.ino
+++ b/src/TTGO_T-Beam_LoRa_APRS.ino
@@ -111,6 +111,8 @@ boolean key_up = true;
boolean t_lock = false;
boolean fixed_beacon_enabled = false;
boolean show_cmt = true;
+// Telemetry sequence, current value
+int tel_sequence;
#ifdef SHOW_ALT
boolean showAltitude = true;
@@ -122,6 +124,22 @@ boolean show_cmt = true;
#else
boolean showBattery = false;
#endif
+#ifdef ENABLE_TNC_SELF_TELEMETRY
+ boolean enable_tel = true;
+#else
+ boolean enable_tel = false;
+#endif
+ // Telemetry interval, seconds
+#ifdef TNC_SELF_TELEMETRY_INTERVAL
+ int tel_interval = TNC_SELF_TELEMETRY_INTERVAL;
+#else
+ int tel_interval = 3600;
+#endif
+#ifdef TNC_SELF_TELEMETRY_MIC
+ int tel_mic = 1; // telemetry as "T#MIC"
+#else
+ int tel_mic = 0; // telemetry as "T#001"
+#endif
#ifdef ENABLE_BLUETOOTH
boolean enable_bluetooth = true;
#else
@@ -503,27 +521,68 @@ String prepareCallsign(const String& callsign){
}
#if defined(ENABLE_TNC_SELF_TELEMETRY) && defined(KISS_PROTOCOL)
-void sendTelemetryFrame() {
- #ifdef T_BEAM_V1_0
- uint8_t b_volt = (axp.getBattVoltage() - 3000) / 5.1;
- uint8_t b_in_c = (axp.getBattChargeCurrent()) / 10;
- uint8_t b_out_c = (axp.getBattDischargeCurrent()) / 10;
- uint8_t ac_volt = (axp.getVbusVoltage() - 3000) / 28;
- uint8_t ac_c = (axp.getVbusCurrent()) / 10;
+ void sendTelemetryFrame() {
+ if(enable_tel == true){
+ #ifdef T_BEAM_V1_0
+ uint8_t b_volt = (axp.getBattVoltage() - 3000) / 5.1;
+ uint8_t b_in_c = (axp.getBattChargeCurrent()) / 10;
+ uint8_t b_out_c = (axp.getBattDischargeCurrent()) / 10;
+ uint8_t ac_volt = (axp.getVbusVoltage() - 3000) / 28;
+ uint8_t ac_c = (axp.getVbusCurrent()) / 10;
+ // Pad telemetry message address to 9 characters
+ char Tcall_message_char[9];
+ sprintf_P(Tcall_message_char, "%-9s", Tcall);
+ String Tcall_message = String(Tcall_message_char);
+ // Flash the light when telemetry is being sent
+ #ifdef ENABLE_LED_SIGNALING
+ digitalWrite(TXLED, LOW);
+ #endif
- String telemetryParamsNames = String(":") + Tcall + ":PARM.B Volt,B In,B Out,AC V,AC C";
- String telemetryUnitNames = String(":") + Tcall + ":UNIT.mV,mA,mA,mV,mA";
- String telemetryEquations = String(":") + Tcall + ":EQNS.0,5.1,3000,0,10,0,0,10,0,0,28,3000,0,10,0";
- String telemetryData = String("T#MIC") + String(b_volt) + ","+ String(b_in_c) + ","+ String(b_out_c) + ","+ String(ac_volt) + ","+ String(ac_c) + ",00000000";
- String telemetryBase = "";
- telemetryBase += Tcall + ">APLO01" + ":";
- sendToTNC(telemetryBase + telemetryParamsNames);
- sendToTNC(telemetryBase + telemetryUnitNames);
- sendToTNC(telemetryBase + telemetryEquations);
- sendToTNC(telemetryBase + telemetryData);
+ // Determine sequence number (or 'MIC')
+ String tel_sequence_str;
+ if(tel_mic == 1){
+ tel_sequence_str = "MIC";
+ }else{
+ // Get the current saved telemetry sequence
+ tel_sequence = preferences.getUInt(PREF_TNC_SELF_TELEMETRY_SEQ, 0);
+ // Pad to 3 digits
+ char tel_sequence_char[3];
+ sprintf_P(tel_sequence_char, "%03u", tel_sequence);
+ tel_sequence_str = String(tel_sequence_char);
+ }
+
+ String telemetryParamsNames = String(":") + Tcall_message + ":PARM.B Volt,B In,B Out,AC V,AC C";
+ String telemetryUnitNames = String(":") + Tcall_message + ":UNIT.mV,mA,mA,mV,mA";
+ String telemetryEquations = String(":") + Tcall_message + ":EQNS.0,5.1,3000,0,10,0,0,10,0,0,28,3000,0,10,0";
+ String telemetryData = String("T#") + tel_sequence_str + "," + String(b_volt) + "," + String(b_in_c) + "," + String(b_out_c) + "," + String(ac_volt) + "," + String(ac_c) + ",00000000";
+ String telemetryBase = "";
+ telemetryBase += Tcall + ">APLO01," + relay_path + ":";
+ Serial.print(telemetryBase);
+ sendToTNC(telemetryBase + telemetryParamsNames);
+ sendToTNC(telemetryBase + telemetryUnitNames);
+ sendToTNC(telemetryBase + telemetryEquations);
+ sendToTNC(telemetryBase + telemetryData);
+
+ // Show when telemetry is being sent
+ writedisplaytext("((TEL TX))","","","","","");
+
+ // Flash the light when telemetry is being sent
+ #ifdef ENABLE_LED_SIGNALING
+ digitalWrite(TXLED, HIGH);
+ #endif
+
+ // Update the telemetry sequence number
+ if(tel_sequence >= 999){
+ tel_sequence = 0;
+ }else{
+ tel_sequence = tel_sequence + 1;
+ }
+ preferences.putUInt(PREF_TNC_SELF_TELEMETRY_SEQ, tel_sequence);
+
+ }
+ #endif
+ }
#endif
-}
-#endif
// + SETUP --------------------------------------------------------------+//
void setup(){
@@ -552,6 +611,10 @@ void setup(){
fixed_beacon_enabled = true;
#endif
+// This section loads values from saved preferences,
+// if available.
+// https://randomnerdtutorials.com/esp32-save-data-permanently-preferences/
+
#ifdef ENABLE_PREFERENCES
int clear_preferences = 0;
if(digitalRead(BUTTON)==LOW){
@@ -618,6 +681,30 @@ void setup(){
}
showBattery = preferences.getBool(PREF_APRS_SHOW_BATTERY);
+ if (!preferences.getBool(PREF_ENABLE_TNC_SELF_TELEMETRY_INIT)){
+ preferences.putBool(PREF_ENABLE_TNC_SELF_TELEMETRY_INIT, true);
+ preferences.putBool(PREF_ENABLE_TNC_SELF_TELEMETRY, enable_tel);
+ }
+ enable_tel = preferences.getBool(PREF_ENABLE_TNC_SELF_TELEMETRY);
+
+ if (!preferences.getBool(PREF_TNC_SELF_TELEMETRY_INTERVAL_INIT)){
+ preferences.putBool(PREF_TNC_SELF_TELEMETRY_INTERVAL_INIT, true);
+ preferences.putInt(PREF_TNC_SELF_TELEMETRY_INTERVAL, tel_interval);
+ }
+ tel_interval = preferences.getInt(PREF_TNC_SELF_TELEMETRY_INTERVAL);
+
+ if (!preferences.getBool(PREF_TNC_SELF_TELEMETRY_SEQ_INIT)){
+ preferences.putBool(PREF_TNC_SELF_TELEMETRY_SEQ_INIT, true);
+ preferences.putInt(PREF_TNC_SELF_TELEMETRY_SEQ, tel_sequence);
+ }
+ tel_sequence = preferences.getInt(PREF_TNC_SELF_TELEMETRY_SEQ);
+
+ if (!preferences.getBool(PREF_TNC_SELF_TELEMETRY_MIC_INIT)){
+ preferences.putBool(PREF_TNC_SELF_TELEMETRY_MIC_INIT, true);
+ preferences.putInt(PREF_TNC_SELF_TELEMETRY_MIC, tel_mic);
+ }
+ tel_mic = preferences.getInt(PREF_TNC_SELF_TELEMETRY_MIC);
+
if (!preferences.getBool(PREF_APRS_LATITUDE_PRESET_INIT)){
preferences.putBool(PREF_APRS_LATITUDE_PRESET_INIT, true);
preferences.putString(PREF_APRS_LATITUDE_PRESET, LATIDUDE_PRESET);
@@ -1103,7 +1190,8 @@ void loop() {
}
#if defined(ENABLE_TNC_SELF_TELEMETRY) && defined(KISS_PROTOCOL)
if (nextTelemetryFrame < millis()){
- nextTelemetryFrame = millis() + TNC_SELF_TELEMETRY_INTERVAL;
+ // Schedule the next telemetry frame
+ nextTelemetryFrame = millis() + (tel_interval * 1000);
sendTelemetryFrame();
}
#endif
diff --git a/src/taskWebServer.cpp b/src/taskWebServer.cpp
index 3ad432e..b3608ca 100644
--- a/src/taskWebServer.cpp
+++ b/src/taskWebServer.cpp
@@ -211,6 +211,9 @@ void handle_Cfg() {
jsonData += jsonLineFromPreferenceBool(PREF_APRS_FIXED_BEACON_PRESET);
jsonData += jsonLineFromPreferenceBool(PREF_APRS_SHOW_ALTITUDE);
jsonData += jsonLineFromPreferenceBool(PREF_APRS_GPS_EN);
+ jsonData += jsonLineFromPreferenceBool(PREF_ENABLE_TNC_SELF_TELEMETRY);
+ jsonData += jsonLineFromPreferenceInt(PREF_TNC_SELF_TELEMETRY_INTERVAL);
+ jsonData += jsonLineFromPreferenceInt(PREF_TNC_SELF_TELEMETRY_MIC);
jsonData += jsonLineFromPreferenceBool(PREF_DEV_OL_EN);
jsonData += jsonLineFromPreferenceBool(PREF_APRS_SHOW_CMT);
jsonData += jsonLineFromPreferenceBool(PREF_DEV_BT_EN);
@@ -277,6 +280,12 @@ void handle_SaveAPRSCfg() {
if (server.hasArg(PREF_APRS_LONGITUDE_PRESET)){
preferences.putString(PREF_APRS_LONGITUDE_PRESET, server.arg(PREF_APRS_LONGITUDE_PRESET));
}
+ if (server.hasArg(PREF_TNC_SELF_TELEMETRY_INTERVAL)){
+ preferences.putInt(PREF_TNC_SELF_TELEMETRY_INTERVAL, server.arg(PREF_TNC_SELF_TELEMETRY_INTERVAL).toInt());
+ }
+ if (server.hasArg(PREF_TNC_SELF_TELEMETRY_MIC)){
+ preferences.putInt(PREF_TNC_SELF_TELEMETRY_MIC, server.arg(PREF_TNC_SELF_TELEMETRY_MIC).toInt());
+ }
// Smart Beaconing settings
if (server.hasArg(PREF_APRS_FIXED_BEACON_INTERVAL_PRESET)){
@@ -297,8 +306,10 @@ void handle_SaveAPRSCfg() {
if (server.hasArg(PREF_APRS_SB_ANGLE_PRESET)){
preferences.putDouble(PREF_APRS_SB_ANGLE_PRESET, server.arg(PREF_APRS_SB_ANGLE_PRESET).toDouble());
}
+
preferences.putBool(PREF_APRS_SHOW_BATTERY, server.hasArg(PREF_APRS_SHOW_BATTERY));
+ preferences.putBool(PREF_ENABLE_TNC_SELF_TELEMETRY, server.hasArg(PREF_ENABLE_TNC_SELF_TELEMETRY));
preferences.putBool(PREF_APRS_SHOW_ALTITUDE, server.hasArg(PREF_APRS_SHOW_ALTITUDE));
preferences.putBool(PREF_APRS_FIXED_BEACON_PRESET, server.hasArg(PREF_APRS_FIXED_BEACON_PRESET));
preferences.putBool(PREF_APRS_GPS_EN, server.hasArg(PREF_APRS_GPS_EN));