Compare commits

..

22 Commits

Author SHA1 Message Date
richonguzman 2f0f991785 readme2 2024-10-09 11:46:45 -03:00
richonguzman 975b140c73 readme1 2024-10-09 11:45:01 -03:00
richonguzman f2abe34af1 readme Update Digi Eco Mode 2024-10-08 12:25:09 -03:00
richonguzman a786d83b9e Queries for DigiEcoMode 2024-10-08 12:19:22 -03:00
richonguzman bf0a0d6e4c EcoMode Digi 2024-10-08 11:04:36 -03:00
richonguzman d08e5b1b27 ready for testing LowPowerDigi 2024-10-08 01:22:10 -03:00
richonguzman f387e03b53 testing LowPowerDigi 2024-10-08 01:03:58 -03:00
richonguzman 16215f9e56 minor update for Internal Battery Sleep 2024-10-07 11:10:19 -03:00
richonguzman ce01d0aa4d minor white spaces kill 2024-10-07 09:39:31 -03:00
richonguzman b0a05f89f6 readme update 2024-10-06 23:35:51 -03:00
richonguzman 58d8736969 test for Killed Wifi Active 2024-10-06 23:23:22 -03:00
richonguzman df9060d906 testing not active 2024-10-06 23:02:10 -03:00
richonguzman 2bd6844d89 WiFiAP Active switch added 2024-10-06 22:59:58 -03:00
richonguzman 0a79b6459b added initial corrections to WiFiAP 2024-10-06 22:30:44 -03:00
richonguzman d5eb32a38b cross digi rules added 2024-10-06 11:37:25 -03:00
richonguzman d6c5741fde cross digi added 2024-10-06 11:36:37 -03:00
richonguzman 1063a82294 se viene thirdParty 2024-10-05 20:25:29 -03:00
richonguzman 6913b6b89f ahora a probar thirdParty 2024-10-05 20:23:58 -03:00
richonguzman 42c990f5cf !thirdParty con o sin path 2024-10-05 20:21:36 -03:00
richonguzman a17900e4d0 bme into wxsensor 2024-10-05 08:48:08 -03:00
richonguzman 3fd819bd4e not encoded telemetry as default 2024-09-25 11:23:38 -03:00
richonguzman 640166a50b update for wiki 2024-09-23 17:41:05 -03:00
26 changed files with 323 additions and 226 deletions
+6 -1
View File
@@ -7,6 +7,8 @@ This firmware is for using ESP32 based boards with LoRa Modules and GPS to live
__(This iGate Firmware works with all LoRa Tracker Firmwares (specially this <a href="https://github.com/richonguzman/LoRa_APRS_Tracker" target="_blank">LoRa APRS Tracker Firmware</a>))__ __(This iGate Firmware works with all LoRa Tracker Firmwares (specially this <a href="https://github.com/richonguzman/LoRa_APRS_Tracker" target="_blank">LoRa APRS Tracker Firmware</a>))__
<br /> <br />
____________________________________________________
## You can support this project to continue to grow: ## You can support this project to continue to grow:
[<img src="https://github.com/richonguzman/LoRa_APRS_Tracker/blob/main/images/github-sponsors.png">](https://github.com/sponsors/richonguzman) [<img src="https://github.com/richonguzman/LoRa_APRS_Tracker/blob/main/images/paypalme.png">](http://paypal.me/richonguzman) [<img src="https://github.com/richonguzman/LoRa_APRS_Tracker/blob/main/images/github-sponsors.png">](https://github.com/sponsors/richonguzman) [<img src="https://github.com/richonguzman/LoRa_APRS_Tracker/blob/main/images/paypalme.png">](http://paypal.me/richonguzman)
@@ -14,7 +16,8 @@ __(This iGate Firmware works with all LoRa Tracker Firmwares (specially this <a
<br /> <br />
# WEB FLASHER/INSTALLER is <a href="https://richonguzman.github.io/lora-igate-web-flasher/installer.html" target="_blank">here</a> # WEB FLASHER/INSTALLER is <a href="https://richonguzman.github.io/lora-igate-web-flasher/installer.html" target="_blank">here</a>
<br />
____________________________________________________
# WIKI # WIKI
@@ -47,6 +50,8 @@ __(This iGate Firmware works with all LoRa Tracker Firmwares (specially this <a
## Timeline (Versions): ## Timeline (Versions):
- 2024.10.08 New EcoMode for Remote Digirepeaters without WiFi/WiFiAP, Screen, Leds (Example: LILYGO LoRa32 uses only 24mA, with WifiAP and all was 150mA). APRS Message/Queries can start/stop this mode too.
- 2024.10.06 Cross Frequency Digirepeater Rules added.
- 2024.09.23 Libraries Update for SDK3 - 2024.09.23 Libraries Update for SDK3
- 2024.09.23 Added Enconded Telemetry for Battery (+ External Voltage) in Station GPS Beacon Packet. - 2024.09.23 Added Enconded Telemetry for Battery (+ External Voltage) in Station GPS Beacon Packet.
- 2024.08.23 Wemos S2 Mini DIY LoRa added. - 2024.08.23 Wemos S2 Mini DIY LoRa added.
+5 -4
View File
@@ -3,7 +3,7 @@
"wifi": { "wifi": {
"autoAP": { "autoAP": {
"password": "1234567890", "password": "1234567890",
"powerOff": 10 "timeout": 10
}, },
"AP": [] "AP": []
}, },
@@ -28,7 +28,8 @@
"objectsToRF": false "objectsToRF": false
}, },
"digi": { "digi": {
"mode": 0 "mode": 0,
"ecoMode": false
}, },
"lora": { "lora": {
"txFreq": 433775000, "txFreq": 433775000,
@@ -48,7 +49,7 @@
"battery": { "battery": {
"sendInternalVoltage": false, "sendInternalVoltage": false,
"monitorInternalVoltage": false, "monitorInternalVoltage": false,
"internalSleepVoltage": 3.0, "internalSleepVoltage": 2.9,
"sendExternalVoltage": false, "sendExternalVoltage": false,
"externalVoltagePin": 34, "externalVoltagePin": 34,
"monitorExternalVoltage": false, "monitorExternalVoltage": false,
@@ -57,7 +58,7 @@
"voltageDividerR2": 27.0, "voltageDividerR2": 27.0,
"sendVoltageAsTelemetry": true "sendVoltageAsTelemetry": true
}, },
"bme": { "wxsensor": {
"active": false, "active": false,
"heightCorrection": 0, "heightCorrection": 0,
"temperatureCorrection": 0.0 "temperatureCorrection": 0.0
+34 -19
View File
@@ -585,6 +585,21 @@
</option> </option>
</select> </select>
</div> </div>
<div class="col-12 mt-5">
<div class="form-check form-switch">
<input
type="checkbox"
name="digi.ecoMode"
id="digi.ecoMode"
class="form-check-input"
/>
<label
for="digi.ecoMode"
class="form-label"
>Eco Mode<small> This will disable WiFi, Display, Leds and lower CPU Speed for Low Power Digirepeater. (<strong>Caution:</strong> Active means No WebUI Configuration, so <strong>ONLY</strong> activate this for Remote Digirepeater)</small></label
>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
@@ -1012,7 +1027,7 @@
placeholder="3.0" placeholder="3.0"
class="form-control" class="form-control"
step="0.1" step="0.1"
min="3.0" min="2.9"
max="3.7" max="3.7"
/> />
<span class="input-group-text" <span class="input-group-text"
@@ -1135,7 +1150,7 @@
d="M3.05 3.05a7 7 0 0 0 0 9.9.5.5 0 0 1-.707.707 8 8 0 0 1 0-11.314.5.5 0 0 1 .707.707m2.122 2.122a4 4 0 0 0 0 5.656.5.5 0 1 1-.708.708 5 5 0 0 1 0-7.072.5.5 0 0 1 .708.708m5.656-.708a.5.5 0 0 1 .708 0 5 5 0 0 1 0 7.072.5.5 0 1 1-.708-.708 4 4 0 0 0 0-5.656.5.5 0 0 1 0-.708m2.122-2.12a.5.5 0 0 1 .707 0 8 8 0 0 1 0 11.313.5.5 0 0 1-.707-.707 7 7 0 0 0 0-9.9.5.5 0 0 1 0-.707zM6 8a2 2 0 1 1 2.5 1.937V15.5a.5.5 0 0 1-1 0V9.937A2 2 0 0 1 6 8" d="M3.05 3.05a7 7 0 0 0 0 9.9.5.5 0 0 1-.707.707 8 8 0 0 1 0-11.314.5.5 0 0 1 .707.707m2.122 2.122a4 4 0 0 0 0 5.656.5.5 0 1 1-.708.708 5 5 0 0 1 0-7.072.5.5 0 0 1 .708.708m5.656-.708a.5.5 0 0 1 .708 0 5 5 0 0 1 0 7.072.5.5 0 1 1-.708-.708 4 4 0 0 0 0-5.656.5.5 0 0 1 0-.708m2.122-2.12a.5.5 0 0 1 .707 0 8 8 0 0 1 0 11.313.5.5 0 0 1-.707-.707 7 7 0 0 0 0-9.9.5.5 0 0 1 0-.707zM6 8a2 2 0 1 1 2.5 1.937V15.5a.5.5 0 0 1-1 0V9.937A2 2 0 0 1 6 8"
/> />
</svg> </svg>
Telemetry WX Telemetry
</h5> </h5>
<small>Define Wx telemetry</small> <small>Define Wx telemetry</small>
</div> </div>
@@ -1145,12 +1160,12 @@
<div class="form-check form-switch"> <div class="form-check form-switch">
<input <input
type="checkbox" type="checkbox"
name="bme.active" name="wxsensor.active"
id="bme.active" id="wxsensor.active"
class="form-check-input" class="form-check-input"
/> />
<label <label
for="bme.active" for="wxsensor.active"
class="form-label" class="form-label"
><b>Activate Wx Telemetry</b> ><b>Activate Wx Telemetry</b>
<small <small
@@ -1162,14 +1177,14 @@
</div> </div>
<div class="row mt-3"> <div class="row mt-3">
<div class="col-6"> <div class="col-6">
<label for="bme.heightCorrection" class="form-label" <label for="wxsensor.heightCorrection" class="form-label"
>Height Correction (Above Sea-Level)</label >Height Correction (Above Sea-Level)</label
> >
<div class="input-group"> <div class="input-group">
<input <input
type="number" type="number"
name="bme.heightCorrection" name="wxsensor.heightCorrection"
id="bme.heightCorrection" id="wxsensor.heightCorrection"
placeholder="0" placeholder="0"
class="form-control" class="form-control"
step="1" step="1"
@@ -1181,14 +1196,14 @@
</div> </div>
</div> </div>
<div class="col-6"> <div class="col-6">
<label for="bme.temperatureCorrection" class="form-label" <label for="wxsensor.temperatureCorrection" class="form-label"
>Temperature Correction</label >Temperature Correction</label
> >
<div class="input-group"> <div class="input-group">
<input <input
type="number" type="number"
name="bme.temperatureCorrection" name="wxsensor.temperatureCorrection"
id="bme.temperatureCorrection" id="wxsensor.temperatureCorrection"
placeholder="0.0" placeholder="0.0"
class="form-control" class="form-control"
step="0.1" step="0.1"
@@ -1453,10 +1468,10 @@
d="M8.5 5.5a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0" d="M8.5 5.5a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0"
/> />
</svg> </svg>
Auto AP WiFi Auto AP
</h5> </h5>
<small <small
>Add your password and power off timeout to >Add your password and WiFi AP timeout to
auto access point. Auto AP will start if auto access point. Auto AP will start if
there is no WiFi connection. Timeout will there is no WiFi connection. Timeout will
count from startup or last client count from startup or last client
@@ -1481,24 +1496,24 @@
</div> </div>
<div class="col-12 mt-3"> <div class="col-12 mt-3">
<label <label
for="wifi.autoAP.powerOff" for="wifi.autoAP.timeout"
class="form-label" class="form-label"
>Power off timeout >WiFi AP timeout to search again for available WiFi's
<small>(in minutes)</small></label <small>(in minutes)</small></label
> >
<input <input
type="number" type="number"
name="wifi.autoAP.powerOff" name="wifi.autoAP.timeout"
id="wifi.autoAP.powerOff" id="wifi.autoAP.timeout"
class="form-control" class="form-control"
placeholder="15" placeholder="10"
required="" required=""
step="1" step="1"
min="0" min="0"
/> />
<div class="form-text"> <div class="form-text">
Set to <strong>0</strong> if you don't Set to <strong>0</strong> if you don't
want this option. want WiFi AP to stop.
</div> </div>
</div> </div>
</div> </div>
+7 -6
View File
@@ -136,6 +136,7 @@ function loadSettings(settings) {
// Digi // Digi
document.getElementById("digi.mode").value = settings.digi.mode; document.getElementById("digi.mode").value = settings.digi.mode;
document.getElementById("digi.ecoMode").checked = settings.digi.ecoMode;
// LoRa // LoRa
document.getElementById("lora.txFreq").value = settings.lora.txFreq; document.getElementById("lora.txFreq").value = settings.lora.txFreq;
@@ -168,10 +169,10 @@ function loadSettings(settings) {
document.getElementById("battery.externalSleepVoltage").value = settings.battery.externalSleepVoltage.toFixed(1); document.getElementById("battery.externalSleepVoltage").value = settings.battery.externalSleepVoltage.toFixed(1);
document.getElementById("battery.sendVoltageAsTelemetry").checked = settings.battery.sendVoltageAsTelemetry; document.getElementById("battery.sendVoltageAsTelemetry").checked = settings.battery.sendVoltageAsTelemetry;
// TELEMETRY BME/WX // TELEMETRY WX SENSOR
document.getElementById("bme.active").checked = settings.bme.active; document.getElementById("wxsensor.active").checked = settings.wxsensor.active;
document.getElementById("bme.heightCorrection").value = settings.bme.heightCorrection; document.getElementById("wxsensor.heightCorrection").value = settings.wxsensor.heightCorrection;
document.getElementById("bme.temperatureCorrection").value = settings.bme.temperatureCorrection.toFixed(1); document.getElementById("wxsensor.temperatureCorrection").value = settings.wxsensor.temperatureCorrection.toFixed(1);
// SYSLOG // SYSLOG
document.getElementById("syslog.active").checked = settings.syslog.active; document.getElementById("syslog.active").checked = settings.syslog.active;
@@ -196,7 +197,7 @@ function loadSettings(settings) {
// WiFi Auto AP // WiFi Auto AP
document.getElementById("wifi.autoAP.password").value = settings.wifi.autoAP.password; document.getElementById("wifi.autoAP.password").value = settings.wifi.autoAP.password;
document.getElementById("wifi.autoAP.powerOff").value = settings.wifi.autoAP.powerOff; document.getElementById("wifi.autoAP.timeout").value = settings.wifi.autoAP.timeout;
// OTA // OTA
document.getElementById("ota.username").value = settings.ota.username; document.getElementById("ota.username").value = settings.ota.username;
@@ -242,7 +243,7 @@ document.getElementById('reboot').addEventListener('click', function (e) {
showToast("Your device will be rebooted in a while"); showToast("Your device will be rebooted in a while");
}); });
const bmeCheckbox = document.querySelector("input[name='bme.active']"); const wxsensorCheckbox = document.querySelector("input[name='wxsensor.active']");
const stationModeSelect = document.querySelector("select[name='stationMode']"); const stationModeSelect = document.querySelector("select[name='stationMode']");
Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 198 KiB

+6 -5
View File
@@ -29,16 +29,16 @@ ________________________________________________________________________________
#include "wifi_utils.h" #include "wifi_utils.h"
#include "digi_utils.h" #include "digi_utils.h"
#include "gps_utils.h" #include "gps_utils.h"
#include "bme_utils.h"
#include "web_utils.h" #include "web_utils.h"
#include "tnc_utils.h" #include "tnc_utils.h"
#include "wx_utils.h"
#include "display.h" #include "display.h"
#include "utils.h" #include "utils.h"
#ifdef HAS_A7670 #ifdef HAS_A7670
#include "A7670_utils.h" #include "A7670_utils.h"
#endif #endif
String versionDate = "2024.09.23"; String versionDate = "2024.10.08";
Configuration Config; Configuration Config;
WiFiClient espClient; WiFiClient espClient;
@@ -111,9 +111,10 @@ void setup() {
Config.loramodule.rxActive = false; Config.loramodule.rxActive = false;
} }
#endif #endif
DIGI_Utils::checkEcoMode();
WIFI_Utils::setup(); WIFI_Utils::setup();
SYSLOG_Utils::setup(); SYSLOG_Utils::setup();
BME_Utils::setup(); WX_Utils::setup();
WEB_Utils::setup(); WEB_Utils::setup();
TNC_Utils::setup(); TNC_Utils::setup();
#ifdef HAS_A7670 #ifdef HAS_A7670
@@ -123,7 +124,7 @@ void setup() {
} }
void loop() { void loop() {
WIFI_Utils::checkIfAutoAPShouldPowerOff(); WIFI_Utils::checkAutoAPTimeout();
if (isUpdatingOTA) { if (isUpdatingOTA) {
ElegantOTA.loop(); ElegantOTA.loop();
@@ -136,7 +137,7 @@ void loop() {
thirdLine = Utils::getLocalIP(); thirdLine = Utils::getLocalIP();
WIFI_Utils::checkWiFi(); // Always use WiFi, not related to IGate/Digi mode WIFI_Utils::checkWiFi();
#ifdef HAS_A7670 #ifdef HAS_A7670
if (Config.aprs_is.active && !modemLoggedToAPRSIS) A7670_Utils::APRS_IS_connect(); if (Config.aprs_is.active && !modemLoggedToAPRSIS) A7670_Utils::APRS_IS_connect();
+3 -2
View File
@@ -71,7 +71,7 @@ namespace APRS_IS_Utils {
if (WiFi.status() == WL_CONNECTED) { if (WiFi.status() == WL_CONNECTED) {
wifiState = "OK"; wifiState = "OK";
} else { } else {
if (backUpDigiMode) { if (backUpDigiMode || Config.digi.ecoMode) {
wifiState = "--"; wifiState = "--";
} else { } else {
wifiState = "AP"; wifiState = "AP";
@@ -138,7 +138,8 @@ namespace APRS_IS_Utils {
//Serial.println(ackMessage); //Serial.println(ackMessage);
String addToBuffer = Config.callsign; String addToBuffer = Config.callsign;
addToBuffer += ">APLRG1,RFONLY"; addToBuffer += ">APLRG1";
if (!thirdParty) addToBuffer += ",RFONLY";
if (Config.beacon.path != "") { if (Config.beacon.path != "") {
addToBuffer += ","; addToBuffer += ",";
addToBuffer += Config.beacon.path; addToBuffer += Config.beacon.path;
-2
View File
@@ -222,7 +222,6 @@ namespace BATTERY_Utils {
} }
} }
String generateEncodedTelemetryBytes(float value, bool firstBytes, byte voltageType) { // 0 = internal battery(0-4,2V) , 1 = external battery(0-15V) String generateEncodedTelemetryBytes(float value, bool firstBytes, byte voltageType) { // 0 = internal battery(0-4,2V) , 1 = external battery(0-15V)
String encodedBytes; String encodedBytes;
int tempValue; int tempValue;
@@ -251,7 +250,6 @@ namespace BATTERY_Utils {
return encodedBytes; return encodedBytes;
} }
String generateEncodedTelemetry() { String generateEncodedTelemetry() {
String telemetry = "|"; String telemetry = "|";
telemetry += generateEncodedTelemetryBytes(telemetryCounter, true, 0); telemetry += generateEncodedTelemetryBytes(telemetryCounter, true, 0);
+2 -2
View File
@@ -14,8 +14,8 @@ namespace BATTERY_Utils {
void checkIfShouldSleep(); // ???? void checkIfShouldSleep(); // ????
void startupBatteryHealth(); void startupBatteryHealth();
String generateEncodedTelemetryBytes(float value, bool firstBytes, byte voltageType); String generateEncodedTelemetryBytes(float value, bool firstBytes, byte voltageType);
String generateEncodedTelemetry(); String generateEncodedTelemetry();
} }
-23
View File
@@ -1,23 +0,0 @@
#ifndef BME_UTILS_H_
#define BME_UTILS_H_
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <Adafruit_BMP280.h>
#include <Adafruit_BME680.h>
#include "Adafruit_Si7021.h"
#include <Arduino.h>
namespace BME_Utils {
void getWxModuleAddres();
void setup();
String generateTempString(const float bmeTemp);
String generateHumString(const float bmeHum);
String generatePresString(const float bmePress);
String readDataSensor();
}
#endif
+8 -8
View File
@@ -10,7 +10,7 @@
// LORA MODULES // LORA MODULES
#if defined(TTGO_T_LORA32_V2_1) || defined(HELTEC_V2) || defined(ESP32_DIY_LoRa) || defined(TTGO_T_Beam_V1_2) || defined(TTGO_T_Beam_V1_0) || defined(TTGO_T_LORA32_V2_1_915) || defined(ESP32_DIY_LoRa_915) || defined(TTGO_T_Beam_V1_2_915) || defined(TTGO_T_Beam_V1_0_915) #if defined(TTGO_T_LORA32_V2_1) || defined(HELTEC_V2) || defined(ESP32_DIY_LoRa) || defined(TTGO_T_Beam_V1_2) || defined(TTGO_T_Beam_V1_0) || defined(TTGO_T_LORA32_V2_1_915) || defined(ESP32_DIY_LoRa_915) || defined(TTGO_T_Beam_V1_2_915) || defined(TTGO_T_Beam_V1_0_915)
#define RADIO_SCLK_PIN 5 // GPIO5 - SX1278 SCK #define RADIO_SCLK_PIN 5 // GPIO5 - SX1278 SCK
#define RADIO_MISO_PIN 19 // GPIO19 - SX1278 MISO #define RADIO_MISO_PIN 19 // GPIO19 - SX1278 MISO
#define RADIO_MOSI_PIN 27 // GPIO27 - SX1278 MOSI #define RADIO_MOSI_PIN 27 // GPIO27 - SX1278 MOSI
#define RADIO_CS_PIN 18 // GPIO18 - SX1278 CS ---> NSS #define RADIO_CS_PIN 18 // GPIO18 - SX1278 CS ---> NSS
@@ -19,13 +19,13 @@
#endif #endif
#if defined(HELTEC_V3) || defined(HELTEC_WSL_V3) || defined(HELTEC_WSL_V3_DISPLAY) || defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_WS) || defined(HELTEC_WP) #if defined(HELTEC_V3) || defined(HELTEC_WSL_V3) || defined(HELTEC_WSL_V3_DISPLAY) || defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_WS) || defined(HELTEC_WP)
#define RADIO_SCLK_PIN 9 // SX1262 SCK #define RADIO_SCLK_PIN 9 // SX1262 SCK
#define RADIO_MISO_PIN 11 // SX1262 MISO #define RADIO_MISO_PIN 11 // SX1262 MISO
#define RADIO_MOSI_PIN 10 // SX1262 MOSI #define RADIO_MOSI_PIN 10 // SX1262 MOSI
#define RADIO_CS_PIN 8 // SX1262 NSS #define RADIO_CS_PIN 8 // SX1262 NSS
#define RADIO_RST_PIN 12 // SX1262 RST #define RADIO_RST_PIN 12 // SX1262 RST
#define RADIO_DIO1_PIN 14 // SX1262 DIO1 #define RADIO_DIO1_PIN 14 // SX1262 DIO1
#define RADIO_BUSY_PIN 13 // SX1262 BUSY #define RADIO_BUSY_PIN 13 // SX1262 BUSY
#endif #endif
#if defined(ESP32_DIY_1W_LoRa) || defined(ESP32_DIY_1W_LoRa_915) || defined(ESP32_DIY_1W_LoRa_LLCC68) // Ebyte E22 400M30S (SX1268) or E22 900M30S (SX1262) or E220 LLCC68 #if defined(ESP32_DIY_1W_LoRa) || defined(ESP32_DIY_1W_LoRa_915) || defined(ESP32_DIY_1W_LoRa_LLCC68) // Ebyte E22 400M30S (SX1268) or E22 900M30S (SX1262) or E220 LLCC68
+19 -16
View File
@@ -18,7 +18,7 @@ void Configuration::writeFile() {
} }
data["wifi"]["autoAP"]["password"] = wifiAutoAP.password; data["wifi"]["autoAP"]["password"] = wifiAutoAP.password;
data["wifi"]["autoAP"]["powerOff"] = wifiAutoAP.powerOff; data["wifi"]["autoAP"]["timeout"] = wifiAutoAP.timeout;
data["callsign"] = callsign; data["callsign"] = callsign;
@@ -41,6 +41,7 @@ void Configuration::writeFile() {
data["beacon"]["path"] = beacon.path; data["beacon"]["path"] = beacon.path;
data["digi"]["mode"] = digi.mode; data["digi"]["mode"] = digi.mode;
data["digi"]["ecoMode"] = digi.ecoMode;
data["lora"]["rxFreq"] = loramodule.rxFreq; data["lora"]["rxFreq"] = loramodule.rxFreq;
data["lora"]["txFreq"] = loramodule.txFreq; data["lora"]["txFreq"] = loramodule.txFreq;
@@ -68,9 +69,9 @@ void Configuration::writeFile() {
data["battery"]["sendVoltageAsTelemetry"] = battery.sendVoltageAsTelemetry; data["battery"]["sendVoltageAsTelemetry"] = battery.sendVoltageAsTelemetry;
data["bme"]["active"] = bme.active; data["wxsensor"]["active"] = wxsensor.active;
data["bme"]["heightCorrection"] = bme.heightCorrection; data["wxsensor"]["heightCorrection"] = wxsensor.heightCorrection;
data["bme"]["temperatureCorrection"] = bme.temperatureCorrection; data["wxsensor"]["temperatureCorrection"] = wxsensor.temperatureCorrection;
data["syslog"]["active"] = syslog.active; data["syslog"]["active"] = syslog.active;
data["syslog"]["server"] = syslog.server; data["syslog"]["server"] = syslog.server;
@@ -129,7 +130,7 @@ bool Configuration::readFile() {
} }
wifiAutoAP.password = data["wifi"]["autoAP"]["password"] | "1234567890"; wifiAutoAP.password = data["wifi"]["autoAP"]["password"] | "1234567890";
wifiAutoAP.powerOff = data["wifi"]["autoAP"]["powerOff"] | 10; wifiAutoAP.timeout = data["wifi"]["autoAP"]["timeout"] | 10;
callsign = data["callsign"] | "NOCALL-10"; callsign = data["callsign"] | "NOCALL-10";
rememberStationTime = data["other"]["rememberStationTime"] | 30; rememberStationTime = data["other"]["rememberStationTime"] | 30;
@@ -153,6 +154,7 @@ bool Configuration::readFile() {
aprs_is.objectsToRF = data["aprs_is"]["objectsToRF"] | false; aprs_is.objectsToRF = data["aprs_is"]["objectsToRF"] | false;
digi.mode = data["digi"]["mode"] | 0; digi.mode = data["digi"]["mode"] | 0;
digi.ecoMode = data["digi"]["ecoMode"] | false;
loramodule.txFreq = data["lora"]["txFreq"] | 433775000; loramodule.txFreq = data["lora"]["txFreq"] | 433775000;
loramodule.rxFreq = data["lora"]["rxFreq"] | 433775000; loramodule.rxFreq = data["lora"]["rxFreq"] | 433775000;
@@ -169,7 +171,7 @@ bool Configuration::readFile() {
battery.sendInternalVoltage = data["battery"]["sendInternalVoltage"] | false; battery.sendInternalVoltage = data["battery"]["sendInternalVoltage"] | false;
battery.monitorInternalVoltage = data["battery"]["monitorInternalVoltage"] | false; battery.monitorInternalVoltage = data["battery"]["monitorInternalVoltage"] | false;
battery.internalSleepVoltage = data["battery"]["internalSleepVoltage"] | 3.0; battery.internalSleepVoltage = data["battery"]["internalSleepVoltage"] | 2.9;
battery.sendExternalVoltage = data["battery"]["sendExternalVoltage"] | false; battery.sendExternalVoltage = data["battery"]["sendExternalVoltage"] | false;
battery.externalVoltagePin = data["battery"]["externalVoltagePin"] | 34; battery.externalVoltagePin = data["battery"]["externalVoltagePin"] | 34;
@@ -178,11 +180,11 @@ bool Configuration::readFile() {
battery.voltageDividerR1 = data["battery"]["voltageDividerR1"] | 100.0; battery.voltageDividerR1 = data["battery"]["voltageDividerR1"] | 100.0;
battery.voltageDividerR2 = data["battery"]["voltageDividerR2"] | 27.0; battery.voltageDividerR2 = data["battery"]["voltageDividerR2"] | 27.0;
battery.sendVoltageAsTelemetry = data["battery"]["sendVoltageAsTelemetry"] | true; battery.sendVoltageAsTelemetry = data["battery"]["sendVoltageAsTelemetry"] | false;
bme.active = data["bme"]["active"] | false; wxsensor.active = data["wxsensor"]["active"] | false;
bme.heightCorrection = data["bme"]["heightCorrection"] | 0; wxsensor.heightCorrection = data["wxsensor"]["heightCorrection"] | 0;
bme.temperatureCorrection = data["bme"]["temperatureCorrection"] | 0.0; wxsensor.temperatureCorrection = data["wxsensor"]["temperatureCorrection"] | 0.0;
syslog.active = data["syslog"]["active"] | false; syslog.active = data["syslog"]["active"] | false;
syslog.server = data["syslog"]["server"] | "192.168.0.100"; syslog.server = data["syslog"]["server"] | "192.168.0.100";
@@ -234,7 +236,7 @@ void Configuration::init() {
wifiAPs.push_back(wifiap); wifiAPs.push_back(wifiap);
wifiAutoAP.password = "1234567890"; wifiAutoAP.password = "1234567890";
wifiAutoAP.powerOff = 15; wifiAutoAP.timeout = 10;
callsign = "N0CALL-10"; callsign = "N0CALL-10";
@@ -248,7 +250,8 @@ void Configuration::init() {
beacon.sendViaRF = false; beacon.sendViaRF = false;
beacon.path = "WIDE1-1"; beacon.path = "WIDE1-1";
digi.mode = 0; digi.mode = 0;
digi.ecoMode = false;
tnc.enableServer = false; tnc.enableServer = false;
tnc.enableSerial = false; tnc.enableSerial = false;
@@ -279,9 +282,9 @@ void Configuration::init() {
syslog.server = "192.168.0.100"; syslog.server = "192.168.0.100";
syslog.port = 514; syslog.port = 514;
bme.active = false; wxsensor.active = false;
bme.heightCorrection = 0; wxsensor.heightCorrection = 0;
bme.temperatureCorrection = 0.0; wxsensor.temperatureCorrection = 0.0;
ota.username = ""; ota.username = "";
ota.password = ""; ota.password = "";
@@ -290,7 +293,7 @@ void Configuration::init() {
battery.sendInternalVoltage = false; battery.sendInternalVoltage = false;
battery.monitorInternalVoltage = false; battery.monitorInternalVoltage = false;
battery.internalSleepVoltage = 3.0; battery.internalSleepVoltage = 2.9;
battery.sendExternalVoltage = false; battery.sendExternalVoltage = false;
battery.externalVoltagePin = 34; battery.externalVoltagePin = 34;
+4 -3
View File
@@ -14,7 +14,7 @@ public:
class WiFi_Auto_AP { class WiFi_Auto_AP {
public: public:
String password; String password;
int powerOff; int timeout;
}; };
class BEACON { class BEACON {
@@ -44,6 +44,7 @@ public:
class DIGI { class DIGI {
public: public:
int mode; int mode;
bool ecoMode;
}; };
@@ -80,7 +81,7 @@ public:
bool sendVoltageAsTelemetry; bool sendVoltageAsTelemetry;
}; };
class BME { class WXSENSOR {
public: public:
bool active; bool active;
int heightCorrection; int heightCorrection;
@@ -132,7 +133,7 @@ public:
LoraModule loramodule; LoraModule loramodule;
Display display; Display display;
BATTERY battery; BATTERY battery;
BME bme; WXSENSOR wxsensor;
SYSLOG syslog; SYSLOG syslog;
TNC tnc; TNC tnc;
OTA ota; OTA ota;
+69 -30
View File
@@ -25,31 +25,52 @@ extern bool backUpDigiMode;
namespace DIGI_Utils { namespace DIGI_Utils {
String buildPacket(const String& path, const String& packet, bool thirdParty) { String buildPacket(const String& path, const String& packet, bool thirdParty, bool crossFreq) {
String packetToRepeat = packet.substring(0, packet.indexOf(",") + 1); if (!crossFreq) {
String tempPath = path; String packetToRepeat = packet.substring(0, packet.indexOf(",") + 1);
String tempPath = path;
if (path.indexOf("WIDE1-1") != -1 && (Config.digi.mode == 2 || Config.digi.mode == 3)) { if (path.indexOf("WIDE1-1") != -1 && (Config.digi.mode == 2 || Config.digi.mode == 3)) {
tempPath.replace("WIDE1-1", Config.callsign + "*"); tempPath.replace("WIDE1-1", Config.callsign + "*");
} else if (path.indexOf("WIDE2-") != -1 && Config.digi.mode == 3) { } else if (path.indexOf("WIDE2-") != -1 && Config.digi.mode == 3) {
if (path.indexOf("*") != 1) { if (path.indexOf(",WIDE1*") != -1) {
tempPath.remove(path.indexOf("*"), 1); tempPath.remove(path.indexOf(",WIDE1*"), 7);
}
if (path.indexOf("*") != -1) {
tempPath.remove(path.indexOf("*"), 1);
}
if (path.indexOf("WIDE2-1") != -1) {
tempPath.replace("WIDE2-1", Config.callsign + "*");
} else if (path.indexOf("WIDE2-2") != -1) {
tempPath.replace("WIDE2-2", Config.callsign + "*,WIDE2-1");
} else {
return "";
}
} }
if (path.indexOf("WIDE2-1") != -1) { packetToRepeat += tempPath;
tempPath.replace("WIDE2-1", Config.callsign + "*"); if (thirdParty) {
} else if (path.indexOf("WIDE2-2") != -1) { packetToRepeat += APRS_IS_Utils::checkForStartingBytes(packet.substring(packet.indexOf(":}")));
tempPath.replace("WIDE2-2", Config.callsign + "*,WIDE2-1");
} else { } else {
return ""; packetToRepeat += APRS_IS_Utils::checkForStartingBytes(packet.substring(packet.indexOf(":")));
} }
return packetToRepeat;
} else { // CrossFreq Digirepeater
String suffix = thirdParty ? ":}" : ":";
String packetToRepeat = packet.substring(0, packet.indexOf(suffix));
String terms[] = {",WIDE1*", ",WIDE2*", "*"};
for (String term : terms) {
int index = packetToRepeat.indexOf(term);
if (index != -1) {
packetToRepeat.remove(index, term.length());
}
}
packetToRepeat += ",";
packetToRepeat += Config.callsign;
packetToRepeat += "*";
packetToRepeat += APRS_IS_Utils::checkForStartingBytes(packet.substring(packet.indexOf(suffix)));
return packetToRepeat;
} }
packetToRepeat += tempPath;
if (thirdParty) {
packetToRepeat += APRS_IS_Utils::checkForStartingBytes(packet.substring(packet.indexOf(":}")));
} else {
packetToRepeat += APRS_IS_Utils::checkForStartingBytes(packet.substring(packet.indexOf(":")));
}
return packetToRepeat;
} }
String generateDigiRepeatedPacket(const String& packet, bool thirdParty){ String generateDigiRepeatedPacket(const String& packet, bool thirdParty){
@@ -62,24 +83,34 @@ namespace DIGI_Utils {
} }
if (temp.indexOf(",") > 2) { // checks for path if (temp.indexOf(",") > 2) { // checks for path
const String& path = temp.substring(temp.indexOf(",") + 1); // after tocall const String& path = temp.substring(temp.indexOf(",") + 1); // after tocall
if ((Config.digi.mode == 2 || backUpDigiMode) && path.indexOf("WIDE1-1") != - 1) { if (Config.digi.mode == 2 || backUpDigiMode) {
return buildPacket(path, packet, thirdParty); if (path.indexOf("WIDE1-1") != - 1) {
return buildPacket(path, packet, thirdParty, false);
} else if (path.indexOf("WIDE1-1") == -1 && (abs(Config.loramodule.txFreq - Config.loramodule.rxFreq) >= 125000)) { // CrossFreq Digi
return buildPacket(path, packet, thirdParty, true);
} else {
return "";
}
} else if (Config.digi.mode == 3) { } else if (Config.digi.mode == 3) {
int wide1Index = path.indexOf("WIDE1-1"); if (path.indexOf("WIDE1-1") != -1 || path.indexOf("WIDE2-") != -1) {
int wide2Index = path.indexOf("WIDE2-"); int wide1Index = path.indexOf("WIDE1-1");
int wide2Index = path.indexOf("WIDE2-");
if (wide1Index != -1 && wide2Index != -1 && wide1Index < wide2Index) { // WIDE1-1 && WIDE2-n // WIDE1-1 && WIDE2-n / only WIDE1-1 / only WIDE2-n
return buildPacket(path, packet, thirdParty); if ((wide1Index != -1 && wide2Index != -1 && wide1Index < wide2Index) || (wide1Index != -1 && wide2Index == -1) || (wide1Index == -1 && wide2Index != -1)) {
} else if (wide1Index != -1 && wide2Index == -1) { // only WIDE1-1 return buildPacket(path, packet, thirdParty, false);
return buildPacket(path, packet, thirdParty); }
} else if (wide1Index == -1 && wide2Index != -1) { // only WIDE2-n return "";
return buildPacket(path, packet, thirdParty); } else if (path.indexOf("WIDE1-1") == -1 && path.indexOf("WIDE2-") == -1 && (abs(Config.loramodule.txFreq - Config.loramodule.rxFreq) >= 125000)) { // CrossFreq Digi
return buildPacket(path, packet, thirdParty, true);
} else { } else {
return ""; return "";
} }
} else { } else {
return ""; return "";
} }
} else if (temp.indexOf(",") == -1 && (Config.digi.mode == 2 || backUpDigiMode || Config.digi.mode == 3) && (abs(Config.loramodule.txFreq - Config.loramodule.rxFreq) >= 125000)) {
return buildPacket("", packet, thirdParty, true);
} else { } else {
return ""; return "";
} }
@@ -133,4 +164,12 @@ namespace DIGI_Utils {
} }
} }
void checkEcoMode() {
if (Config.digi.ecoMode) {
Config.display.alwaysOn = false;
Config.display.timeout = 0;
setCpuFrequencyMhz(10);
}
}
} }
+2 -1
View File
@@ -6,9 +6,10 @@
namespace DIGI_Utils { namespace DIGI_Utils {
String buildPacket(const String& path, const String& packet, bool thirdParty); String buildPacket(const String& path, const String& packet, bool thirdParty, bool crossFreq);
String generateDigiRepeatedPacket(const String& packet, bool thirdParty); String generateDigiRepeatedPacket(const String& packet, bool thirdParty);
void processLoRaPacket(const String& packet); void processLoRaPacket(const String& packet);
void checkEcoMode();
} }
+1 -1
View File
@@ -10,7 +10,7 @@ namespace GPS_Utils {
char *ax25_base91enc(char *s, uint8_t n, uint32_t v); char *ax25_base91enc(char *s, uint8_t n, uint32_t v);
String encodeGPS(float latitude, float longitude, const String& overlay, const String& symbol); String encodeGPS(float latitude, float longitude, const String& overlay, const String& symbol);
void generateBeacons(); void generateBeacons();
double calculateDistanceCourse(double latitude, double longitude); //double calculateDistanceCourse(double latitude, double longitude);
String decodeEncodedGPS(const String& packet); String decodeEncodedGPS(const String& packet);
String getReceivedGPS(const String& packet); String getReceivedGPS(const String& packet);
String getDistanceAndComment(const String& packet); String getDistanceAndComment(const String& packet);
+3 -3
View File
@@ -116,9 +116,9 @@ namespace LoRa_Utils {
if (Config.loramodule.txFreq != Config.loramodule.rxFreq) { if (Config.loramodule.txFreq != Config.loramodule.rxFreq) {
changeFreqTx(); changeFreqTx();
} }
#ifdef INTERNAL_LED_PIN #ifdef INTERNAL_LED_PIN
digitalWrite(INTERNAL_LED_PIN, HIGH); if (!Config.digi.ecoMode) digitalWrite(INTERNAL_LED_PIN, HIGH);
#endif #endif
int state = radio.transmit("\x3c\xff\x01" + newPacket); int state = radio.transmit("\x3c\xff\x01" + newPacket);
transmitFlag = true; transmitFlag = true;
@@ -133,7 +133,7 @@ namespace LoRa_Utils {
Utils::println(String(state)); Utils::println(String(state));
} }
#ifdef INTERNAL_LED_PIN #ifdef INTERNAL_LED_PIN
digitalWrite(INTERNAL_LED_PIN, LOW); if (!Config.digi.ecoMode) digitalWrite(INTERNAL_LED_PIN, LOW);
#endif #endif
if (Config.loramodule.txFreq != Config.loramodule.rxFreq) { if (Config.loramodule.txFreq != Config.loramodule.rxFreq) {
changeFreqRx(); changeFreqRx();
+11
View File
@@ -3,6 +3,7 @@
#include "query_utils.h" #include "query_utils.h"
#include "lora_utils.h" #include "lora_utils.h"
extern Configuration Config; extern Configuration Config;
extern std::vector<LastHeardStation> lastHeardStations; extern std::vector<LastHeardStation> lastHeardStations;
extern String versionDate; extern String versionDate;
@@ -50,6 +51,16 @@ namespace QUERY_Utils {
// agregar callsign para completar donde esta X callsign --> posicion // agregar callsign para completar donde esta X callsign --> posicion
Serial.println("estaciones escuchadas directo (ultimos 30 min)"); Serial.println("estaciones escuchadas directo (ultimos 30 min)");
answer.concat("?WHERE on development 73!"); answer.concat("?WHERE on development 73!");
} else if (queryQuestion.indexOf("?APRSEEM") == 0) { // Exit DigiRepeater EcoMode
answer = "DigiEcoMode:Stop";
Config.digi.ecoMode = false;
Config.display.alwaysOn = true;
Config.display.timeout = 10;
} else if (queryQuestion.indexOf("?APRSSEM") == 0) { // Start DigiRepeater EcoMode
answer = "DigiEcoMode:Start";
Config.digi.ecoMode = true;
} else if (queryQuestion.indexOf("?APRSEMS") == 0) { // DigiRepeater EcoMode Status
answer = (Config.digi.ecoMode) ? "DigiEcoMode:ON" : "DigiEcoMode:OFF";
} }
String queryAnswer = Config.callsign; String queryAnswer = Config.callsign;
+14 -3
View File
@@ -3,6 +3,7 @@
#include "aprs_is_utils.h" #include "aprs_is_utils.h"
#include "configuration.h" #include "configuration.h"
#include "lora_utils.h" #include "lora_utils.h"
#include "display.h"
#include "utils.h" #include "utils.h"
#include <vector> #include <vector>
@@ -100,11 +101,16 @@ namespace STATION_Utils {
} }
void processOutputPacketBuffer() { void processOutputPacketBuffer() {
int timeToWait = 3 * 1000; // 3 segs between packet Tx and also Rx ??? int timeToWait = 3 * 1000; // 3 segs between packet Tx and also Rx ???
uint32_t lastRx = millis() - lastRxTime; uint32_t lastRx = millis() - lastRxTime;
uint32_t lastTx = millis() - lastTxTime; uint32_t lastTx = millis() - lastTxTime;
bool saveNewDigiEcoModeConfig = false;
if (outputPacketBuffer.size() > 0 && lastTx > timeToWait && lastRx > timeToWait) { if (outputPacketBuffer.size() > 0 && lastTx > timeToWait && lastRx > timeToWait) {
LoRa_Utils::sendNewPacket(outputPacketBuffer[0]); LoRa_Utils::sendNewPacket(outputPacketBuffer[0]);
if (outputPacketBuffer[0].indexOf("DigiEcoMode:Start") != -1 || outputPacketBuffer[0].indexOf("DigiEcoMode:Stop") != -1) {
saveNewDigiEcoModeConfig = true;
shouldSleepLowVoltage = true; // to make sure all packets in outputPacketBuffer are sended before restart.
}
outputPacketBuffer.erase(outputPacketBuffer.begin()); outputPacketBuffer.erase(outputPacketBuffer.begin());
lastTxTime = millis(); lastTxTime = millis();
} }
@@ -115,6 +121,11 @@ namespace STATION_Utils {
delay(4000); delay(4000);
} }
} }
if (saveNewDigiEcoModeConfig) {
Config.writeFile();
displayToggle(false);
ESP.restart();
}
} }
void addToOutputPacketBuffer(const String& packet) { void addToOutputPacketBuffer(const String& packet) {
+9 -7
View File
@@ -22,7 +22,7 @@ String inputSerialBuffer = "";
namespace TNC_Utils { namespace TNC_Utils {
void setup() { void setup() {
if (Config.tnc.enableServer) { if (Config.tnc.enableServer && !Config.digi.ecoMode) {
tncServer.stop(); tncServer.stop();
tncServer.begin(); tncServer.begin();
} }
@@ -133,12 +133,14 @@ namespace TNC_Utils {
} }
void loop() { void loop() {
if (Config.tnc.enableServer) { if (!Config.digi.ecoMode) {
checkNewClients(); if (Config.tnc.enableServer) {
readFromClients(); checkNewClients();
} readFromClients();
if (Config.tnc.enableSerial) { }
readFromSerial(); if (Config.tnc.enableSerial) {
readFromSerial();
}
} }
} }
} }
+10 -7
View File
@@ -9,7 +9,7 @@
#include "lora_utils.h" #include "lora_utils.h"
#include "wifi_utils.h" #include "wifi_utils.h"
#include "gps_utils.h" #include "gps_utils.h"
#include "bme_utils.h" #include "wx_utils.h"
#include "display.h" #include "display.h"
#include "utils.h" #include "utils.h"
@@ -70,7 +70,9 @@ namespace Utils {
} }
String getLocalIP() { String getLocalIP() {
if (!WiFiConnected) { if (Config.digi.ecoMode) {
return "** WiFi AP Killed **";
} else if (!WiFiConnected) {
return "IP : 192.168.4.1"; return "IP : 192.168.4.1";
} else if (backUpDigiMode) { } else if (backUpDigiMode) {
return "- BACKUP DIGI MODE -"; return "- BACKUP DIGI MODE -";
@@ -85,6 +87,7 @@ namespace Utils {
digitalWrite(INTERNAL_LED_PIN,HIGH); digitalWrite(INTERNAL_LED_PIN,HIGH);
#endif #endif
Serial.println("\nStarting Station: " + Config.callsign + " Version: " + versionDate); Serial.println("\nStarting Station: " + Config.callsign + " Version: " + versionDate);
Serial.println((Config.digi.ecoMode) ? "(DigiEcoMode: ON)" : "(DigiEcoMode: OFF)");
displayShow(" LoRa APRS", "", "", " ( iGATE & DIGI )", "", "" , " CA2RXU " + versionDate, 4000); displayShow(" LoRa APRS", "", "", " ( iGATE & DIGI )", "", "" , " CA2RXU " + versionDate, 4000);
#ifdef INTERNAL_LED_PIN #ifdef INTERNAL_LED_PIN
digitalWrite(INTERNAL_LED_PIN,LOW); digitalWrite(INTERNAL_LED_PIN,LOW);
@@ -184,7 +187,7 @@ namespace Utils {
displayToggle(true); displayToggle(true);
} }
if (sendStartTelemetry && Config.battery.sendVoltageAsTelemetry && !Config.bme.active && (Config.battery.sendInternalVoltage || Config.battery.sendExternalVoltage)) { if (sendStartTelemetry && Config.battery.sendVoltageAsTelemetry && !Config.wxsensor.active && (Config.battery.sendInternalVoltage || Config.battery.sendExternalVoltage)) {
sendInitialTelemetryPackets(); sendInitialTelemetryPackets();
} }
@@ -194,11 +197,11 @@ namespace Utils {
String beaconPacket = iGateBeaconPacket; String beaconPacket = iGateBeaconPacket;
String secondaryBeaconPacket = iGateLoRaBeaconPacket; String secondaryBeaconPacket = iGateLoRaBeaconPacket;
if (Config.bme.active && wxModuleType != 0) { if (Config.wxsensor.active && wxModuleType != 0) {
String sensorData = BME_Utils::readDataSensor(); String sensorData = WX_Utils::readDataSensor();
beaconPacket += sensorData; beaconPacket += sensorData;
secondaryBeaconPacket += sensorData; secondaryBeaconPacket += sensorData;
} else if (Config.bme.active && wxModuleType == 0) { } else if (Config.wxsensor.active && wxModuleType == 0) {
beaconPacket += ".../...g...t..."; beaconPacket += ".../...g...t...";
secondaryBeaconPacket += ".../...g...t..."; secondaryBeaconPacket += ".../...g...t...";
} }
@@ -253,7 +256,7 @@ namespace Utils {
} }
#endif #endif
if (Config.battery.sendVoltageAsTelemetry && !Config.bme.active && (Config.battery.sendInternalVoltage || Config.battery.sendExternalVoltage)){ if (Config.battery.sendVoltageAsTelemetry && !Config.wxsensor.active && (Config.battery.sendInternalVoltage || Config.battery.sendExternalVoltage)){
String encodedTelemetry = BATTERY_Utils::generateEncodedTelemetry(); String encodedTelemetry = BATTERY_Utils::generateEncodedTelemetry();
beaconPacket += encodedTelemetry; beaconPacket += encodedTelemetry;
secondaryBeaconPacket += encodedTelemetry; secondaryBeaconPacket += encodedTelemetry;
+29 -26
View File
@@ -110,10 +110,10 @@ namespace WEB_Utils {
} }
Config.callsign = request->getParam("callsign", true)->value(); Config.callsign = request->getParam("callsign", true)->value();
Config.wifiAutoAP.password = request->getParam("wifi.autoAP.password", true)->value();
Config.wifiAutoAP.powerOff = request->getParam("wifi.autoAP.powerOff", true)->value().toInt();
Config.wifiAutoAP.password = request->getParam("wifi.autoAP.password", true)->value();
Config.wifiAutoAP.timeout = request->getParam("wifi.autoAP.timeout", true)->value().toInt();
Config.aprs_is.active = request->hasParam("aprs_is.active", true); Config.aprs_is.active = request->hasParam("aprs_is.active", true);
Config.aprs_is.passcode = request->getParam("aprs_is.passcode", true)->value(); Config.aprs_is.passcode = request->getParam("aprs_is.passcode", true)->value();
@@ -135,7 +135,8 @@ namespace WEB_Utils {
Config.beacon.path = request->getParam("beacon.path", true)->value(); Config.beacon.path = request->getParam("beacon.path", true)->value();
Config.digi.mode = request->getParam("digi.mode", true)->value().toInt(); Config.digi.mode = request->getParam("digi.mode", true)->value().toInt();
Config.digi.ecoMode = request->hasParam("digi.ecoMode", true);
Config.loramodule.txFreq = request->getParam("lora.txFreq", true)->value().toInt(); Config.loramodule.txFreq = request->getParam("lora.txFreq", true)->value().toInt();
@@ -148,11 +149,11 @@ namespace WEB_Utils {
Config.loramodule.rxActive = request->hasParam("lora.rxActive", true); Config.loramodule.rxActive = request->hasParam("lora.rxActive", true);
Config.display.alwaysOn = request->hasParam("display.alwaysOn", true); Config.display.alwaysOn = request->hasParam("display.alwaysOn", true);
if (!Config.display.alwaysOn) { if (!Config.display.alwaysOn) {
Config.display.timeout = request->getParam("display.timeout", true)->value().toInt(); Config.display.timeout = request->getParam("display.timeout", true)->value().toInt();
} }
Config.display.turn180 = request->hasParam("display.turn180", true); Config.display.turn180 = request->hasParam("display.turn180", true);
Config.battery.sendInternalVoltage = request->hasParam("battery.sendInternalVoltage", true); Config.battery.sendInternalVoltage = request->hasParam("battery.sendInternalVoltage", true);
@@ -162,18 +163,18 @@ namespace WEB_Utils {
Config.battery.sendExternalVoltage = request->hasParam("battery.sendExternalVoltage", true); Config.battery.sendExternalVoltage = request->hasParam("battery.sendExternalVoltage", true);
if (Config.battery.sendExternalVoltage) { if (Config.battery.sendExternalVoltage) {
Config.battery.externalVoltagePin = request->getParam("battery.externalVoltagePin", true)->value().toInt(); Config.battery.externalVoltagePin = request->getParam("battery.externalVoltagePin", true)->value().toInt();
Config.battery.voltageDividerR1 = request->getParam("battery.voltageDividerR1", true)->value().toFloat(); Config.battery.voltageDividerR1 = request->getParam("battery.voltageDividerR1", true)->value().toFloat();
Config.battery.voltageDividerR2 = request->getParam("battery.voltageDividerR2", true)->value().toFloat(); Config.battery.voltageDividerR2 = request->getParam("battery.voltageDividerR2", true)->value().toFloat();
} }
Config.battery.monitorExternalVoltage = request->hasParam("battery.monitorExternalVoltage", true); Config.battery.monitorExternalVoltage = request->hasParam("battery.monitorExternalVoltage", true);
Config.battery.externalSleepVoltage = request->getParam("battery.externalSleepVoltage", true)->value().toFloat(); Config.battery.externalSleepVoltage = request->getParam("battery.externalSleepVoltage", true)->value().toFloat();
Config.battery.sendVoltageAsTelemetry = request->hasParam("battery.sendVoltageAsTelemetry", true); Config.battery.sendVoltageAsTelemetry = request->hasParam("battery.sendVoltageAsTelemetry", true);
Config.bme.active = request->hasParam("bme.active", true); Config.wxsensor.active = request->hasParam("wxsensor.active", true);
Config.bme.heightCorrection = request->getParam("bme.heightCorrection", true)->value().toInt(); Config.wxsensor.heightCorrection = request->getParam("wxsensor.heightCorrection", true)->value().toInt();
Config.bme.temperatureCorrection = request->getParam("bme.temperatureCorrection", true)->value().toFloat(); Config.wxsensor.temperatureCorrection = request->getParam("wxsensor.temperatureCorrection", true)->value().toFloat();
if (Config.bme.active) { if (Config.wxsensor.active) {
Config.beacon.symbol = "_"; Config.beacon.symbol = "_";
} }
@@ -258,23 +259,25 @@ namespace WEB_Utils {
} }
void setup() { void setup() {
server.on("/", HTTP_GET, handleHome); if (!Config.digi.ecoMode) {
server.on("/status", HTTP_GET, handleStatus); server.on("/", HTTP_GET, handleHome);
server.on("/received-packets.json", HTTP_GET, handleReceivedPackets); server.on("/status", HTTP_GET, handleStatus);
server.on("/configuration.json", HTTP_GET, handleReadConfiguration); server.on("/received-packets.json", HTTP_GET, handleReceivedPackets);
server.on("/configuration.json", HTTP_POST, handleWriteConfiguration); server.on("/configuration.json", HTTP_GET, handleReadConfiguration);
server.on("/action", HTTP_POST, handleAction); server.on("/configuration.json", HTTP_POST, handleWriteConfiguration);
server.on("/style.css", HTTP_GET, handleStyle); server.on("/action", HTTP_POST, handleAction);
server.on("/script.js", HTTP_GET, handleScript); server.on("/style.css", HTTP_GET, handleStyle);
server.on("/bootstrap.css", HTTP_GET, handleBootstrapStyle); server.on("/script.js", HTTP_GET, handleScript);
server.on("/bootstrap.js", HTTP_GET, handleBootstrapScript); server.on("/bootstrap.css", HTTP_GET, handleBootstrapStyle);
server.on("/favicon.png", HTTP_GET, handleFavicon); server.on("/bootstrap.js", HTTP_GET, handleBootstrapScript);
server.on("/favicon.png", HTTP_GET, handleFavicon);
OTA_Utils::setup(&server); // Include OTA Updater for WebServer OTA_Utils::setup(&server); // Include OTA Updater for WebServer
server.onNotFound(handleNotFound); server.onNotFound(handleNotFound);
server.begin(); server.begin();
}
} }
} }
+31 -29
View File
@@ -23,33 +23,35 @@ uint32_t lastBackupDigiTime = millis();
namespace WIFI_Utils { namespace WIFI_Utils {
void checkWiFi() { void checkWiFi() {
if (backUpDigiMode) { if (!Config.digi.ecoMode) {
uint32_t WiFiCheck = millis() - lastBackupDigiTime; if (backUpDigiMode) {
if (WiFi.status() != WL_CONNECTED && WiFiCheck >= 15 * 60 * 1000) { uint32_t WiFiCheck = millis() - lastBackupDigiTime;
Serial.println("*** Stoping BackUp Digi Mode ***"); if (WiFi.status() != WL_CONNECTED && WiFiCheck >= 15 * 60 * 1000) {
backUpDigiMode = false; Serial.println("*** Stoping BackUp Digi Mode ***");
wifiCounter = 0; backUpDigiMode = false;
} else if (WiFi.status() == WL_CONNECTED) { wifiCounter = 0;
Serial.println("*** WiFi Reconnect Success (Stoping Backup Digi Mode) ***"); } else if (WiFi.status() == WL_CONNECTED) {
backUpDigiMode = false; Serial.println("*** WiFi Reconnect Success (Stoping Backup Digi Mode) ***");
wifiCounter = 0; backUpDigiMode = false;
wifiCounter = 0;
}
} }
}
if (!backUpDigiMode && (WiFi.status() != WL_CONNECTED) && ((millis() - previousWiFiMillis) >= 30 * 1000) && !WiFiAutoAPStarted) { if (!backUpDigiMode && (WiFi.status() != WL_CONNECTED) && ((millis() - previousWiFiMillis) >= 30 * 1000) && !WiFiAutoAPStarted) {
Serial.print(millis()); Serial.print(millis());
Serial.println("Reconnecting to WiFi..."); Serial.println("Reconnecting to WiFi...");
WiFi.disconnect(); WiFi.disconnect();
WIFI_Utils::startWiFi();//WiFi.reconnect(); WIFI_Utils::startWiFi();//WiFi.reconnect();
previousWiFiMillis = millis(); previousWiFiMillis = millis();
if (Config.backupDigiMode) { if (Config.backupDigiMode) {
wifiCounter++; wifiCounter++;
} }
if (wifiCounter >= 2) { if (wifiCounter >= 2) {
Serial.println("*** Starting BackUp Digi Mode ***"); Serial.println("*** Starting BackUp Digi Mode ***");
backUpDigiMode = true; backUpDigiMode = true;
lastBackupDigiTime = millis(); lastBackupDigiTime = millis();
}
} }
} }
} }
@@ -58,7 +60,7 @@ namespace WIFI_Utils {
WiFi.mode(WIFI_MODE_NULL); WiFi.mode(WIFI_MODE_NULL);
WiFi.mode(WIFI_AP); WiFi.mode(WIFI_AP);
WiFi.softAP(Config.callsign + " AP", Config.wifiAutoAP.password); WiFi.softAP(Config.callsign + "-AP", Config.wifiAutoAP.password);
WiFiAutoAPTime = millis(); WiFiAutoAPTime = millis();
WiFiAutoAPStarted = true; WiFiAutoAPStarted = true;
@@ -131,14 +133,14 @@ namespace WIFI_Utils {
} }
} }
void checkIfAutoAPShouldPowerOff() { void checkAutoAPTimeout() {
if (WiFiAutoAPStarted && Config.wifiAutoAP.powerOff > 0) { if (WiFiAutoAPStarted && Config.wifiAutoAP.timeout > 0) {
if (WiFi.softAPgetStationNum() > 0) { if (WiFi.softAPgetStationNum() > 0) {
WiFiAutoAPTime = 0; WiFiAutoAPTime = 0;
} else { } else {
if (WiFiAutoAPTime == 0) { if (WiFiAutoAPTime == 0) {
WiFiAutoAPTime = millis(); WiFiAutoAPTime = millis();
} else if ((millis() - WiFiAutoAPTime) > Config.wifiAutoAP.powerOff * 60 * 1000) { } else if ((millis() - WiFiAutoAPTime) > Config.wifiAutoAP.timeout * 60 * 1000) {
Serial.println("Stopping auto AP"); Serial.println("Stopping auto AP");
WiFiAutoAPStarted = false; WiFiAutoAPStarted = false;
@@ -151,7 +153,7 @@ namespace WIFI_Utils {
} }
void setup() { void setup() {
startWiFi(); if (!Config.digi.ecoMode) startWiFi();
btStop(); btStop();
} }
+1 -1
View File
@@ -9,7 +9,7 @@ namespace WIFI_Utils {
void checkWiFi(); void checkWiFi();
void startAutoAP(); void startAutoAP();
void startWiFi(); void startWiFi();
void checkIfAutoAPShouldPowerOff(); void checkAutoAPTimeout();
void setup(); void setup();
} }
+26 -27
View File
@@ -1,8 +1,9 @@
#include "bme_utils.h"
#include "configuration.h" #include "configuration.h"
#include "gps_utils.h" #include "gps_utils.h"
#include "wx_utils.h"
#include "display.h" #include "display.h"
#define SEALEVELPRESSURE_HPA (1013.25) #define SEALEVELPRESSURE_HPA (1013.25)
#define CORRECTION_FACTOR (8.2296) // for meters #define CORRECTION_FACTOR (8.2296) // for meters
@@ -27,7 +28,7 @@ Adafruit_Si7021 sensor = Adafruit_Si7021();
namespace BME_Utils { namespace WX_Utils {
void getWxModuleAddres() { void getWxModuleAddres() {
uint8_t err, addr; uint8_t err, addr;
@@ -53,7 +54,7 @@ namespace BME_Utils {
} }
void setup() { void setup() {
if (Config.bme.active) { if (Config.wxsensor.active) {
getWxModuleAddres(); getWxModuleAddres();
if (wxModuleAddress != 0x00) { if (wxModuleAddress != 0x00) {
bool wxModuleFound = false; bool wxModuleFound = false;
@@ -129,8 +130,8 @@ namespace BME_Utils {
} }
} }
String generateTempString(const float bmeTemp) { String generateTempString(const float sensorTemp) {
String strTemp = String((int)bmeTemp); String strTemp = String((int)sensorTemp);
switch (strTemp.length()) { switch (strTemp.length()) {
case 1: case 1:
return "00" + strTemp; return "00" + strTemp;
@@ -143,15 +144,15 @@ namespace BME_Utils {
} }
} }
String generateHumString(const float bmeHum) { String generateHumString(const float sensorHum) {
String strHum = String((int)bmeHum); String strHum = String((int)sensorHum);
switch (strHum.length()) { switch (strHum.length()) {
case 1: case 1:
return "0" + strHum; return "0" + strHum;
case 2: case 2:
return strHum; return strHum;
case 3: case 3:
if ((int)bmeHum == 100) { if ((int)sensorHum == 100) {
return "00"; return "00";
} else { } else {
return "-99"; return "-99";
@@ -161,9 +162,9 @@ namespace BME_Utils {
} }
} }
String generatePresString(const float bmePress) { String generatePresString(const float sensorPres) {
String strPress = String((int)bmePress); String strPress = String((int)sensorPres);
String decPress = String(int((bmePress - int(bmePress)) * 10)); String decPress = String(int((sensorPres - int(sensorPres)) * 10));
switch (strPress.length()) { switch (strPress.length()) {
case 1: case 1:
return "000" + strPress + decPress; return "000" + strPress + decPress;
@@ -213,14 +214,12 @@ namespace BME_Utils {
break; break;
} }
String wx;
if (isnan(newTemp) || isnan(newHum) || isnan(newPress)) { if (isnan(newTemp) || isnan(newHum) || isnan(newPress)) {
Serial.println("BME/BMP/Si7021 Module data failed"); Serial.println("BME/BMP/Si7021 Module data failed");
wx = ".../...g...t...";
fifthLine = ""; fifthLine = "";
return wx; return ".../...g...t...";
} else { } else {
String tempStr = generateTempString(((newTemp + Config.bme.temperatureCorrection) * 1.8) + 32); String tempStr = generateTempString(((newTemp + Config.wxsensor.temperatureCorrection) * 1.8) + 32);
String humStr; String humStr;
if (wxModuleType == 1 || wxModuleType == 3 || wxModuleType == 4) { if (wxModuleType == 1 || wxModuleType == 3 || wxModuleType == 4) {
@@ -233,30 +232,30 @@ namespace BME_Utils {
if (wxModuleAddress == 4) { if (wxModuleAddress == 4) {
presStr = "....."; presStr = ".....";
} else { } else {
presStr = generatePresString(newPress + (Config.bme.heightCorrection/CORRECTION_FACTOR)); presStr = generatePresString(newPress + (Config.wxsensor.heightCorrection/CORRECTION_FACTOR));
} }
fifthLine = "BME-> "; fifthLine = "BME-> ";
fifthLine += String(int(newTemp + Config.bme.temperatureCorrection)); fifthLine += String(int(newTemp + Config.wxsensor.temperatureCorrection));
fifthLine += "C "; fifthLine += "C ";
fifthLine += humStr; fifthLine += humStr;
fifthLine += "% "; fifthLine += "% ";
fifthLine += presStr.substring(0,4); fifthLine += presStr.substring(0,4);
fifthLine += "hPa"; fifthLine += "hPa";
wx = ".../...g...t"; String wxPayload = ".../...g...t";
wx += tempStr; wxPayload += tempStr;
wx += "h"; wxPayload += "h";
wx += humStr; wxPayload += humStr;
wx += "b"; wxPayload += "b";
wx += presStr; wxPayload += presStr;
if (wxModuleType == 3) { if (wxModuleType == 3) {
wx += "Gas: "; wxPayload += "Gas: ";
wx += String(newGas); wxPayload += String(newGas);
wx += "Kohms"; wxPayload += "Kohms";
} }
return wx; return wxPayload;
} }
} }
+23
View File
@@ -0,0 +1,23 @@
#ifndef WX_UTILS_H_
#define WX_UTILS_H_
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <Adafruit_BMP280.h>
#include <Adafruit_BME680.h>
#include "Adafruit_Si7021.h"
#include <Arduino.h>
namespace WX_Utils {
void getWxModuleAddres();
void setup();
String generateTempString(const float sensorTemp);
String generateHumString(const float sensorHum);
String generatePresString(const float sensorPres);
String readDataSensor();
}
#endif