Compare commits

...

36 Commits

Author SHA1 Message Date
richonguzman 5ceff0064f small update to avoid sending gps = 0 2024-10-21 11:16:31 -03:00
richonguzman 8beb7c0465 readme update 2024-10-21 09:09:47 -03:00
richonguzman 112e38312d codingRate4 = 4 does not exists 2024-10-21 09:08:53 -03:00
richonguzman 5a1c6e7ed9 testing GPS 2024-10-21 08:28:35 -03:00
richonguzman 0defd5b289 added HWT with GPS 2024-10-14 17:48:14 -03:00
richonguzman cdac54c34e cleaning code 2024-10-14 17:44:01 -03:00
richonguzman 71e98487f6 readme and index update 2024-10-14 17:23:42 -03:00
richonguzman 510b5bdc59 index reads better 2024-10-14 17:15:56 -03:00
richonguzman 00db358cc3 GPS for iGate 2024-10-14 17:04:28 -03:00
richonguzman c0641986aa RxPacket freeze fix 2024-10-14 12:49:01 -03:00
richonguzman 55378bb9f3 readme Update for NTP update 2024-10-14 11:56:48 -03:00
richonguzman 79cf50a630 NTP time added 2024-10-14 11:44:22 -03:00
richonguzman 03ccd2b12e r up 2024-10-11 07:16:44 -03:00
richonguzman d5ffd26c3c double validation for DigiEcoMode start stop 2024-10-10 18:45:12 -03:00
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
33 changed files with 674 additions and 288 deletions
+9 -2
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,10 @@ __(This iGate Firmware works with all LoRa Tracker Firmwares (specially this <a
## Timeline (Versions): ## Timeline (Versions):
- 2024.10.21 Boards with GPS can now send Real-GPS Beacon (also posible: GPS ambiguity of ~ 1 km).
- 2024.10.14 Received Packets in WebUI show real Local Time (NTP with GMT offset).
- 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.
@@ -111,4 +118,4 @@ __(This iGate Firmware works with all LoRa Tracker Firmwares (specially this <a
__________________________________________ __________________________________________
# Hope You Enjoy this, 73 !! CA2RXU , Valparaiso, Chile # Hope You Enjoy this, 73! CA2RXU, Valparaiso, Chile
+8 -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
@@ -80,6 +81,9 @@
"username": "admin", "username": "admin",
"password": "" "password": ""
}, },
"ntp": {
"gmtCorrection": 0
},
"other": { "other": {
"rememberStationTime": 30, "rememberStationTime": 30,
"lowPowerMode": false, "lowPowerMode": false,
+117 -24
View File
@@ -62,11 +62,11 @@
<div class="container d-none" id="received-packets"> <div class="container d-none" id="received-packets">
<div class="row my-5 d-flex align-items-top"> <div class="row my-5 d-flex align-items-top">
<div class="col-12"> <div class="col-12">
<h3>Last 20 received packets list</h3> <h3>Last 10 received packets list</h3>
<table class="table mt-4"> <table class="table mt-4">
<thead> <thead>
<tr> <tr>
<th scope="col">Time*</th> <th scope="col">Time</th>
<th scope="col">Frame</th> <th scope="col">Frame</th>
<th scope="col">RSSI</th> <th scope="col">RSSI</th>
<th scope="col">SNR</th> <th scope="col">SNR</th>
@@ -77,7 +77,7 @@
</tbody> </tbody>
</table> </table>
<span>List refresh automatically every 15 seconds.</span><br> <span>List refresh automatically every 15 seconds.</span><br>
<small>* - For now time is measured from board boot up.</small> <small>(Local Time is NPT-Time adjusted with your GMT Offset)</small>
</div> </div>
</div> </div>
<hr /> <hr />
@@ -532,7 +532,7 @@
class="form-control" class="form-control"
required="" required=""
step="1" step="1"
min="1" min="15"
/> />
<span class="input-group-text" <span class="input-group-text"
>minutes >minutes
@@ -540,6 +540,36 @@
</div> </div>
</div> </div>
</div> </div>
<div class="col-12 mt-3">
<div class="form-check form-switch">
<input
type="checkbox"
name="beacon.gpsActive"
id="beacon.gpsActive"
class="form-check-input"
/>
<label
for="beacon.gpsActive"
class="form-label"
>Send Real-GPS Beacon <small>(Only for Boards with GPS Modules)</small>
</label>
</div>
</div>
<div class="col-12">
<div class="form-check form-switch">
<input
type="checkbox"
name="beacon.gpsAmbiguity"
id="beacon.gpsAmbiguity"
class="form-check-input"
/>
<label
for="beacon.gpsAmbiguity"
class="form-label"
>Send Real-GPS Beacon with Ambiguity <small>(~ 1 Km of Random Error)</small>
</label>
</div>
</div>
</div> </div>
</div> </div>
<hr /> <hr />
@@ -585,6 +615,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>
@@ -791,7 +836,6 @@
id="lora.codingRate4" id="lora.codingRate4"
required="" required=""
> >
<option value="4">4</option>
<option value="5">5</option> <option value="5">5</option>
<option value="6">6</option> <option value="6">6</option>
<option value="7">7</option> <option value="7">7</option>
@@ -1012,7 +1056,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 +1179,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 +1189,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 +1206,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 +1225,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 +1497,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 +1525,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>
@@ -1624,6 +1668,55 @@
</div> </div>
<hr /> <hr />
<div class="row my-5 d-flex align-items-top">
<div class="col-lg-3 col-sm-12">
<h5>
<svg
xmlns="http://www.w3.org/2000/svg"
width="20"
height="20"
fill="currentColor"
class="bi bi-cloud-upload-fill"
viewBox="0 0 16 16"
>
<path
fill-rule="evenodd"
d="M8 0a5.53 5.53 0 0 0-3.594 1.342c-.766.66-1.321 1.52-1.464 2.383C1.266 4.095 0 5.555 0 7.318 0 9.366 1.708 11 3.781 11H7.5V5.707L5.354 7.854a.5.5 0 1 1-.708-.708l3-3a.5.5 0 0 1 .708 0l3 3a.5.5 0 0 1-.708.708L8.5 5.707V11h4.188C14.502 11 16 9.57 16 7.773c0-1.636-1.242-2.969-2.834-3.194C12.923 1.999 10.69 0 8 0m-.5 14.5V11h1v3.5a.5.5 0 0 1-1 0"
/>
</svg>
NTP
</h5>
<small
>Set your GMT Time Zone.
</small>
</div>
<div class="col-lg-9 col-sm-12">
<div class="col-12">
<label
for="ntp.gmtCorrection"
class="form-label"
>GMT Time Correction for accurate Local Time</label
>
<div class="input-group">
<input
type="number"
name="ntp.gmtCorrection"
id="ntp.gmtCorrection"
placeholder="0"
class="form-control"
step="1"
min="-23"
max="23"
/>
<span class="input-group-text"
>hours</span
>
</div>
</div>
</div>
</div>
<hr />
<div class="row my-5 d-flex align-items-top"> <div class="row my-5 d-flex align-items-top">
<div class="col-lg-3 col-sm-12"> <div class="col-lg-3 col-sm-12">
<h5> <h5>
+14 -11
View File
@@ -134,8 +134,12 @@ function loadSettings(settings) {
document.getElementById("beacon.sendViaAPRSIS").checked = settings.beacon.sendViaAPRSIS; document.getElementById("beacon.sendViaAPRSIS").checked = settings.beacon.sendViaAPRSIS;
document.getElementById("beacon.sendViaRF").checked = settings.beacon.sendViaRF; document.getElementById("beacon.sendViaRF").checked = settings.beacon.sendViaRF;
document.getElementById("beacon.gpsActive").checked = settings.beacon.gpsActive;
document.getElementById("beacon.gpsAmbiguity").checked = settings.beacon.gpsAmbiguity;
// 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 +172,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 +200,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;
@@ -207,6 +211,9 @@ function loadSettings(settings) {
document.getElementById("webadmin.username").value = settings.webadmin.username; document.getElementById("webadmin.username").value = settings.webadmin.username;
document.getElementById("webadmin.password").value = settings.webadmin.password; document.getElementById("webadmin.password").value = settings.webadmin.password;
// NTP
document.getElementById("ntp.gmtCorrection").value = settings.ntp.gmtCorrection;
// Experimental // Experimental
document.getElementById("other.backupDigiMode").checked = settings.other.backupDigiMode; document.getElementById("other.backupDigiMode").checked = settings.other.backupDigiMode;
@@ -242,7 +249,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']");
@@ -507,12 +514,8 @@ function loadReceivedPackets(packets) {
packets.forEach((packet) => { packets.forEach((packet) => {
const element = document.createElement("tr"); const element = document.createElement("tr");
date.setTime(packet.millis);
const p = date.toUTCString().split(' ')
element.innerHTML = ` element.innerHTML = `
<td>${p[p.length-2]}</td> <td>${packet.rxTime}</td>
<td>${packet.packet}</td> <td>${packet.packet}</td>
<td>${packet.RSSI}</td> <td>${packet.RSSI}</td>
<td>${packet.SNR}</td> <td>${packet.SNR}</td>
Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 198 KiB

+9
View File
@@ -40,6 +40,7 @@ lib_deps =
ayushsharma82/ElegantOTA @ 3.1.5 ayushsharma82/ElegantOTA @ 3.1.5
mathieucarbou/ESPAsyncWebServer @ 3.2.3 mathieucarbou/ESPAsyncWebServer @ 3.2.3
mathieucarbou/AsyncTCP @ 3.2.5 mathieucarbou/AsyncTCP @ 3.2.5
arduino-libraries/NTPClient @ 3.2.1
[env:ttgo-lora32-v21] [env:ttgo-lora32-v21]
board = ttgo-lora32-v21 board = ttgo-lora32-v21
@@ -211,6 +212,7 @@ build_flags =
-DTTGO_T_Beam_V1_2 -DTTGO_T_Beam_V1_2
-DHAS_SX1278 -DHAS_SX1278
-DHAS_AXP2101 -DHAS_AXP2101
-DHAS_GPS
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1 -DELEGANTOTA_USE_ASYNC_WEBSERVER=1
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -225,6 +227,7 @@ build_flags =
-DTTGO_T_Beam_V1_2_915 -DTTGO_T_Beam_V1_2_915
-DHAS_SX1276 -DHAS_SX1276
-DHAS_AXP2101 -DHAS_AXP2101
-DHAS_GPS
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1 -DELEGANTOTA_USE_ASYNC_WEBSERVER=1
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -239,6 +242,7 @@ build_flags =
-DTTGO_T_Beam_V1_0 -DTTGO_T_Beam_V1_0
-DHAS_SX1278 -DHAS_SX1278
-DHAS_AXP192 -DHAS_AXP192
-DHAS_GPS
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1 -DELEGANTOTA_USE_ASYNC_WEBSERVER=1
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -253,6 +257,7 @@ build_flags =
-DTTGO_T_Beam_V1_0_915 -DTTGO_T_Beam_V1_0_915
-DHAS_SX1276 -DHAS_SX1276
-DHAS_AXP192 -DHAS_AXP192
-DHAS_GPS
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1 -DELEGANTOTA_USE_ASYNC_WEBSERVER=1
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -267,6 +272,7 @@ build_flags =
-DTTGO_T_Beam_V1_0_SX1268 -DTTGO_T_Beam_V1_0_SX1268
-DHAS_SX1268 -DHAS_SX1268
-DHAS_AXP192 -DHAS_AXP192
-DHAS_GPS
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1 -DELEGANTOTA_USE_ASYNC_WEBSERVER=1
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -281,6 +287,7 @@ build_flags =
-DTTGO_T_Beam_V1_2_SX1262 -DTTGO_T_Beam_V1_2_SX1262
-DHAS_SX1262 -DHAS_SX1262
-DHAS_AXP2101 -DHAS_AXP2101
-DHAS_GPS
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1 -DELEGANTOTA_USE_ASYNC_WEBSERVER=1
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -326,6 +333,8 @@ build_flags =
-Werror -Wall -Werror -Wall
-DHELTEC_WIRELESS_TRACKER -DHELTEC_WIRELESS_TRACKER
-DHAS_SX1262 -DHAS_SX1262
-DHAS_GPS
-DGPS_BAUDRATE=115200
-DHAS_TFT -DHAS_TFT
-D USER_SETUP_LOADED -D USER_SETUP_LOADED
-D TFT_WIDTH=80 -D TFT_WIDTH=80
+26 -17
View File
@@ -13,6 +13,7 @@
______________________________________________________________________________________________________________*/ ______________________________________________________________________________________________________________*/
#include <ElegantOTA.h> #include <ElegantOTA.h>
#include <TinyGPS++.h>
#include <Arduino.h> #include <Arduino.h>
#include <WiFi.h> #include <WiFi.h>
#include <vector> #include <vector>
@@ -29,28 +30,33 @@ ________________________________________________________________________________
#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 "ntp_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.21";
Configuration Config; Configuration Config;
WiFiClient espClient; WiFiClient espClient;
#ifdef HAS_GPS
HardwareSerial gpsSerial(1);
TinyGPSPlus gps;
#endif
uint8_t myWiFiAPIndex = 0; uint8_t myWiFiAPIndex = 0;
int myWiFiAPSize = Config.wifiAPs.size(); int myWiFiAPSize = Config.wifiAPs.size();
WiFi_AP *currentWiFi = &Config.wifiAPs[myWiFiAPIndex]; WiFi_AP *currentWiFi = &Config.wifiAPs[myWiFiAPIndex];
bool isUpdatingOTA = false; bool isUpdatingOTA = false;
uint32_t lastBatteryCheck = 0; uint32_t lastBatteryCheck = 0;
bool backUpDigiMode = false; bool backUpDigiMode = false;
bool modemLoggedToAPRSIS = false; bool modemLoggedToAPRSIS = false;
std::vector<ReceivedPacket> receivedPackets; std::vector<ReceivedPacket> receivedPackets;
@@ -64,11 +70,11 @@ void setup() {
Utils::setupDisplay(); Utils::setupDisplay();
LoRa_Utils::setup(); LoRa_Utils::setup();
Utils::validateFreqs(); Utils::validateFreqs();
GPS_Utils::generateBeacons(); GPS_Utils::setup();
#ifdef STARTUP_DELAY // (TEST) just to wait for WiFi init of Routers #ifdef STARTUP_DELAY // (TEST) just to wait for WiFi init of Routers
displayShow("", " STARTUP DELAY ...", "", "", 0); displayShow("", " STARTUP DELAY ...", "", "", 0);
delay(STARTUP_DELAY * 60 * 1000); delay(STARTUP_DELAY * 60 * 1000);
#endif #endif
#ifdef HELTEC_HTCT62 #ifdef HELTEC_HTCT62
@@ -111,9 +117,11 @@ void setup() {
Config.loramodule.rxActive = false; Config.loramodule.rxActive = false;
} }
#endif #endif
DIGI_Utils::checkEcoMode();
WIFI_Utils::setup(); WIFI_Utils::setup();
NTP_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 +131,7 @@ void setup() {
} }
void loop() { void loop() {
WIFI_Utils::checkIfAutoAPShouldPowerOff(); WIFI_Utils::checkAutoAPTimeout();
if (isUpdatingOTA) { if (isUpdatingOTA) {
ElegantOTA.loop(); ElegantOTA.loop();
@@ -136,7 +144,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();
@@ -144,6 +152,7 @@ void loop() {
if (Config.aprs_is.active && (WiFi.status() == WL_CONNECTED) && !espClient.connected()) APRS_IS_Utils::connect(); if (Config.aprs_is.active && (WiFi.status() == WL_CONNECTED) && !espClient.connected()) APRS_IS_Utils::connect();
#endif #endif
NTP_Utils::update();
TNC_Utils::loop(); TNC_Utils::loop();
Utils::checkDisplayInterval(); Utils::checkDisplayInterval();
+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
+18 -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
@@ -256,6 +256,16 @@
#define RADIO_BUSY_PIN 8 #define RADIO_BUSY_PIN 8
#endif #endif
#if defined(TTGO_T_Beam_V1_2) || defined(TTGO_T_Beam_V1_2_915) || defined(TTGO_T_Beam_V1_0) || defined(TTGO_T_Beam_V1_0_915) || defined(TTGO_T_Beam_V1_0_SX1268) || defined(TTGO_T_Beam_V1_2_SX1262)
#define GPS_RX 12
#define GPS_TX 34
#endif
#if defined( HELTEC_WIRELESS_TRACKER)
#define GPS_RX 34
#define GPS_TX 33
#endif
/* (Same pins for LILYGO LoRa32 and ESP32 Wroom Dev ) /* (Same pins for LILYGO LoRa32 and ESP32 Wroom Dev )
SX1278-------------------> ESP32 ttgo-lora32-v21 and ESP32 WROOM Dev SX1278-------------------> ESP32 ttgo-lora32-v21 and ESP32 WROOM Dev
GND GND GND GND
+34 -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;
@@ -40,7 +40,11 @@ void Configuration::writeFile() {
data["beacon"]["sendViaRF"] = beacon.sendViaRF; data["beacon"]["sendViaRF"] = beacon.sendViaRF;
data["beacon"]["path"] = beacon.path; data["beacon"]["path"] = beacon.path;
data["beacon"]["gpsActive"] = beacon.gpsActive;
data["beacon"]["gpsAmbiguity"] = beacon.gpsAmbiguity;
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 +72,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;
@@ -99,6 +103,8 @@ void Configuration::writeFile() {
data["webadmin"]["username"] = webadmin.username; data["webadmin"]["username"] = webadmin.username;
data["webadmin"]["password"] = webadmin.password; data["webadmin"]["password"] = webadmin.password;
data["ntp"]["gmtCorrection"] = ntp.gmtCorrection;
serializeJson(data, configFile); serializeJson(data, configFile);
configFile.close(); configFile.close();
@@ -129,7 +135,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;
@@ -144,6 +150,9 @@ bool Configuration::readFile() {
beacon.sendViaAPRSIS = data["beacon"]["sendViaAPRSIS"] | false; beacon.sendViaAPRSIS = data["beacon"]["sendViaAPRSIS"] | false;
beacon.sendViaRF = data["beacon"]["sendViaRF"] | false; beacon.sendViaRF = data["beacon"]["sendViaRF"] | false;
beacon.gpsActive = data["beacon"]["gpsActive"] | false;
beacon.gpsAmbiguity = data["beacon"]["gpsAmbiguity"] | false;
aprs_is.active = data["aprs_is"]["active"] | false; aprs_is.active = data["aprs_is"]["active"] | false;
aprs_is.passcode = data["aprs_is"]["passcode"] | "XYZWV"; aprs_is.passcode = data["aprs_is"]["passcode"] | "XYZWV";
aprs_is.server = data["aprs_is"]["server"] | "rotate.aprs2.net"; aprs_is.server = data["aprs_is"]["server"] | "rotate.aprs2.net";
@@ -153,6 +162,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 +179,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 +188,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";
@@ -199,6 +209,8 @@ bool Configuration::readFile() {
webadmin.username = data["webadmin"]["username"] | "admin"; webadmin.username = data["webadmin"]["username"] | "admin";
webadmin.password = data["webadmin"]["password"] | ""; webadmin.password = data["webadmin"]["password"] | "";
ntp.gmtCorrection = data["ntp"]["gmtCorrection"] | 0;
lowPowerMode = data["other"]["lowPowerMode"] | false; lowPowerMode = data["other"]["lowPowerMode"] | false;
lowVoltageCutOff = data["other"]["lowVoltageCutOff"] | 0; lowVoltageCutOff = data["other"]["lowVoltageCutOff"] | 0;
@@ -234,7 +246,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 +260,11 @@ void Configuration::init() {
beacon.sendViaRF = false; beacon.sendViaRF = false;
beacon.path = "WIDE1-1"; beacon.path = "WIDE1-1";
digi.mode = 0; beacon.gpsActive = false;
beacon.gpsAmbiguity = false;
digi.mode = 0;
digi.ecoMode = false;
tnc.enableServer = false; tnc.enableServer = false;
tnc.enableSerial = false; tnc.enableSerial = false;
@@ -279,9 +295,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 +306,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;
@@ -315,6 +331,8 @@ void Configuration::init() {
webadmin.username = "admin"; webadmin.username = "admin";
webadmin.password = ""; webadmin.password = "";
ntp.gmtCorrection = 0;
Serial.println("All is Written!"); Serial.println("All is Written!");
} }
+14 -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 {
@@ -28,6 +28,8 @@ public:
String path; String path;
bool sendViaRF; bool sendViaRF;
bool sendViaAPRSIS; bool sendViaAPRSIS;
bool gpsActive;
bool gpsAmbiguity;
}; };
class APRS_IS { class APRS_IS {
@@ -44,6 +46,7 @@ public:
class DIGI { class DIGI {
public: public:
int mode; int mode;
bool ecoMode;
}; };
@@ -80,7 +83,7 @@ public:
bool sendVoltageAsTelemetry; bool sendVoltageAsTelemetry;
}; };
class BME { class WXSENSOR {
public: public:
bool active; bool active;
int heightCorrection; int heightCorrection;
@@ -114,6 +117,13 @@ public:
String password; String password;
}; };
class NTP {
public:
int gmtCorrection;
};
class Configuration { class Configuration {
public: public:
String callsign; String callsign;
@@ -132,11 +142,12 @@ 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;
WEBADMIN webadmin; WEBADMIN webadmin;
NTP ntp;
void init(); void init();
void writeFile(); void writeFile();
+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();
} }
+59 -21
View File
@@ -1,13 +1,22 @@
#include <TinyGPS++.h> #include <TinyGPS++.h>
#include <WiFi.h> #include <WiFi.h>
#include "configuration.h" #include "configuration.h"
#include "boards_pinout.h"
#include "gps_utils.h" #include "gps_utils.h"
#include "display.h" #include "display.h"
#include "utils.h" #include "utils.h"
extern Configuration Config; #ifdef GPS_BAUDRATE
extern WiFiClient espClient; #define GPS_BAUD GPS_BAUDRATE
String distance, iGateBeaconPacket, iGateLoRaBeaconPacket; #else
#define GPS_BAUD 9600
#endif
extern Configuration Config;
extern WiFiClient espClient;
extern HardwareSerial gpsSerial;
extern TinyGPSPlus gps;
String distance, iGateBeaconPacket, iGateLoRaBeaconPacket;
namespace GPS_Utils { namespace GPS_Utils {
@@ -24,20 +33,32 @@ namespace GPS_Utils {
return(s); return(s);
} }
float roundToTwoDecimals(float degrees) {
return round(degrees * 100) / 100;
}
String encodeGPS(float latitude, float longitude, const String& overlay, const String& symbol) { String encodeGPS(float latitude, float longitude, const String& overlay, const String& symbol) {
String encodedData = overlay; String encodedData = overlay;
uint32_t aprs_lat, aprs_lon; uint32_t aprs_lat, aprs_lon;
aprs_lat = 900000000 - latitude * 10000000;
float processedLatitude = latitude;
float processedLongitude = longitude;
if (Config.beacon.gpsActive && Config.beacon.gpsAmbiguity) {
processedLatitude = roundToTwoDecimals(latitude);
processedLongitude = roundToTwoDecimals(longitude);
}
aprs_lat = 900000000 - processedLatitude * 10000000;
aprs_lat = aprs_lat / 26 - aprs_lat / 2710 + aprs_lat / 15384615; aprs_lat = aprs_lat / 26 - aprs_lat / 2710 + aprs_lat / 15384615;
aprs_lon = 900000000 + longitude * 10000000 / 2; aprs_lon = 900000000 + processedLongitude * 10000000 / 2;
aprs_lon = aprs_lon / 26 - aprs_lon / 2710 + aprs_lon / 15384615; aprs_lon = aprs_lon / 26 - aprs_lon / 2710 + aprs_lon / 15384615;
String Ns, Ew, helper; String Ns, Ew, helper;
if(latitude < 0) { Ns = "S"; } else { Ns = "N"; } if(processedLatitude < 0) { Ns = "S"; } else { Ns = "N"; }
if(latitude < 0) { latitude= -latitude; } if(processedLatitude < 0) { processedLatitude = -processedLatitude; }
if(longitude < 0) { Ew = "W"; } else { Ew = "E"; } if(processedLongitude < 0) { Ew = "W"; } else { Ew = "E"; }
if(longitude < 0) { longitude= -longitude; } if(processedLongitude < 0) { processedLongitude = -processedLongitude; }
char helper_base91[] = {"0000\0"}; char helper_base91[] = {"0000\0"};
int i; int i;
@@ -55,6 +76,19 @@ namespace GPS_Utils {
return encodedData; return encodedData;
} }
void generateBeaconFirstPart() {
String beaconPacket = Config.callsign;
beaconPacket += ">APLRG1";
if (Config.beacon.path.indexOf("WIDE") == 0) {
beaconPacket += ",";
beaconPacket += Config.beacon.path;
}
iGateBeaconPacket = beaconPacket;
iGateBeaconPacket += ",qAC:!";
iGateLoRaBeaconPacket = beaconPacket;
iGateLoRaBeaconPacket += ":!";
}
void generateBeacons() { void generateBeacons() {
if (Config.callsign.indexOf("NOCALL-10") != 0 && !Utils::checkValidCallsign(Config.callsign)) { if (Config.callsign.indexOf("NOCALL-10") != 0 && !Utils::checkValidCallsign(Config.callsign)) {
displayShow("***** ERROR ******", "CALLSIGN = NOT VALID!", "", "Only Rx Mode Active", 3000); displayShow("***** ERROR ******", "CALLSIGN = NOT VALID!", "", "Only Rx Mode Active", 3000);
@@ -65,18 +99,7 @@ namespace GPS_Utils {
Config.digi.mode = 0; Config.digi.mode = 0;
Config.backupDigiMode = false; Config.backupDigiMode = false;
} }
String beaconPacket = Config.callsign; generateBeaconFirstPart();
beaconPacket += ">APLRG1";
if (Config.beacon.path.indexOf("WIDE") == 0) {
beaconPacket += ",";
beaconPacket += Config.beacon.path;
}
iGateBeaconPacket = beaconPacket;
iGateBeaconPacket += ",qAC:!";
iGateLoRaBeaconPacket = beaconPacket;
iGateLoRaBeaconPacket += ":!";
String encodedGPS = encodeGPS(Config.beacon.latitude, Config.beacon.longitude, Config.beacon.overlay, Config.beacon.symbol); String encodedGPS = encodeGPS(Config.beacon.latitude, Config.beacon.longitude, Config.beacon.overlay, Config.beacon.symbol);
iGateBeaconPacket += encodedGPS; iGateBeaconPacket += encodedGPS;
iGateLoRaBeaconPacket += encodedGPS; iGateLoRaBeaconPacket += encodedGPS;
@@ -184,4 +207,19 @@ namespace GPS_Utils {
} }
} }
void setup() {
#ifdef HAS_GPS
if (Config.beacon.gpsActive) {
gpsSerial.begin(GPS_BAUD, SERIAL_8N1, GPS_TX, GPS_RX);
}
#endif
generateBeacons();
}
void getData() {
while (gpsSerial.available() > 0) {
gps.encode(gpsSerial.read());
}
}
} }
+4 -1
View File
@@ -9,12 +9,15 @@ namespace GPS_Utils {
String getiGateLoRaBeaconPacket(); String getiGateLoRaBeaconPacket();
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 generateBeaconFirstPart();
void generateBeacons(); void generateBeacons();
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);
void setup();
void getData();
} }
#endif #endif
+8 -7
View File
@@ -4,6 +4,7 @@
#include "aprs_is_utils.h" #include "aprs_is_utils.h"
#include "boards_pinout.h" #include "boards_pinout.h"
#include "syslog_utils.h" #include "syslog_utils.h"
#include "ntp_utils.h"
#include "display.h" #include "display.h"
#include "utils.h" #include "utils.h"
@@ -118,7 +119,7 @@ namespace LoRa_Utils {
} }
#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 +134,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();
@@ -175,15 +176,15 @@ namespace LoRa_Utils {
Utils::println("<--- LoRa Packet Rx : " + packet.substring(3)); Utils::println("<--- LoRa Packet Rx : " + packet.substring(3));
Utils::println("(RSSI:" + String(rssi) + " / SNR:" + String(snr) + " / FreqErr:" + String(freqError) + ")"); Utils::println("(RSSI:" + String(rssi) + " / SNR:" + String(snr) + " / FreqErr:" + String(freqError) + ")");
if (!Config.lowPowerMode) { if (!Config.lowPowerMode && !Config.digi.ecoMode) {
if (receivedPackets.size() >= 10) {
receivedPackets.erase(receivedPackets.begin());
}
ReceivedPacket receivedPacket; ReceivedPacket receivedPacket;
receivedPacket.millis = millis(); receivedPacket.rxTime = NTP_Utils::getFormatedTime();
receivedPacket.packet = packet.substring(3); receivedPacket.packet = packet.substring(3);
receivedPacket.RSSI = rssi; receivedPacket.RSSI = rssi;
receivedPacket.SNR = snr; receivedPacket.SNR = snr;
if (receivedPackets.size() >= 20) {
receivedPackets.erase(receivedPackets.begin());
}
receivedPackets.push_back(receivedPacket); receivedPackets.push_back(receivedPacket);
} }
+34
View File
@@ -0,0 +1,34 @@
#include <NTPClient.h>
#include <WiFiUdp.h>
#include <WiFi.h>
#include "configuration.h"
#include "ntp_utils.h"
#include "time.h"
extern Configuration Config;
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org", 0, 15 * 60 * 1000); // Update interval 15 min
namespace NTP_Utils {
void setup() {
if (WiFi.status() == WL_CONNECTED && !Config.digi.ecoMode && Config.callsign != "NOCALL-10") {
int gmt = Config.ntp.gmtCorrection * 3600;
timeClient.setTimeOffset(gmt);
timeClient.begin();
}
}
void update() {
if (WiFi.status() == WL_CONNECTED && !Config.digi.ecoMode && Config.callsign != "NOCALL-10") timeClient.update();
}
String getFormatedTime() {
if (!Config.digi.ecoMode) return timeClient.getFormattedTime();
return "DigiEcoMode Active";
}
}
+14
View File
@@ -0,0 +1,14 @@
#ifndef NTP_UTILS_H_
#define NTP_UTILS_H_
#include <Arduino.h>
namespace NTP_Utils {
void setup();
void update();
String getFormatedTime();
}
#endif
+34
View File
@@ -47,6 +47,36 @@ namespace POWER_Utils {
#endif #endif
} }
void activateGPS() {
#ifdef HAS_AXP192
PMU.setLDO3Voltage(3300);
PMU.enableLDO3();
#endif
#ifdef HAS_AXP2101
PMU.setALDO3Voltage(3300);
PMU.enableALDO3();
#endif
#ifdef HELTEC_WIRELESS_TRACKER
digitalWrite(VEXT_CTRL, HIGH);
#endif
//gpsIsActive = true;
}
void deactivateGPS() {
#ifdef HAS_AXP192
PMU.disableLDO3();
#endif
#ifdef HAS_AXP2101
PMU.disableALDO3();
#endif
#ifdef HELTEC_WIRELESS_TRACKER
digitalWrite(VEXT_CTRL, LOW);
#endif
//gpsIsActive = false;
}
void activateLoRa() { void activateLoRa() {
#ifdef HAS_AXP192 #ifdef HAS_AXP192
PMU.setLDO2Voltage(3300); PMU.setLDO2Voltage(3300);
@@ -159,6 +189,10 @@ namespace POWER_Utils {
#endif #endif
#endif #endif
#ifdef HAS_GPS
if (Config.beacon.gpsActive) activateGPS();
#endif
#ifdef ADC_CTRL #ifdef ADC_CTRL
pinMode(ADC_CTRL, OUTPUT); pinMode(ADC_CTRL, OUTPUT);
#endif #endif
+2
View File
@@ -14,6 +14,8 @@ namespace POWER_Utils {
double getBatteryVoltage(); double getBatteryVoltage();
bool isBatteryConnected(); bool isBatteryConnected();
void activateMeasurement(); void activateMeasurement();
void activateGPS();
void deactivateGPS();
void activateLoRa(); void activateLoRa();
void deactivateLoRa(); void deactivateLoRa();
bool begin(TwoWire &port); bool begin(TwoWire &port);
+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 && Config.digi.ecoMode == true) { // Exit DigiRepeater EcoMode
answer = "DigiEcoMode:Stop";
Config.digi.ecoMode = false;
Config.display.alwaysOn = true;
Config.display.timeout = 10;
} else if (queryQuestion.indexOf("?APRSSEM") == 0 && Config.digi.ecoMode == false) { // 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();
}
} }
} }
} }
+36 -11
View File
@@ -1,3 +1,4 @@
#include <TinyGPS++.h>
#include <WiFi.h> #include <WiFi.h>
#include "configuration.h" #include "configuration.h"
#include "station_utils.h" #include "station_utils.h"
@@ -9,12 +10,14 @@
#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"
extern Configuration Config; extern Configuration Config;
extern WiFiClient espClient; extern WiFiClient espClient;
extern TinyGPSPlus gps;
extern String versionDate; extern String versionDate;
extern String firstLine; extern String firstLine;
extern String secondLine; extern String secondLine;
@@ -42,6 +45,8 @@ bool sendStartTelemetry = true;
bool beaconUpdate = true; bool beaconUpdate = true;
uint32_t lastBeaconTx = 0; uint32_t lastBeaconTx = 0;
uint32_t lastScreenOn = millis(); uint32_t lastScreenOn = millis();
String beaconPacket;
String secondaryBeaconPacket;
namespace Utils { namespace Utils {
@@ -70,7 +75,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 +92,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);
@@ -103,7 +111,6 @@ namespace Utils {
fourthLine.concat(String(lastHeardStations.size())); fourthLine.concat(String(lastHeardStations.size()));
} }
void sendInitialTelemetryPackets() { void sendInitialTelemetryPackets() {
String sender = Config.callsign; String sender = Config.callsign;
for (int i = sender.length(); i < 9; i++) { for (int i = sender.length(); i < 9; i++) {
@@ -172,19 +179,25 @@ namespace Utils {
sendStartTelemetry = false; sendStartTelemetry = false;
} }
void checkBeaconInterval() { void checkBeaconInterval() {
uint32_t lastTx = millis() - lastBeaconTx; uint32_t lastTx = millis() - lastBeaconTx;
if (lastBeaconTx == 0 || lastTx >= Config.beacon.interval * 60 * 1000) { if (lastBeaconTx == 0 || lastTx >= Config.beacon.interval * 60 * 1000) {
beaconUpdate = true; beaconUpdate = true;
} }
#ifdef HAS_GPS
if (Config.beacon.gpsActive && gps.location.lat() == 0.0 && gps.location.lng() == 0.0 && Config.beacon.latitude == 0.0 && Config.beacon.longitude == 0.0) {
GPS_Utils::getData();
beaconUpdate = false;
}
#endif
if (beaconUpdate) { if (beaconUpdate) {
if (!Config.display.alwaysOn && Config.display.timeout != 0) { if (!Config.display.alwaysOn && Config.display.timeout != 0) {
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();
} }
@@ -192,13 +205,25 @@ namespace Utils {
activeStations(); activeStations();
String beaconPacket = iGateBeaconPacket; beaconPacket = iGateBeaconPacket;
String secondaryBeaconPacket = iGateLoRaBeaconPacket; secondaryBeaconPacket = iGateLoRaBeaconPacket;
if (Config.bme.active && wxModuleType != 0) { #ifdef HAS_GPS
String sensorData = BME_Utils::readDataSensor(); if (Config.beacon.gpsActive && !Config.digi.ecoMode) {
GPS_Utils::getData();
if (gps.location.isUpdated() && gps.location.lat() != 0.0 && gps.location.lng() != 0.0) {
GPS_Utils::generateBeaconFirstPart();
String encodedGPS = GPS_Utils::encodeGPS(gps.location.lat(), gps.location.lng(), Config.beacon.overlay, Config.beacon.symbol);
beaconPacket = iGateBeaconPacket + encodedGPS;
secondaryBeaconPacket = iGateLoRaBeaconPacket + encodedGPS;
}
}
#endif
if (Config.wxsensor.active && wxModuleType != 0) {
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 +278,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;
+1 -1
View File
@@ -5,7 +5,7 @@
class ReceivedPacket { class ReceivedPacket {
public: public:
long millis; String rxTime;
String packet; String packet;
int RSSI; int RSSI;
float SNR; float SNR;
+36 -28
View File
@@ -81,10 +81,10 @@ namespace WEB_Utils {
StaticJsonDocument<1536> data; StaticJsonDocument<1536> data;
for (int i = 0; i < receivedPackets.size(); i++) { for (int i = 0; i < receivedPackets.size(); i++) {
data[i]["millis"] = receivedPackets[i].millis; data[i]["rxTime"] = receivedPackets[i].rxTime;
data[i]["packet"] = receivedPackets[i].packet; data[i]["packet"] = receivedPackets[i].packet;
data[i]["RSSI"] = receivedPackets[i].RSSI; data[i]["RSSI"] = receivedPackets[i].RSSI;
data[i]["SNR"] = receivedPackets[i].SNR; data[i]["SNR"] = receivedPackets[i].SNR;
} }
String buffer; String buffer;
@@ -112,7 +112,7 @@ 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.password = request->getParam("wifi.autoAP.password", true)->value();
Config.wifiAutoAP.powerOff = request->getParam("wifi.autoAP.powerOff", true)->value().toInt(); 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);
@@ -134,8 +134,12 @@ namespace WEB_Utils {
Config.beacon.symbol = request->getParam("beacon.symbol", true)->value(); Config.beacon.symbol = request->getParam("beacon.symbol", true)->value();
Config.beacon.path = request->getParam("beacon.path", true)->value(); Config.beacon.path = request->getParam("beacon.path", true)->value();
Config.beacon.gpsActive = request->hasParam("beacon.gpsActive", true);
Config.beacon.gpsAmbiguity = request->hasParam("beacon.gpsAmbiguity", true);
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 +152,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 +166,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 = "_";
} }
@@ -207,6 +211,8 @@ namespace WEB_Utils {
Config.webadmin.password = request->getParam("webadmin.password", true)->value(); Config.webadmin.password = request->getParam("webadmin.password", true)->value();
} }
Config.ntp.gmtCorrection = request->getParam("ntp.gmtCorrection", true)->value().toInt();
Config.writeFile(); Config.writeFile();
AsyncWebServerResponse *response = request->beginResponse(302, "text/html", ""); AsyncWebServerResponse *response = request->beginResponse(302, "text/html", "");
@@ -258,23 +264,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();
} }
+28 -30
View File
@@ -1,10 +1,10 @@
#include "bme_utils.h"
#include "configuration.h" #include "configuration.h"
#include "gps_utils.h" #include "wx_utils.h"
#include "display.h" #include "display.h"
#define SEALEVELPRESSURE_HPA (1013.25)
#define CORRECTION_FACTOR (8.2296) // for meters #define SEALEVELPRESSURE_HPA (1013.25)
#define CORRECTION_FACTOR (8.2296) // for meters
extern Configuration Config; extern Configuration Config;
extern String fifthLine; extern String fifthLine;
@@ -27,7 +27,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 +53,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 +129,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 +143,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 +161,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 +213,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 +231,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