Compare commits

...

80 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
richonguzman a9bcae62e2 readme update 2024-09-23 15:15:22 -03:00
richonguzman 3e0368383a better writting 2024-09-23 15:11:35 -03:00
richonguzman 8b790ef656 updated libraries for SDK3 2024-09-23 14:31:45 -03:00
richonguzman c110b41b99 build update for new boards 2024-09-23 12:42:03 -03:00
richonguzman be7fe23cd5 Added LLCC68 1W board 2024-09-23 12:37:35 -03:00
richonguzman 202d03c61f shortening reduced Wx report 2024-09-23 12:15:58 -03:00
richonguzman ddb45544db readme UPdate 2024-09-22 22:35:51 -03:00
richonguzman c9ea51c6da update Version 2024-09-22 22:34:00 -03:00
richonguzman 72fd2b45ec added mods to include Telemetry 2024-09-22 22:31:33 -03:00
richonguzman 0e46c64880 primera mejora Telemetria 2024-09-22 13:34:13 -03:00
richonguzman dd12330e85 killing some delays 2024-09-17 14:25:00 -03:00
richonguzman 2edb183cad minor update on Heltec WS 2024-09-11 16:14:40 -03:00
richonguzman 775677d5e8 trying heltec wireless stick oled fix 2024-09-11 15:49:58 -03:00
richonguzman a60a6d6e4b update WIRE 2024-09-10 14:26:10 -03:00
richonguzman 14abe14703 updated structs of last Stations and 25seg buffer 2024-09-10 14:06:10 -03:00
richonguzman 345fb1e937 up 2024-09-02 09:40:17 -04:00
richonguzman 916eb038e5 updated WiFi.setHostName() 2024-09-02 09:12:18 -04:00
richonguzman 40fc177828 small fix on wire begin 2024-08-30 15:46:50 -04:00
richonguzman 5dc6e99972 low external voltage RF Tx fix 2024-08-28 17:11:50 -04:00
richonguzman db5710ec6a test 2024-08-28 12:21:54 -04:00
richonguzman 65acb54dbe wrong external sleep voltage definition fix 2024-08-28 11:45:16 -04:00
richonguzman 6088c61e73 versionUpdate + utils beacon message update 2024-08-26 10:33:49 -04:00
Ricardo Guzman (Richonguzman) a8c972c5e1 Merge pull request #157 from S57PNX/main
Correct logic of serial notifications for APRS-IS and RF beacons
2024-08-26 10:32:01 -04:00
S57PNX bd3a9f91d6 Merge branch 'richonguzman:main' into main 2024-08-26 10:25:17 +02:00
richonguzman 643a18f40c Wemos S2 Mini DIY LoRa added 2024-08-23 18:05:27 -04:00
richonguzman 46e5bdd21e added led 2024-08-23 18:00:25 -04:00
richonguzman ea426f4126 board update 2024-08-22 16:27:41 -04:00
richonguzman 5cbdd318a2 test for WEMOS S2 Mini DIY LORA 2024-08-22 15:00:56 -04:00
richonguzman 735988ee1c adding WEMOS S2 MINI 2024-08-22 14:24:30 -04:00
richonguzman d5b666f458 HELTEC WS update 2024-08-22 13:25:46 -04:00
richonguzman 702f4abcbb update for gps beacon with timestamp 2024-08-21 19:11:05 -04:00
richonguzman d0070e4381 updated config 2024-08-20 19:01:04 -04:00
richonguzman f4744eab6a Heltec Wireless Paper base 2024-08-19 11:37:55 -04:00
richonguzman bd672857f4 testing for external battery block 2024-08-19 10:41:46 -04:00
richonguzman 9cc26ccdae wireless paper battery reading fix 2024-08-18 21:06:57 -04:00
richonguzman 8863838210 updated battery readings 2024-08-17 13:16:44 -04:00
richonguzman f11b6de57a fix for normal display 2024-08-16 16:00:58 -04:00
richonguzman 55d6bc325f version update 2024-08-16 15:52:55 -04:00
richonguzman ee687e6959 first test 2024-08-16 15:52:20 -04:00
S57PNX d1732a6bba Correct logic of serial notifications for APRS-IS
and RF beacons
2024-08-15 20:54:26 +02:00
richonguzman 4fb4712a33 backupDigimode avoided in only rx mode 2024-08-14 13:37:52 -04:00
richonguzman 39276b0d32 update to display h and cpp 2024-08-14 12:32:34 -04:00
richonguzman 22203a7c24 just code cleaning 2024-08-14 12:07:17 -04:00
richonguzman d8d832fde9 configuration test without fails 2024-08-14 11:50:39 -04:00
39 changed files with 1374 additions and 750 deletions
+17
View File
@@ -33,6 +33,8 @@ jobs:
chip: esp32 chip: esp32
- name: ESP32_DIY_1W_LoRa_915 - name: ESP32_DIY_1W_LoRa_915
chip: esp32 chip: esp32
- name: ESP32_DIY_1W_LoRa_LLCC68
chip: esp32
- name: ESP32_DIY_1W_LoRa_Mesh_V1_2 - name: ESP32_DIY_1W_LoRa_Mesh_V1_2
chip: esp32 chip: esp32
- name: ttgo-t-beam-v1_2 - name: ttgo-t-beam-v1_2
@@ -55,12 +57,16 @@ jobs:
chip: esp32s3 chip: esp32s3
- name: heltec_ht-ct62 - name: heltec_ht-ct62
chip: esp32c3 chip: esp32c3
- name: heltec_wireless_paper
chip: esp32s3
- name: OE5HWN_MeshCom - name: OE5HWN_MeshCom
chip: esp32 chip: esp32
- name: WEMOS-LOLIN32-OLED-DIY - name: WEMOS-LOLIN32-OLED-DIY
chip: esp32 chip: esp32
- name: WEMOS-D1-R32-RA02 - name: WEMOS-D1-R32-RA02
chip: esp32 chip: esp32
- name: WEMOS_S2_MINI_DIY_LoRa
chip: esp32s2
- name: esp32c3_DIY_1W_LoRa - name: esp32c3_DIY_1W_LoRa
chip: esp32c3 chip: esp32c3
- name: esp32c3_DIY_1W_LoRa_915 - name: esp32c3_DIY_1W_LoRa_915
@@ -108,6 +114,17 @@ jobs:
0xe000 installer/firmware/boot_app0.bin \ 0xe000 installer/firmware/boot_app0.bin \
0x10000 installer/firmware/firmware.bin \ 0x10000 installer/firmware/firmware.bin \
0x3D0000 installer/firmware/spiffs.bin 0x3D0000 installer/firmware/spiffs.bin
elif [ "${{ matrix.target.chip }}" == "esp32s2" ]; then
python installer/bin/esptool/esptool.py --chip esp32s2 merge_bin \
-o installer/web_factory.bin \
--flash_mode dio \
--flash_freq 40m \
--flash_size 4MB \
0x1000 installer/firmware/bootloader.bin \
0x8000 installer/firmware/partitions.bin \
0xe000 installer/firmware/boot_app0.bin \
0x10000 installer/firmware/firmware.bin \
0x3D0000 installer/firmware/spiffs.bin
elif [ "${{ matrix.target.chip }}" == "esp32s3" ]; then elif [ "${{ matrix.target.chip }}" == "esp32s3" ]; then
python installer/bin/esptool/esptool.py --chip esp32s3 merge_bin \ python installer/bin/esptool/esptool.py --chip esp32s3 merge_bin \
-o installer/web_factory.bin \ -o installer/web_factory.bin \
+13 -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,14 @@ __(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 Added Enconded Telemetry for Battery (+ External Voltage) in Station GPS Beacon Packet.
- 2024.08.23 Wemos S2 Mini DIY LoRa added.
- 2024.08.19 HELTEC Wireless Paper working (still missing Epaper code).
- 2024.08.13 Web Authentication for WebUI. Thanks Mitja S57PNX. - 2024.08.13 Web Authentication for WebUI. Thanks Mitja S57PNX.
- 2024.08.05 WIDE2-n added to WIDE1-n in Digirepeater Modes. - 2024.08.05 WIDE2-n added to WIDE1-n in Digirepeater Modes.
- 2024.06.27 External Voltage Divider Resistor configuration on WebUI. Thanks Tilen S54B. - 2024.06.27 External Voltage Divider Resistor configuration on WebUI. Thanks Tilen S54B.
@@ -107,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
+10 -5
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,15 +49,16 @@
"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,
"externalSleepVoltage": 10.9, "externalSleepVoltage": 10.9,
"voltageDividerR1": 100.0, "voltageDividerR1": 100.0,
"voltageDividerR2": 27.0 "voltageDividerR2": 27.0,
"sendVoltageAsTelemetry": true
}, },
"bme": { "wxsensor": {
"active": false, "active": false,
"heightCorrection": 0, "heightCorrection": 0,
"temperatureCorrection": 0.0 "temperatureCorrection": 0.0
@@ -79,6 +81,9 @@
"username": "admin", "username": "admin",
"password": "" "password": ""
}, },
"ntp": {
"gmtCorrection": 0
},
"other": { "other": {
"rememberStationTime": 30, "rememberStationTime": 30,
"lowPowerMode": false, "lowPowerMode": false,
+132 -25
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>
@@ -973,6 +1017,20 @@
>Send Internal Voltage</label >Send Internal Voltage</label
> >
</div> </div>
<div class="form-check form-switch">
<input
type="checkbox"
name="battery.sendVoltageAsTelemetry"
id="battery.sendVoltageAsTelemetry"
class="form-check-input"
/>
<label
for="battery.sendVoltageAsTelemetry"
class="form-label"
style="font-style: italic;"
>(Send Voltage As Telemetry)</label
>
</div>
<div class="form-check form-switch mt-3"> <div class="form-check form-switch mt-3">
<input <input
type="checkbox" type="checkbox"
@@ -998,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"
@@ -1021,7 +1079,7 @@
>Send External Voltage</label >Send External Voltage</label
> >
</div> </div>
<div class="form-check form-switch mt-3"> <div class="form-check form-switch mt-5">
<input <input
type="checkbox" type="checkbox"
name="battery.monitorExternalVoltage" name="battery.monitorExternalVoltage"
@@ -1121,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>
@@ -1131,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
@@ -1148,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"
@@ -1167,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"
@@ -1439,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
@@ -1467,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>
@@ -1610,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>
+17 -13
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;
@@ -162,15 +166,16 @@ function loadSettings(settings) {
document.getElementById("battery.internalSleepVoltage").value = settings.battery.internalSleepVoltage.toFixed(1); document.getElementById("battery.internalSleepVoltage").value = settings.battery.internalSleepVoltage.toFixed(1);
document.getElementById("battery.sendExternalVoltage").checked = settings.battery.sendExternalVoltage; document.getElementById("battery.sendExternalVoltage").checked = settings.battery.sendExternalVoltage;
document.getElementById("battery.externalVoltagePin").value = settings.battery.externalVoltagePin; document.getElementById("battery.externalVoltagePin").value = settings.battery.externalVoltagePin;
document.getElementById("battery.voltageDividerR1").value = settings.battery.voltageDividerR1.toFixed(1); document.getElementById("battery.voltageDividerR1").value = settings.battery.voltageDividerR1.toFixed(1);
document.getElementById("battery.voltageDividerR2").value = settings.battery.voltageDividerR2.toFixed(1); document.getElementById("battery.voltageDividerR2").value = settings.battery.voltageDividerR2.toFixed(1);
document.getElementById("battery.monitorExternalVoltage").checked = settings.battery.monitorExternalVoltage; document.getElementById("battery.monitorExternalVoltage").checked = settings.battery.monitorExternalVoltage;
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;
// 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;
@@ -195,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;
@@ -206,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;
@@ -241,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']");
@@ -505,13 +513,9 @@ 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

+52 -4
View File
@@ -37,9 +37,10 @@ lib_deps =
adafruit/Adafruit BMP280 Library @ 2.6.8 adafruit/Adafruit BMP280 Library @ 2.6.8
adafruit/Adafruit BME680 Library @ 2.0.4 adafruit/Adafruit BME680 Library @ 2.0.4
adafruit/Adafruit Si7021 Library @ 1.5.3 adafruit/Adafruit Si7021 Library @ 1.5.3
ayushsharma82/ElegantOTA @ 3.1.1 ayushsharma82/ElegantOTA @ 3.1.5
ottowinter/ESPAsyncWebServer-esphome @ 3.2.2 mathieucarbou/ESPAsyncWebServer @ 3.2.3
esphome/AsyncTCP-esphome @ 2.1.1 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
@@ -93,7 +94,7 @@ lib_deps =
adafruit/Adafruit SSD1306 @ 2.5.10 adafruit/Adafruit SSD1306 @ 2.5.10
[env:heltec_wireless_stick] [env:heltec_wireless_stick]
board = heltec_wifi_lora_32_V3 board = esp32-s3-devkitc-1
board_build.mcu = esp32s3 board_build.mcu = esp32s3
build_flags = build_flags =
-Werror -Wall -Werror -Wall
@@ -177,6 +178,19 @@ lib_deps =
adafruit/Adafruit GFX Library @ 1.11.9 adafruit/Adafruit GFX Library @ 1.11.9
adafruit/Adafruit SSD1306 @ 2.5.10 adafruit/Adafruit SSD1306 @ 2.5.10
[env:ESP32_DIY_1W_LoRa_LLCC68]
board = esp32dev
build_flags =
-Werror -Wall
-DESP32_DIY_1W_LoRa_LLCC68
-DHAS_LLCC68
-DHAS_1W_LORA
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
lib_deps =
${common.lib_deps}
adafruit/Adafruit GFX Library @ 1.11.9
adafruit/Adafruit SSD1306 @ 2.5.10
[env:ESP32_DIY_1W_LoRa_Mesh_V1_2] [env:ESP32_DIY_1W_LoRa_Mesh_V1_2]
board = esp32dev board = esp32dev
build_flags = build_flags =
@@ -198,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}
@@ -212,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}
@@ -226,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}
@@ -240,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}
@@ -254,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}
@@ -268,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}
@@ -305,6 +325,7 @@ lib_deps =
vshymanskyy/TinyGSM @ 0.12.0 vshymanskyy/TinyGSM @ 0.12.0
vshymanskyy/StreamDebugger @ 1.0.1 vshymanskyy/StreamDebugger @ 1.0.1
[env:heltec_wireless_tracker] [env:heltec_wireless_tracker]
board = esp32-s3-devkitc-1 board = esp32-s3-devkitc-1
board_build.mcu = esp32s3 board_build.mcu = esp32s3
@@ -312,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
@@ -355,6 +378,19 @@ lib_deps =
adafruit/Adafruit GFX Library @ 1.11.9 adafruit/Adafruit GFX Library @ 1.11.9
adafruit/Adafruit SSD1306 @ 2.5.10 adafruit/Adafruit SSD1306 @ 2.5.10
[env:heltec_wireless_paper]
board = esp32-s3-devkitc-1
board_build.mcu = esp32s3
build_flags =
-Werror -Wall
-DHELTEC_WP
-DHAS_SX1262
-DHAS_EPAPER
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
lib_deps =
${common.lib_deps}
[env:OE5HWN_MeshCom] [env:OE5HWN_MeshCom]
board = esp32dev board = esp32dev
build_flags = build_flags =
@@ -392,6 +428,18 @@ lib_deps =
adafruit/Adafruit GFX Library @ 1.11.9 adafruit/Adafruit GFX Library @ 1.11.9
adafruit/Adafruit SSD1306 @ 2.5.10 adafruit/Adafruit SSD1306 @ 2.5.10
[env:WEMOS_S2_MINI_DIY_LoRa]
board = lolin_s2_mini
build_flags =
-Werror -Wall
-DWEMOS_S2_MINI_DIY_LoRa
-DHAS_SX1278
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1
lib_deps =
${common.lib_deps}
adafruit/Adafruit GFX Library @ 1.11.9
adafruit/Adafruit SSD1306 @ 2.5.10
[env:esp32c3_DIY_1W_LoRa] [env:esp32c3_DIY_1W_LoRa]
board = esp32-c3-devkitm-1 board = esp32-c3-devkitm-1
board_build.mcu = esp32c3 board_build.mcu = esp32c3
+10 -10
View File
@@ -33,7 +33,7 @@
bool checkModemOn() { bool checkModemOn() {
bool modemReady = false; bool modemReady = false;
Serial.print("Starting Modem ... "); Serial.print("Starting Modem ... ");
show_display(firstLine, "Starting Modem...", " ", " ", 0); displayShow(firstLine, "Starting Modem...", " ", " ", 0);
pinMode(A7670_ResetPin, OUTPUT); //A7670 Reset pinMode(A7670_ResetPin, OUTPUT); //A7670 Reset
digitalWrite(A7670_ResetPin, LOW); digitalWrite(A7670_ResetPin, LOW);
@@ -60,7 +60,7 @@
modemReady = true; modemReady = true;
i = 1; i = 1;
Serial.println("Modem Ready!\n"); Serial.println("Modem Ready!\n");
show_display(firstLine, "Starting Modem...", "---> Modem Ready", " ", 0); displayShow(firstLine, "Starting Modem...", "---> Modem Ready", " ", 0);
return true; return true;
} }
} }
@@ -78,7 +78,7 @@
delay(1000); delay(1000);
//setup_gps(); // if gps active / won't be need for now //setup_gps(); // if gps active / won't be need for now
} else { } else {
show_display(firstLine, "Starting Modem...", "---> Failed !!!", " ", 0); displayShow(firstLine, "Starting Modem...", "---> Failed !!!", " ", 0);
Serial.println(F("*********** Failed to connect to the modem! ***********")); Serial.println(F("*********** Failed to connect to the modem! ***********"));
} }
} }
@@ -98,26 +98,26 @@
//Serial.println(response); // DEBUG of Modem AT message //Serial.println(response); // DEBUG of Modem AT message
if(response.indexOf("verified") >= 0) { if(response.indexOf("verified") >= 0) {
Serial.println("Logged! (User Validated)\n"); Serial.println("Logged! (User Validated)\n");
show_display(firstLine, "Connecting APRS-IS...", "---> Logged!", " ", 1000); displayShow(firstLine, "Connecting APRS-IS...", "---> Logged!", " ", 1000);
Serial.println("#################### APRS-IS FEED ####################"); Serial.println("#################### APRS-IS FEED ####################");
validAT = true; validAT = true;
i = 1; i = 1;
delayATMessage = 0; delayATMessage = 0;
} else if (ATMessage == "AT+NETOPEN" && response.indexOf("OK") >= 0) { } else if (ATMessage == "AT+NETOPEN" && response.indexOf("OK") >= 0) {
Serial.println("Port Open!"); Serial.println("Port Open!");
show_display(firstLine, "Opening Port...", "---> Port Open", " ", 0); displayShow(firstLine, "Opening Port...", "---> Port Open", " ", 0);
validAT = true; validAT = true;
i = 1; i = 1;
delayATMessage = 0; delayATMessage = 0;
} else if (ATMessage == "AT+NETOPEN" && response.indexOf("Network is already opened") >= 0) { } else if (ATMessage == "AT+NETOPEN" && response.indexOf("Network is already opened") >= 0) {
Serial.println("Port Open! (was already opened)"); Serial.println("Port Open! (was already opened)");
show_display(firstLine, "Opening Port...", "---> Port Open", " ", 0); displayShow(firstLine, "Opening Port...", "---> Port Open", " ", 0);
validAT = true; validAT = true;
i = 1; i = 1;
delayATMessage = 0; delayATMessage = 0;
} else if (ATMessage.indexOf("AT+CIPOPEN") == 0 && response.indexOf("PB DONE") >= 0) { } else if (ATMessage.indexOf("AT+CIPOPEN") == 0 && response.indexOf("PB DONE") >= 0) {
Serial.println("Contacted!"); Serial.println("Contacted!");
show_display(firstLine, "Connecting APRS-IS...", "---> Contacted", " ", 0); displayShow(firstLine, "Connecting APRS-IS...", "---> Contacted", " ", 0);
validAT = true; validAT = true;
i = 1; i = 1;
delayATMessage = 0; delayATMessage = 0;
@@ -155,17 +155,17 @@
Serial.println("-----> Connecting to APRS IS"); Serial.println("-----> Connecting to APRS IS");
while (!modemStartUp) { while (!modemStartUp) {
Serial.print("Opening Port... "); Serial.print("Opening Port... ");
show_display(firstLine, "Opening Port...", " ", " ", 0); displayShow(firstLine, "Opening Port...", " ", " ", 0);
modemStartUp = checkATResponse("AT+NETOPEN"); modemStartUp = checkATResponse("AT+NETOPEN");
delay(2000); delay(2000);
} while (!serverStartUp) { } while (!serverStartUp) {
Serial.print("Connecting APRS-IS Server... "); Serial.print("Connecting APRS-IS Server... ");
show_display(firstLine, "Connecting APRS-IS...", " ", " ", 0); displayShow(firstLine, "Connecting APRS-IS...", " ", " ", 0);
serverStartUp = checkATResponse("AT+CIPOPEN=0,\"TCP\",\"" + String(Config.aprs_is.server) + "\"," + String(Config.aprs_is.port)); serverStartUp = checkATResponse("AT+CIPOPEN=0,\"TCP\",\"" + String(Config.aprs_is.server) + "\"," + String(Config.aprs_is.port));
delay(2000); delay(2000);
} while (!userBytesSended) { } while (!userBytesSended) {
Serial.print("Writing User Login Data "); Serial.print("Writing User Login Data ");
show_display(firstLine, "Connecting APRS-IS...", "---> User Login Data", " ", 0); displayShow(firstLine, "Connecting APRS-IS...", "---> User Login Data", " ", 0);
userBytesSended = checkATResponse("AT+CIPSEND=0," + String(loginInfo.length()+1)); userBytesSended = checkATResponse("AT+CIPSEND=0," + String(loginInfo.length()+1));
delay(2000); delay(2000);
} while (!modemLoggedToAPRSIS) { } while (!modemLoggedToAPRSIS) {
+28 -21
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.08.13"; 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;
@@ -61,16 +67,14 @@ String firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, seven
void setup() { void setup() {
Serial.begin(115200); Serial.begin(115200);
POWER_Utils::setup(); POWER_Utils::setup();
BATTERY_Utils::setup();
Utils::setupDisplay(); Utils::setupDisplay();
Config.check();
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
show_display("", " 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
@@ -113,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
@@ -125,7 +131,7 @@ void setup() {
} }
void loop() { void loop() {
WIFI_Utils::checkIfAutoAPShouldPowerOff(); WIFI_Utils::checkAutoAPTimeout();
if (isUpdatingOTA) { if (isUpdatingOTA) {
ElegantOTA.loop(); ElegantOTA.loop();
@@ -138,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();
@@ -146,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();
@@ -163,7 +170,7 @@ void loop() {
APRS_IS_Utils::processLoRaPacket(packet); // Send received packet to APRSIS APRS_IS_Utils::processLoRaPacket(packet); // Send received packet to APRSIS
} }
if (Config.digi.mode == 2 || Config.digi.mode == 3 || backUpDigiMode) { // If Digi enabled if (Config.loramodule.txActive && (Config.digi.mode == 2 || Config.digi.mode == 3 || backUpDigiMode)) { // If Digi enabled
STATION_Utils::clean25SegBuffer(); STATION_Utils::clean25SegBuffer();
DIGI_Utils::processLoRaPacket(packet); // Send received packet to Digi DIGI_Utils::processLoRaPacket(packet); // Send received packet to Digi
} }
@@ -182,7 +189,7 @@ void loop() {
STATION_Utils::processOutputPacketBuffer(); STATION_Utils::processOutputPacketBuffer();
show_display(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, seventhLine, 0); displayShow(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, seventhLine, 0);
Utils::checkRebootTime(); Utils::checkRebootTime();
Utils::checkSleepByLowBatteryVoltage(1); Utils::checkSleepByLowBatteryVoltage(1);
} }
+15 -14
View File
@@ -59,7 +59,7 @@ namespace APRS_IS_Utils {
aprsAuth += Config.callsign; aprsAuth += Config.callsign;
aprsAuth += " pass "; aprsAuth += " pass ";
aprsAuth += Config.aprs_is.passcode; aprsAuth += Config.aprs_is.passcode;
aprsAuth += " vers CA2RXU_LoRa_iGate 1.4 filter "; aprsAuth += " vers CA2RXU_LoRa_iGate 2.0 filter ";
aprsAuth += Config.aprs_is.filter; aprsAuth += Config.aprs_is.filter;
upload(aprsAuth); upload(aprsAuth);
delay(200); delay(200);
@@ -71,13 +71,13 @@ 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";
} }
if (!Config.display.alwaysOn && Config.display.timeout != 0) { if (!Config.display.alwaysOn && Config.display.timeout != 0) {
display_toggle(true); displayToggle(true);
} }
lastScreenOn = millis(); lastScreenOn = millis();
} }
@@ -99,7 +99,7 @@ namespace APRS_IS_Utils {
} }
#endif #endif
if(aprsisState == "--" && !Config.display.alwaysOn && Config.display.timeout != 0) { if(aprsisState == "--" && !Config.display.alwaysOn && Config.display.timeout != 0) {
display_toggle(true); displayToggle(true);
lastScreenOn = millis(); lastScreenOn = millis();
} }
} }
@@ -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;
@@ -160,11 +161,11 @@ namespace APRS_IS_Utils {
} }
if (receivedMessage.indexOf("?") == 0) { if (receivedMessage.indexOf("?") == 0) {
if (!Config.display.alwaysOn && Config.display.timeout != 0) { if (!Config.display.alwaysOn && Config.display.timeout != 0) {
display_toggle(true); displayToggle(true);
} }
STATION_Utils::addToOutputPacketBuffer(QUERY_Utils::process(receivedMessage, sender, false, thirdParty)); STATION_Utils::addToOutputPacketBuffer(QUERY_Utils::process(receivedMessage, sender, false, thirdParty));
lastScreenOn = millis(); lastScreenOn = millis();
show_display(firstLine, secondLine, thirdLine, fourthLine, fifthLine, "Callsign = " + sender, "TYPE --> QUERY", 0); displayShow(firstLine, secondLine, thirdLine, fourthLine, fifthLine, "Callsign = " + sender, "TYPE --> QUERY", 0);
return true; return true;
} }
else { else {
@@ -192,7 +193,7 @@ namespace APRS_IS_Utils {
if (!queryMessage) { if (!queryMessage) {
const String& aprsPacket = buildPacketToUpload(packet); const String& aprsPacket = buildPacketToUpload(packet);
if (!Config.display.alwaysOn && Config.display.timeout != 0) { if (!Config.display.alwaysOn && Config.display.timeout != 0) {
display_toggle(true); displayToggle(true);
} }
lastScreenOn = millis(); lastScreenOn = millis();
#ifdef HAS_A7670 #ifdef HAS_A7670
@@ -203,7 +204,7 @@ namespace APRS_IS_Utils {
upload(aprsPacket); upload(aprsPacket);
#endif #endif
Utils::println("---> Uploaded to APRS-IS"); Utils::println("---> Uploaded to APRS-IS");
show_display(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, seventhLine, 0); displayShow(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, seventhLine, 0);
} }
} }
} }
@@ -294,7 +295,7 @@ namespace APRS_IS_Utils {
String queryAnswer = QUERY_Utils::process(receivedMessage, Sender, true, false); String queryAnswer = QUERY_Utils::process(receivedMessage, Sender, true, false);
//Serial.println("---> QUERY Answer : " + queryAnswer.substring(0,queryAnswer.indexOf("\n"))); //Serial.println("---> QUERY Answer : " + queryAnswer.substring(0,queryAnswer.indexOf("\n")));
if (!Config.display.alwaysOn && Config.display.timeout != 0) { if (!Config.display.alwaysOn && Config.display.timeout != 0) {
display_toggle(true); displayToggle(true);
} }
lastScreenOn = millis(); lastScreenOn = millis();
delay(500); delay(500);
@@ -302,7 +303,7 @@ namespace APRS_IS_Utils {
A7670_Utils::uploadToAPRSIS(queryAnswer); A7670_Utils::uploadToAPRSIS(queryAnswer);
#else #else
upload(queryAnswer); upload(queryAnswer);
#endif #endif
SYSLOG_Utils::log(2, queryAnswer, 0, 0.0, 0); // APRSIS TX SYSLOG_Utils::log(2, queryAnswer, 0, 0.0, 0); // APRSIS TX
fifthLine = "APRS-IS ----> APRS-IS"; fifthLine = "APRS-IS ----> APRS-IS";
sixthLine = Config.callsign; sixthLine = Config.callsign;
@@ -318,16 +319,16 @@ namespace APRS_IS_Utils {
Utils::print("Received Message from APRS-IS : " + packet); Utils::print("Received Message from APRS-IS : " + packet);
if (STATION_Utils::wasHeard(Addressee)) { if (STATION_Utils::wasHeard(Addressee)) {
STATION_Utils::addToOutputPacketBuffer(buildPacketToTx(packet, 1)); STATION_Utils::addToOutputPacketBuffer(buildPacketToTx(packet, 1));
display_toggle(true); displayToggle(true);
lastScreenOn = millis(); lastScreenOn = millis();
Utils::typeOfPacket(packet, 1); // APRS-LoRa Utils::typeOfPacket(packet, 1); // APRS-LoRa
} }
} }
show_display(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, seventhLine, 0); displayShow(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, seventhLine, 0);
} else if (Config.aprs_is.objectsToRF && packet.indexOf(":;") > 0) { } else if (Config.aprs_is.objectsToRF && packet.indexOf(":;") > 0) {
Utils::println("Received Object from APRS-IS : " + packet); Utils::println("Received Object from APRS-IS : " + packet);
STATION_Utils::addToOutputPacketBuffer(buildPacketToTx(packet, 5)); STATION_Utils::addToOutputPacketBuffer(buildPacketToTx(packet, 5));
display_toggle(true); displayToggle(true);
lastScreenOn = millis(); lastScreenOn = millis();
Utils::typeOfPacket(packet, 1); // APRS-LoRa Utils::typeOfPacket(packet, 1); // APRS-LoRa
} }
+55 -5
View File
@@ -17,6 +17,8 @@ float multiplyCorrection = 0.035;
float voltageDividerTransformation = 0.0; float voltageDividerTransformation = 0.0;
int telemetryCounter = random(1,999);
#ifdef HAS_ADC_CALIBRATION #ifdef HAS_ADC_CALIBRATION
#include <esp_adc_cal.h> #include <esp_adc_cal.h>
@@ -102,7 +104,7 @@ namespace BATTERY_Utils {
#if defined(HELTEC_WIRELESS_TRACKER) #if defined(HELTEC_WIRELESS_TRACKER)
digitalWrite(ADC_CTRL, HIGH); digitalWrite(ADC_CTRL, HIGH);
#endif #endif
#if defined(HELTEC_V3) || defined(HELTEC_V2) || defined(HELTEC_WSL_V3) #if defined(HELTEC_V3) || defined(HELTEC_V2) || defined(HELTEC_WSL_V3) || defined(HELTEC_WP)
digitalWrite(ADC_CTRL, LOW); digitalWrite(ADC_CTRL, LOW);
#endif #endif
#endif #endif
@@ -133,10 +135,15 @@ namespace BATTERY_Utils {
#if defined(HELTEC_WIRELESS_TRACKER) #if defined(HELTEC_WIRELESS_TRACKER)
digitalWrite(ADC_CTRL, LOW); digitalWrite(ADC_CTRL, LOW);
#endif #endif
#if defined(HELTEC_V3) || defined(HELTEC_V2) || defined(HELTEC_WSL_V3) #if defined(HELTEC_V3) || defined(HELTEC_V2) || defined(HELTEC_WSL_V3) || defined(HELTEC_WP)
digitalWrite(ADC_CTRL, HIGH); digitalWrite(ADC_CTRL, HIGH);
#endif #endif
#ifdef HELTEC_WP
double inputDivider = (1.0 / (10.0 + 10.0)) * 10.0; // The voltage divider is a 10k + 10k resistor in series
#else
double inputDivider = (1.0 / (390.0 + 100.0)) * 100.0; // The voltage divider is a 390k + 100k resistor in series, 100k on the low side. double inputDivider = (1.0 / (390.0 + 100.0)) * 100.0; // The voltage divider is a 390k + 100k resistor in series, 100k on the low side.
#endif
return (((sampleSum/100) * adcReadingTransformation) / inputDivider) + 0.285; // Yes, this offset is excessive, but the ADC on the ESP32s3 is quite inaccurate and noisy. Adjust to own measurements. return (((sampleSum/100) * adcReadingTransformation) / inputDivider) + 0.285; // Yes, this offset is excessive, but the ADC on the ESP32s3 is quite inaccurate and noisy. Adjust to own measurements.
#else #else
#ifdef HAS_ADC_CALIBRATION #ifdef HAS_ADC_CALIBRATION
@@ -205,12 +212,55 @@ namespace BATTERY_Utils {
shouldSleepLowVoltage = true; shouldSleepLowVoltage = true;
} }
#endif #endif
if (Config.battery.monitorExternalVoltage && checkExternalVoltage() < Config.battery.externalSleepVoltage + 0.1) { #ifndef HELTEC_WP
shouldSleepLowVoltage = true; if (Config.battery.monitorExternalVoltage && checkExternalVoltage() < Config.battery.externalSleepVoltage + 0.1) {
} shouldSleepLowVoltage = true;
}
#endif
if (shouldSleepLowVoltage) { if (shouldSleepLowVoltage) {
Utils::checkSleepByLowBatteryVoltage(0); Utils::checkSleepByLowBatteryVoltage(0);
} }
} }
String generateEncodedTelemetryBytes(float value, bool firstBytes, byte voltageType) { // 0 = internal battery(0-4,2V) , 1 = external battery(0-15V)
String encodedBytes;
int tempValue;
if (firstBytes) {
tempValue = value;
} else {
switch (voltageType) {
case 0:
tempValue = value * 100; // Internal voltage calculation
break;
case 1:
tempValue = (value * 100) / 2; // External voltage calculation
break;
default:
tempValue = value;
break;
}
}
int firstByte = tempValue / 91;
tempValue -= firstByte * 91;
encodedBytes = char(firstByte + 33);
encodedBytes += char(tempValue + 33);
return encodedBytes;
}
String generateEncodedTelemetry() {
String telemetry = "|";
telemetry += generateEncodedTelemetryBytes(telemetryCounter, true, 0);
telemetryCounter++;
if (telemetryCounter == 1000) {
telemetryCounter = 0;
}
if (Config.battery.sendInternalVoltage) telemetry += generateEncodedTelemetryBytes(checkInternalVoltage(), false, 0);
if (Config.battery.sendExternalVoltage) telemetry += generateEncodedTelemetryBytes(checkExternalVoltage(), false, 1);
telemetry += "|";
return telemetry;
}
} }
+3
View File
@@ -14,6 +14,9 @@ namespace BATTERY_Utils {
void checkIfShouldSleep(); // ???? void checkIfShouldSleep(); // ????
void startupBatteryHealth(); void startupBatteryHealth();
String generateEncodedTelemetryBytes(float value, bool firstBytes, byte voltageType);
String generateEncodedTelemetry();
} }
#endif #endif
-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
+53 -16
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
@@ -18,17 +18,17 @@
#define RADIO_BUSY_PIN 26 // GPIO26 - SX1278 IRQ ---->DIO0 #define RADIO_BUSY_PIN 26 // GPIO26 - SX1278 IRQ ---->DIO0
#endif #endif
#if defined(HELTEC_V3) || defined(HELTEC_WSL_V3) || defined(HELTEC_WSL_V3_DISPLAY) || defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_WS) #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) // Ebyte E22 400M30S (SX1268) or E22 900M30S (SX1262) #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
#define RADIO_SCLK_PIN 18 #define RADIO_SCLK_PIN 18
#define RADIO_MISO_PIN 19 #define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 23 #define RADIO_MOSI_PIN 23
@@ -84,7 +84,7 @@
#define RADIO_TXEN 13 #define RADIO_TXEN 13
#endif #endif
#ifdef HELTEC_HTCT62 #if defined(HELTEC_HTCT62)
#define RADIO_SCLK_PIN 10 // SX1262 SCK #define RADIO_SCLK_PIN 10 // SX1262 SCK
#define RADIO_MISO_PIN 6 // SX1262 MISO #define RADIO_MISO_PIN 6 // SX1262 MISO
#define RADIO_MOSI_PIN 7 // SX1262 MOSI #define RADIO_MOSI_PIN 7 // SX1262 MOSI
@@ -132,21 +132,30 @@
#define RADIO_TXEN 7 #define RADIO_TXEN 7
#endif #endif
#ifdef WEMOS_S2_MINI_DIY_LoRa
#define RADIO_SCLK_PIN 36
#define RADIO_MISO_PIN 37
#define RADIO_MOSI_PIN 35
#define RADIO_CS_PIN 34
#define RADIO_BUSY_PIN 38
#define RADIO_RST_PIN 33
#endif
// OLED // OLED
#if defined(TTGO_T_LORA32_V2_1) || defined(ESP32_DIY_LoRa) || defined(ESP32_DIY_1W_LoRa) || defined(TTGO_T_Beam_V1_0) || defined(TTGO_T_Beam_V1_2) || defined(TTGO_T_Beam_V1_0_SX1268) || defined(TTGO_T_Beam_V1_2_SX1262) || defined(OE5HWN_MeshCom) || defined(ESP32_DIY_LoRa_A7670) || defined(TTGO_T_LORA32_V2_1_915) || defined(ESP32_DIY_LoRa_915) || defined(TTGO_T_Beam_V1_0_915) || defined(TTGO_T_Beam_V1_2_915) || defined(ESP32_DIY_LoRa_A7670_915) || defined(ESP32_DIY_1W_LoRa_915) || defined(ESP32_DIY_1W_LoRa_Mesh_V1_2) #if defined(TTGO_T_LORA32_V2_1) || defined(ESP32_DIY_LoRa) || defined(ESP32_DIY_1W_LoRa) || defined(TTGO_T_Beam_V1_0) || defined(TTGO_T_Beam_V1_2) || defined(TTGO_T_Beam_V1_0_SX1268) || defined(TTGO_T_Beam_V1_2_SX1262) || defined(OE5HWN_MeshCom) || defined(ESP32_DIY_LoRa_A7670) || defined(TTGO_T_LORA32_V2_1_915) || defined(ESP32_DIY_LoRa_915) || defined(TTGO_T_Beam_V1_0_915) || defined(TTGO_T_Beam_V1_2_915) || defined(ESP32_DIY_LoRa_A7670_915) || defined(ESP32_DIY_1W_LoRa_915) || defined(ESP32_DIY_1W_LoRa_LLCC68) || defined(ESP32_DIY_1W_LoRa_Mesh_V1_2)
#define OLED_SDA 21 #define OLED_SDA 21
#define OLED_SCL 22 #define OLED_SCL 22
#define OLED_RST -1 // Reset pin # (or -1 if sharing Arduino reset pin) #define OLED_RST -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#endif #endif
#ifdef HELTEC_V2 #if defined(HELTEC_V2) || defined(HELTEC_WS)
#define OLED_SDA 4 #define OLED_SDA 4
#define OLED_SCL 15 #define OLED_SCL 15
#define OLED_RST 16 #define OLED_RST 16
#endif #endif
#if defined(HELTEC_V3) || defined(HELTEC_WS) #if defined(HELTEC_V3)
#define OLED_SDA 17 #define OLED_SDA 17
#define OLED_SCL 18 #define OLED_SCL 18
#define OLED_RST 21 #define OLED_RST 21
@@ -158,7 +167,7 @@
#define OLED_RST -1 #define OLED_RST -1
#endif #endif
#if !defined(HELTEC_HTCT62) && !defined(HELTEC_WSL_V3) && !defined(ESP32C3_DIY_1W_LoRa) && !defined(ESP32C3_DIY_1W_LoRa_915) #if !defined(HELTEC_HTCT62) && !defined(HELTEC_WSL_V3) && !defined(ESP32C3_DIY_1W_LoRa) && !defined(ESP32C3_DIY_1W_LoRa_915) && !defined(WEMOS_S2_MINI_DIY_LoRa)
#define HAS_DISPLAY #define HAS_DISPLAY
#endif #endif
@@ -166,6 +175,9 @@
#ifdef HELTEC_HTCT62 #ifdef HELTEC_HTCT62
#define BATTERY_PIN 1 #define BATTERY_PIN 1
#endif #endif
#ifdef WEMOS_S2_MINI_DIY_LoRa
#define INTERNAL_LED_PIN 15
#endif
#if defined(TTGO_T_LORA32_V2_1) || defined(TTGO_T_LORA32_V2_1_915) #if defined(TTGO_T_LORA32_V2_1) || defined(TTGO_T_LORA32_V2_1_915)
#define INTERNAL_LED_PIN 25 // Green Led #define INTERNAL_LED_PIN 25 // Green Led
#define BATTERY_PIN 35 #define BATTERY_PIN 35
@@ -179,7 +191,7 @@
#define INTERNAL_LED_PIN 35 #define INTERNAL_LED_PIN 35
#define BATTERY_PIN 1 #define BATTERY_PIN 1
#define VEXT_CTRL 36 #define VEXT_CTRL 36
#define ADC_CTRL 37 // Heltec WSL_V3 just like Heltec WT #define ADC_CTRL 37
#define BOARD_I2C_SDA 41 #define BOARD_I2C_SDA 41
#define BOARD_I2C_SCL 42 #define BOARD_I2C_SCL 42
#ifdef HELTEC_WSL_V3_DISPLAY #ifdef HELTEC_WSL_V3_DISPLAY
@@ -204,6 +216,21 @@
#define BOARD_I2C_SCL 6 #define BOARD_I2C_SCL 6
#endif #endif
#ifdef HELTEC_WP
#define INTERNAL_LED_PIN 18
#define BATTERY_PIN 20
#define ADC_CTRL 19
#define VEXT_CTRL 45
#define BOARD_I2C_SDA 37
#define BOARD_I2C_SCL 36
#define EPAPER_BUSY 7
#define EPAPER_RST 6
#define EPAPER_DC 5
#define EPAPER_CS 4
#define EPAPER_SCL 3
#define EPAPER_SDA 2
#endif
#ifdef ESP32_C3_DIY_LoRa // just testing! #ifdef ESP32_C3_DIY_LoRa // just testing!
#define OLED_SDA 8 #define OLED_SDA 8
#define OLED_SCL 9 #define OLED_SCL 9
@@ -229,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
+205 -246
View File
@@ -4,16 +4,6 @@
#include "display.h" #include "display.h"
void Configuration::check() {
if (reload) {
show_display("------- UPDATE ------", "config is old", "device will update", "and then reboot", 1000);
writeFile();
ESP.restart();
}
}
void Configuration::writeFile() { void Configuration::writeFile() {
Serial.println("Saving config.."); Serial.println("Saving config..");
@@ -27,43 +17,47 @@ 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;
data["aprs_is"]["active"] = aprs_is.active; data["aprs_is"]["active"] = aprs_is.active;
data["aprs_is"]["passcode"] = aprs_is.passcode; data["aprs_is"]["passcode"] = aprs_is.passcode;
data["aprs_is"]["server"] = aprs_is.server; data["aprs_is"]["server"] = aprs_is.server;
data["aprs_is"]["port"] = aprs_is.port; data["aprs_is"]["port"] = aprs_is.port;
data["aprs_is"]["filter"] = aprs_is.filter; data["aprs_is"]["filter"] = aprs_is.filter;
data["aprs_is"]["messagesToRF"] = aprs_is.messagesToRF; data["aprs_is"]["messagesToRF"] = aprs_is.messagesToRF;
data["aprs_is"]["objectsToRF"] = aprs_is.objectsToRF; data["aprs_is"]["objectsToRF"] = aprs_is.objectsToRF;
data["beacon"]["comment"] = beacon.comment; data["beacon"]["comment"] = beacon.comment;
data["beacon"]["interval"] = beacon.interval; data["beacon"]["interval"] = beacon.interval;
data["beacon"]["latitude"] = beacon.latitude; data["beacon"]["latitude"] = beacon.latitude;
data["beacon"]["longitude"] = beacon.longitude; data["beacon"]["longitude"] = beacon.longitude;
data["beacon"]["overlay"] = beacon.overlay; data["beacon"]["overlay"] = beacon.overlay;
data["beacon"]["symbol"] = beacon.symbol; data["beacon"]["symbol"] = beacon.symbol;
data["beacon"]["sendViaAPRSIS"] = beacon.sendViaAPRSIS; data["beacon"]["sendViaAPRSIS"] = beacon.sendViaAPRSIS;
data["beacon"]["sendViaRF"] = beacon.sendViaRF; data["beacon"]["sendViaRF"] = beacon.sendViaRF;
data["beacon"]["path"] = beacon.path; data["beacon"]["path"] = beacon.path;
data["digi"]["mode"] = digi.mode; data["beacon"]["gpsActive"] = beacon.gpsActive;
data["beacon"]["gpsAmbiguity"] = beacon.gpsAmbiguity;
data["lora"]["rxFreq"] = loramodule.rxFreq; data["digi"]["mode"] = digi.mode;
data["lora"]["txFreq"] = loramodule.txFreq; data["digi"]["ecoMode"] = digi.ecoMode;
data["lora"]["spreadingFactor"] = loramodule.spreadingFactor;
data["lora"]["signalBandwidth"] = loramodule.signalBandwidth;
data["lora"]["codingRate4"] = loramodule.codingRate4;
data["lora"]["power"] = loramodule.power;
data["lora"]["txActive"] = loramodule.txActive;
data["lora"]["rxActive"] = loramodule.rxActive;
data["display"]["alwaysOn"] = display.alwaysOn; data["lora"]["rxFreq"] = loramodule.rxFreq;
data["display"]["timeout"] = display.timeout; data["lora"]["txFreq"] = loramodule.txFreq;
data["display"]["turn180"] = display.turn180; data["lora"]["spreadingFactor"] = loramodule.spreadingFactor;
data["lora"]["signalBandwidth"] = loramodule.signalBandwidth;
data["lora"]["codingRate4"] = loramodule.codingRate4;
data["lora"]["power"] = loramodule.power;
data["lora"]["txActive"] = loramodule.txActive;
data["lora"]["rxActive"] = loramodule.rxActive;
data["display"]["alwaysOn"] = display.alwaysOn;
data["display"]["timeout"] = display.timeout;
data["display"]["turn180"] = display.turn180;
data["battery"]["sendInternalVoltage"] = battery.sendInternalVoltage; data["battery"]["sendInternalVoltage"] = battery.sendInternalVoltage;
data["battery"]["monitorInternalVoltage"] = battery.monitorInternalVoltage; data["battery"]["monitorInternalVoltage"] = battery.monitorInternalVoltage;
@@ -73,40 +67,43 @@ void Configuration::writeFile() {
data["battery"]["externalVoltagePin"] = battery.externalVoltagePin; data["battery"]["externalVoltagePin"] = battery.externalVoltagePin;
data["battery"]["monitorExternalVoltage"] = battery.monitorExternalVoltage; data["battery"]["monitorExternalVoltage"] = battery.monitorExternalVoltage;
data["battery"]["externalSleepVoltage"] = battery.externalSleepVoltage; data["battery"]["externalSleepVoltage"] = battery.externalSleepVoltage;
data["battery"]["voltageDividerR1"] = battery.voltageDividerR1; data["battery"]["voltageDividerR1"] = battery.voltageDividerR1;
data["battery"]["voltageDividerR2"] = battery.voltageDividerR2; data["battery"]["voltageDividerR2"] = battery.voltageDividerR2;
data["battery"]["sendVoltageAsTelemetry"] = battery.sendVoltageAsTelemetry;
data["wxsensor"]["active"] = wxsensor.active;
data["wxsensor"]["heightCorrection"] = wxsensor.heightCorrection;
data["wxsensor"]["temperatureCorrection"] = wxsensor.temperatureCorrection;
data["bme"]["active"] = bme.active; data["syslog"]["active"] = syslog.active;
data["bme"]["heightCorrection"] = bme.heightCorrection; data["syslog"]["server"] = syslog.server;
data["bme"]["temperatureCorrection"] = bme.temperatureCorrection; data["syslog"]["port"] = syslog.port;
data["syslog"]["active"] = syslog.active; data["tnc"]["enableServer"] = tnc.enableServer;
data["syslog"]["server"] = syslog.server; data["tnc"]["enableSerial"] = tnc.enableSerial;
data["syslog"]["port"] = syslog.port; data["tnc"]["acceptOwn"] = tnc.acceptOwn;
data["tnc"]["enableServer"] = tnc.enableServer; data["other"]["rebootMode"] = rebootMode;
data["tnc"]["enableSerial"] = tnc.enableSerial; data["other"]["rebootModeTime"] = rebootModeTime;
data["tnc"]["acceptOwn"] = tnc.acceptOwn;
data["other"]["rebootMode"] = rebootMode; data["ota"]["username"] = ota.username;
data["other"]["rebootModeTime"] = rebootModeTime; data["ota"]["password"] = ota.password;
data["ota"]["username"] = ota.username;
data["ota"]["password"] = ota.password;
data["other"]["rememberStationTime"] = rememberStationTime; data["other"]["rememberStationTime"] = rememberStationTime;
data["other"]["backupDigiMode"] = backupDigiMode; data["other"]["backupDigiMode"] = backupDigiMode;
data["other"]["lowPowerMode"] = lowPowerMode; data["other"]["lowPowerMode"] = lowPowerMode;
data["other"]["lowVoltageCutOff"] = lowVoltageCutOff; data["other"]["lowVoltageCutOff"] = lowVoltageCutOff;
data["personalNote"] = personalNote; data["personalNote"] = personalNote;
data["webadmin"]["active"] = webadmin.active; data["webadmin"]["active"] = webadmin.active;
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);
@@ -137,137 +134,92 @@ bool Configuration::readFile() {
wifiAPs.push_back(wifiap); wifiAPs.push_back(wifiap);
} }
wifiAutoAP.password = data["wifi"]["autoAP"]["password"].as<String>(); wifiAutoAP.password = data["wifi"]["autoAP"]["password"] | "1234567890";
wifiAutoAP.powerOff = data["wifi"]["autoAP"]["powerOff"].as<int>(); wifiAutoAP.timeout = data["wifi"]["autoAP"]["timeout"] | 10;
callsign = data["callsign"].as<String>(); callsign = data["callsign"] | "NOCALL-10";
rememberStationTime = data["other"]["rememberStationTime"].as<int>(); rememberStationTime = data["other"]["rememberStationTime"] | 30;
battery.sendInternalVoltage = data["battery"]["sendInternalVoltage"].as<bool>(); beacon.latitude = data["beacon"]["latitude"] | 0.0;
battery.monitorInternalVoltage = data["battery"]["monitorInternalVoltage"].as<bool>(); beacon.longitude = data["beacon"]["longitude"] | 0.0;
battery.internalSleepVoltage = data["battery"]["internalSleepVoltage"].as<float>(); beacon.comment = data["beacon"]["comment"] | "LoRa APRS";
beacon.interval = data["beacon"]["interval"] | 15;
beacon.overlay = data["beacon"]["overlay"] | "L";
beacon.symbol = data["beacon"]["symbol"] | "a";
beacon.path = data["beacon"]["path"] | "WIDE1-1";
beacon.sendViaAPRSIS = data["beacon"]["sendViaAPRSIS"] | false;
beacon.sendViaRF = data["beacon"]["sendViaRF"] | false;
battery.sendExternalVoltage = data["battery"]["sendExternalVoltage"].as<bool>(); beacon.gpsActive = data["beacon"]["gpsActive"] | false;
battery.externalVoltagePin = data["battery"]["externalVoltagePin"].as<int>(); beacon.gpsAmbiguity = data["beacon"]["gpsAmbiguity"] | false;
battery.monitorExternalVoltage = data["battery"]["monitorExternalVoltage"].as<bool>();
battery.externalSleepVoltage = data["battery"]["externalSleepVoltage"].as<float>();
battery.voltageDividerR1 = data["battery"]["voltageDividerR1"].as<float>();
battery.voltageDividerR2 = data["battery"]["voltageDividerR2"].as<float>();
aprs_is.passcode = data["aprs_is"]["passcode"].as<String>();
aprs_is.server = data["aprs_is"]["server"].as<String>();
aprs_is.port = data["aprs_is"]["port"].as<int>();
loramodule.spreadingFactor = data["lora"]["spreadingFactor"].as<int>();
loramodule.signalBandwidth = data["lora"]["signalBandwidth"].as<long>();
loramodule.codingRate4 = data["lora"]["codingRate4"].as<int>();
loramodule.power = data["lora"]["power"].as<int>();
display.alwaysOn = data["display"]["alwaysOn"].as<bool>();
display.timeout = data["display"]["timeout"].as<int>();
display.turn180 = data["display"]["turn180"].as<bool>();
syslog.active = data["syslog"]["active"].as<bool>();
syslog.server = data["syslog"]["server"].as<String>();
syslog.port = data["syslog"]["port"].as<int>();
bme.active = data["bme"]["active"].as<bool>();
bme.heightCorrection = data["bme"]["heightCorrection"].as<int>();
bme.temperatureCorrection = data["bme"]["temperatureCorrection"].as<float>();
ota.username = data["ota"]["username"].as<String>();
ota.password = data["ota"]["password"].as<String>();
tnc.enableServer = data["tnc"]["enableServer"].as<bool>();
tnc.enableSerial = data["tnc"]["enableSerial"].as<bool>();
tnc.acceptOwn = data["tnc"]["acceptOwn"].as<bool>();
lowPowerMode = data["other"]["lowPowerMode"].as<bool>();
lowVoltageCutOff = data["other"]["lowVoltageCutOff"].as<double>();
backupDigiMode = data["other"]["backupDigiMode"].as<bool>();
rebootMode = data["other"]["rebootMode"].as<bool>();
rebootModeTime = data["other"]["rebootModeTime"].as<int>();
personalNote = data["personalNote"].as<String>();
webadmin.active = data["webadmin"]["active"].as<bool>();
webadmin.username = data["webadmin"]["username"].as<String>();
webadmin.password = data["webadmin"]["password"].as<String>();
int stationMode = data["stationMode"].as<int>(); // deprecated but need to specify config version
if (stationMode == 0) {
// Load new settings
beacon.latitude = data["beacon"]["latitude"].as<double>();
beacon.longitude = data["beacon"]["longitude"].as<double>();
beacon.comment = data["beacon"]["comment"].as<String>();
beacon.overlay = data["beacon"]["overlay"].as<String>();
beacon.symbol = data["beacon"]["symbol"].as<String>();
beacon.interval = data["beacon"]["interval"].as<int>();
beacon.sendViaAPRSIS = data["beacon"]["sendViaAPRSIS"].as<bool>();
beacon.sendViaRF = data["beacon"]["sendViaRF"].as<bool>();
beacon.path = data["beacon"]["path"].as<String>();
digi.mode = data["digi"]["mode"].as<int>();
aprs_is.active = data["aprs_is"]["active"].as<bool>();
aprs_is.filter = data["aprs_is"]["filter"].as<String>();
aprs_is.messagesToRF = data["aprs_is"]["messagesToRF"].as<bool>();
aprs_is.objectsToRF = data["aprs_is"]["objectsToRF"].as<bool>();
loramodule.txFreq = data["lora"]["txFreq"].as<long>();
loramodule.rxFreq = data["lora"]["rxFreq"].as<long>();
loramodule.txActive = data["lora"]["txActive"].as<bool>();
loramodule.rxActive = data["lora"]["rxActive"].as<bool>();
} else {
// Load old settings and put into new variables not actual config
String iGateComment = data["iGateComment"].as<String>();
int beaconInterval = data["other"]["beaconInterval"].as<int>();
long iGateFreq = data["lora"]["iGateFreq"].as<long>();
long digirepeaterTxFreq = data["lora"]["digirepeaterTxFreq"].as<long>();
long digirepeaterRxFreq = data["lora"]["digirepeaterRxFreq"].as<long>();
String digiComment = data["digi"]["comment"].as<String>(); aprs_is.active = data["aprs_is"]["active"] | false;
double digiLatitude = data["digi"]["latitude"].as<double>(); aprs_is.passcode = data["aprs_is"]["passcode"] | "XYZWV";
double digiLongitude = data["digi"]["longitude"].as<double>(); aprs_is.server = data["aprs_is"]["server"] | "rotate.aprs2.net";
aprs_is.port = data["aprs_is"]["port"] | 14580;
aprs_is.filter = data["aprs_is"]["filter"] | "m/10";
aprs_is.messagesToRF = data["aprs_is"]["messagesToRF"] | false;
aprs_is.objectsToRF = data["aprs_is"]["objectsToRF"] | false;
digi.mode = data["digi"]["mode"] | 0;
digi.ecoMode = data["digi"]["ecoMode"] | false;
beacon.latitude = digiLatitude; loramodule.txFreq = data["lora"]["txFreq"] | 433775000;
beacon.longitude = digiLongitude; loramodule.rxFreq = data["lora"]["rxFreq"] | 433775000;
beacon.interval = beaconInterval; loramodule.spreadingFactor = data["lora"]["spreadingFactor"] | 12;
loramodule.signalBandwidth = data["lora"]["signalBandwidth"] | 125000;
loramodule.codingRate4 = data["lora"]["codingRate4"] | 5;
loramodule.power = data["lora"]["power"] | 20;
loramodule.txActive = data["lora"]["txActive"] | false;
loramodule.rxActive = data["lora"]["rxActive"] | false;
loramodule.txFreq = digirepeaterTxFreq; display.alwaysOn = data["display"]["alwaysOn"] | true;
loramodule.rxFreq = digirepeaterRxFreq; display.timeout = data["display"]["timeout"] | 4;
loramodule.rxActive = true; display.turn180 = data["display"]["turn180"] | false;
beacon.sendViaAPRSIS = true;
beacon.sendViaRF = false;
switch (stationMode) { battery.sendInternalVoltage = data["battery"]["sendInternalVoltage"] | false;
case 1: // IGate only battery.monitorInternalVoltage = data["battery"]["monitorInternalVoltage"] | false;
// aprs_is.active = true; // better don't do that automatically battery.internalSleepVoltage = data["battery"]["internalSleepVoltage"] | 2.9;
beacon.comment = iGateComment;
loramodule.rxFreq = iGateFreq;
break;
case 5: // Digi + IGate
case 2: // Digi + IGate
// aprs_is.active = true; // better don't do that automatically
// digi.mode = 2; // better don't do that automatically
beacon.comment = digiComment;
loramodule.rxFreq = iGateFreq;
break;
case 3: // Digi
case 4: // Digi
// digi.mode = 2; // better don't do that automatically
beacon.comment = digiComment;
break;
}
reload = true; battery.sendExternalVoltage = data["battery"]["sendExternalVoltage"] | false;
} battery.externalVoltagePin = data["battery"]["externalVoltagePin"] | 34;
battery.monitorExternalVoltage = data["battery"]["monitorExternalVoltage"] | false;
battery.externalSleepVoltage = data["battery"]["externalSleepVoltage"] | 10.9;
battery.voltageDividerR1 = data["battery"]["voltageDividerR1"] | 100.0;
battery.voltageDividerR2 = data["battery"]["voltageDividerR2"] | 27.0;
battery.sendVoltageAsTelemetry = data["battery"]["sendVoltageAsTelemetry"] | false;
wxsensor.active = data["wxsensor"]["active"] | false;
wxsensor.heightCorrection = data["wxsensor"]["heightCorrection"] | 0;
wxsensor.temperatureCorrection = data["wxsensor"]["temperatureCorrection"] | 0.0;
syslog.active = data["syslog"]["active"] | false;
syslog.server = data["syslog"]["server"] | "192.168.0.100";
syslog.port = data["syslog"]["port"] | 514;
tnc.enableServer = data["tnc"]["enableServer"] | false;
tnc.enableSerial = data["tnc"]["enableSerial"] | false;
tnc.acceptOwn = data["tnc"]["acceptOwn"] | false;
ota.username = data["ota"]["username"] | "";
ota.password = data["ota"]["password"] | "";
webadmin.active = data["webadmin"]["active"] | false;
webadmin.username = data["webadmin"]["username"] | "admin";
webadmin.password = data["webadmin"]["password"] | "";
ntp.gmtCorrection = data["ntp"]["gmtCorrection"] | 0;
lowPowerMode = data["other"]["lowPowerMode"] | false;
lowVoltageCutOff = data["other"]["lowVoltageCutOff"] | 0;
backupDigiMode = data["other"]["backupDigiMode"] | false;
rebootMode = data["other"]["rebootMode"] | false;
rebootModeTime = data["other"]["rebootModeTime"] | 6;
personalNote = data["personalNote"] | "personal note here...";
if (wifiAPs.size() == 0) { // If we don't have any WiFi's from config we need to add "empty" SSID for AUTO AP if (wifiAPs.size() == 0) { // If we don't have any WiFi's from config we need to add "empty" SSID for AUTO AP
WiFi_AP wifiap; WiFi_AP wifiap;
@@ -286,93 +238,100 @@ bool Configuration::readFile() {
} }
void Configuration::init() { void Configuration::init() {
reload = false;
WiFi_AP wifiap; WiFi_AP wifiap;
wifiap.ssid = ""; wifiap.ssid = "";
wifiap.password = ""; wifiap.password = "";
wifiAPs.push_back(wifiap); wifiAPs.push_back(wifiap);
wifiAutoAP.password = "1234567890"; wifiAutoAP.password = "1234567890";
wifiAutoAP.powerOff = 15; wifiAutoAP.timeout = 10;
callsign = "N0CALL"; callsign = "N0CALL-10";
beacon.comment = "LoRa APRS"; // new beacon.comment = "LoRa APRS";
beacon.latitude = 0.0; // new beacon.latitude = 0.0;
beacon.longitude = 0.0; // new beacon.longitude = 0.0;
beacon.interval = 15; // new beacon.interval = 15;
beacon.overlay = "L"; // new beacon.overlay = "L";
beacon.symbol = "#"; // new beacon.symbol = "a";
beacon.sendViaAPRSIS = true; // new beacon.sendViaAPRSIS = true;
beacon.sendViaRF = false; // new beacon.sendViaRF = false;
beacon.path = "WIDE1-1"; // new beacon.path = "WIDE1-1";
beacon.gpsActive = false;
beacon.gpsAmbiguity = false;
digi.mode = 0; digi.mode = 0;
digi.ecoMode = false;
tnc.enableServer = false; tnc.enableServer = false;
tnc.enableSerial = false; tnc.enableSerial = false;
tnc.acceptOwn = false; tnc.acceptOwn = false;
aprs_is.active = false; // new aprs_is.active = false;
aprs_is.passcode = "XYZVW"; aprs_is.passcode = "XYZVW";
aprs_is.server = "rotate.aprs2.net"; aprs_is.server = "rotate.aprs2.net";
aprs_is.port = 14580; aprs_is.port = 14580;
aprs_is.filter = "m/10"; // new aprs_is.filter = "m/10";
aprs_is.messagesToRF = false; aprs_is.messagesToRF = false;
aprs_is.objectsToRF = false; aprs_is.objectsToRF = false;
loramodule.txFreq = 433775000; // new loramodule.txFreq = 433775000;
loramodule.rxFreq = 433775000; // new loramodule.rxFreq = 433775000;
loramodule.spreadingFactor = 12; loramodule.spreadingFactor = 12;
loramodule.signalBandwidth = 125000; loramodule.signalBandwidth = 125000;
loramodule.codingRate4 = 5; loramodule.codingRate4 = 5;
loramodule.power = 20; loramodule.power = 20;
loramodule.txActive = false; // new loramodule.txActive = false;
loramodule.rxActive = true; // new loramodule.rxActive = true;
display.alwaysOn = true; display.alwaysOn = true;
display.timeout = 4; display.timeout = 4;
display.turn180 = false; display.turn180 = false;
syslog.active = false; syslog.active = false;
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 = "";
rememberStationTime = 30; rememberStationTime = 30;
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;
battery.monitorExternalVoltage = false; battery.monitorExternalVoltage = false;
battery.externalSleepVoltage = 3.0; battery.externalSleepVoltage = 10.9;
battery.voltageDividerR1 = 100.0; battery.voltageDividerR1 = 100.0;
battery.voltageDividerR2 = 27.0; battery.voltageDividerR2 = 27.0;
lowPowerMode = false; battery.sendVoltageAsTelemetry = true;
lowVoltageCutOff = 0;
backupDigiMode = false; lowPowerMode = false;
lowVoltageCutOff = 0;
rebootMode = false; backupDigiMode = false;
rebootModeTime = 0;
personalNote = ""; rebootMode = false;
rebootModeTime = 0;
webadmin.active = false; personalNote = "";
webadmin.username = "admin";
webadmin.password = ""; webadmin.active = false;
webadmin.username = "admin";
webadmin.password = "";
ntp.gmtCorrection = 0;
Serial.println("All is Written!"); Serial.println("All is Written!");
} }
+15 -5
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;
}; };
@@ -77,9 +80,10 @@ public:
float externalSleepVoltage; float externalSleepVoltage;
float voltageDividerR1; float voltageDividerR1;
float voltageDividerR2; float voltageDividerR2;
bool sendVoltageAsTelemetry;
}; };
class BME { class WXSENSOR {
public: public:
bool active; bool active;
int heightCorrection; int heightCorrection;
@@ -113,9 +117,15 @@ public:
String password; String password;
}; };
class NTP {
public:
int gmtCorrection;
};
class Configuration { class Configuration {
public: public:
bool reload; // ?
String callsign; String callsign;
int rememberStationTime; int rememberStationTime;
bool lowPowerMode; bool lowPowerMode;
@@ -132,15 +142,15 @@ 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();
void check();
Configuration(); Configuration();
private: private:
+70 -31
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 "";
} }
@@ -123,7 +154,7 @@ namespace DIGI_Utils {
} else { } else {
STATION_Utils::addToOutputPacketBuffer(loraPacket); STATION_Utils::addToOutputPacketBuffer(loraPacket);
} }
display_toggle(true); displayToggle(true);
lastScreenOn = millis(); lastScreenOn = millis();
} }
} }
@@ -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();
} }
+83 -63
View File
@@ -16,15 +16,19 @@
#define lineSpacing 12 #define lineSpacing 12
#endif #endif
#else #else
#include <Adafruit_GFX.h> #if HAS_EPAPER
#include <Adafruit_SSD1306.h> //
#if defined(HELTEC_V3)
#define OLED_DISPLAY_HAS_RST_PIN
#endif
#ifdef HELTEC_WSL_V3_DISPLAY
Adafruit_SSD1306 display(128, 64, &Wire1, OLED_RST);
#else #else
Adafruit_SSD1306 display(128, 64, &Wire, OLED_RST); #include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#if defined(HELTEC_V3) || defined(HELTEC_WS)
#define OLED_DISPLAY_HAS_RST_PIN
#endif
#ifdef HELTEC_WSL_V3_DISPLAY
Adafruit_SSD1306 display(128, 64, &Wire1, OLED_RST);
#else
Adafruit_SSD1306 display(128, 64, &Wire, OLED_RST);
#endif
#endif #endif
#endif #endif
#endif #endif
@@ -39,7 +43,7 @@ void cleanTFT() {
#endif #endif
} }
void setup_display() { void displaySetup() {
#ifdef HAS_DISPLAY #ifdef HAS_DISPLAY
delay(500); delay(500);
#ifdef HAS_TFT #ifdef HAS_TFT
@@ -52,50 +56,58 @@ void setup_display() {
} }
tft.setTextFont(0); tft.setTextFont(0);
tft.fillScreen(TFT_BLACK); tft.fillScreen(TFT_BLACK);
#else #else
#ifdef OLED_DISPLAY_HAS_RST_PIN #if HAS_EPAPER
pinMode(OLED_RST, OUTPUT); //
digitalWrite(OLED_RST, LOW); #else
delay(20); #ifdef OLED_DISPLAY_HAS_RST_PIN
digitalWrite(OLED_RST, HIGH); pinMode(OLED_RST, OUTPUT);
#endif digitalWrite(OLED_RST, LOW);
delay(20);
digitalWrite(OLED_RST, HIGH);
#endif
#ifndef HELTEC_WSL_V3_DISPLAY if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Wire.begin(OLED_SDA, OLED_SCL); Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
if (Config.display.turn180) {
display.setRotation(2);
}
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0, 0);
display.ssd1306_command(SSD1306_SETCONTRAST);
display.ssd1306_command(1);
display.display();
#endif #endif
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
if (Config.display.turn180) {
display.setRotation(2);
}
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.setCursor(0, 0);
display.ssd1306_command(SSD1306_SETCONTRAST);
display.ssd1306_command(1);
display.display();
#endif #endif
delay(1000); delay(1000);
#endif #endif
} }
void display_toggle(bool toggle) { void displayToggle(bool toggle) {
#ifdef HAS_DISPLAY #ifdef HAS_DISPLAY
if (toggle) { if (toggle) {
#ifdef HAS_TFT #ifdef HAS_TFT
digitalWrite(TFT_BL, HIGH); digitalWrite(TFT_BL, HIGH);
#else #else
display.ssd1306_command(SSD1306_DISPLAYON); #if HAS_EPAPER
// ... to be continued
#else
display.ssd1306_command(SSD1306_DISPLAYON);
#endif
#endif #endif
} else { } else {
#ifdef HAS_TFT #ifdef HAS_TFT
digitalWrite(TFT_BL, LOW); digitalWrite(TFT_BL, LOW);
#else #else
display.ssd1306_command(SSD1306_DISPLAYOFF); #if HAS_EPAPER
// ... to be continued
#else
display.ssd1306_command(SSD1306_DISPLAYOFF);
#endif
#endif #endif
} }
#endif #endif
@@ -128,7 +140,7 @@ bool shouldCleanTFT(const String& header, const String& line1, const String& lin
} }
} }
void show_display(const String& header, const String& line1, const String& line2, const String& line3, int wait) { void displayShow(const String& header, const String& line1, const String& line2, const String& line3, int wait) {
#ifdef HAS_DISPLAY #ifdef HAS_DISPLAY
const String* const lines[] = {&line1, &line2, &line3}; const String* const lines[] = {&line1, &line2, &line3};
#ifdef HAS_TFT #ifdef HAS_TFT
@@ -145,24 +157,28 @@ void show_display(const String& header, const String& line1, const String& line2
tft.print(*lines[i]); tft.print(*lines[i]);
} }
#else #else
display.clearDisplay(); #ifdef HAS_EPAPER
display.setTextColor(WHITE); // ... to be continued
display.setTextSize(1); #else
display.setCursor(0, 0); display.clearDisplay();
display.println(header); display.setTextColor(WHITE);
for (int i = 0; i < 3; i++) { display.setTextSize(1);
display.setCursor(0, 8 + (8 * i)); display.setCursor(0, 0);
display.println(*lines[i]); display.println(header);
} for (int i = 0; i < 3; i++) {
display.ssd1306_command(SSD1306_SETCONTRAST); display.setCursor(0, 8 + (8 * i));
display.ssd1306_command(1); display.println(*lines[i]);
display.display(); }
display.ssd1306_command(SSD1306_SETCONTRAST);
display.ssd1306_command(1);
display.display();
#endif
#endif #endif
delay(wait); delay(wait);
#endif #endif
} }
void show_display(const String& header, const String& line1, const String& line2, const String& line3, const String& line4, const String& line5, const String& line6, int wait) { void displayShow(const String& header, const String& line1, const String& line2, const String& line3, const String& line4, const String& line5, const String& line6, int wait) {
#ifdef HAS_DISPLAY #ifdef HAS_DISPLAY
const String* const lines[] = {&line1, &line2, &line3, &line4, &line5, &line6}; const String* const lines[] = {&line1, &line2, &line3, &line4, &line5, &line6};
#ifdef HAS_TFT #ifdef HAS_TFT
@@ -179,19 +195,23 @@ void show_display(const String& header, const String& line1, const String& line2
tft.print(*lines[i]); tft.print(*lines[i]);
} }
#else #else
display.clearDisplay(); #ifdef HAS_EPAPER
display.setTextColor(WHITE); // ... to be continued
display.setTextSize(2); #else
display.setCursor(0, 0); display.clearDisplay();
display.println(header); display.setTextColor(WHITE);
display.setTextSize(1); display.setTextSize(2);
for (int i = 0; i < 6; i++) { display.setCursor(0, 0);
display.setCursor(0, 16 + (8 * i)); display.println(header);
display.println(*lines[i]); display.setTextSize(1);
} for (int i = 0; i < 6; i++) {
display.ssd1306_command(SSD1306_SETCONTRAST); display.setCursor(0, 16 + (8 * i));
display.ssd1306_command(1); display.println(*lines[i]);
display.display(); }
display.ssd1306_command(SSD1306_SETCONTRAST);
display.ssd1306_command(1);
display.display();
#endif
#endif #endif
delay(wait); delay(wait);
#endif #endif
+4 -4
View File
@@ -6,13 +6,13 @@
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32 #define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
void cleanTFT(); void cleanTFT();
void setup_display(); void displaySetup();
void display_toggle(bool toggle); void displayToggle(bool toggle);
bool shouldCleanTFT(const String& header, const String& line1, const String& line2, const String& line3); bool shouldCleanTFT(const String& header, const String& line1, const String& line2, const String& line3);
bool shouldCleanTFT(const String& header, const String& line1, const String& line2, const String& line3, const String& line4, const String& line5, const String& line6); bool shouldCleanTFT(const String& header, const String& line1, const String& line2, const String& line3, const String& line4, const String& line5, const String& line6);
void show_display(const String& header, const String& line1, const String& line2, const String& line3, int wait = 0); void displayShow(const String& header, const String& line1, const String& line2, const String& line3, int wait = 0);
void show_display(const String& header, const String& line1, const String& line2, const String& line3, const String& line4, const String& line5, const String& line6, int wait = 0); void displayShow(const String& header, const String& line1, const String& line2, const String& line3, const String& line4, const String& line5, const String& line6, int wait = 0);
#endif #endif
+59 -20
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;
@@ -50,32 +71,35 @@ namespace GPS_Utils {
encodedData += helper_base91[i]; encodedData += helper_base91[i];
} }
encodedData += symbol; encodedData += symbol;
encodedData += " x"; encodedData += " ";
encodedData += "\x47"; encodedData += "\x47";
return encodedData; return encodedData;
} }
void generateBeacons() { void generateBeaconFirstPart() {
if (Config.callsign.indexOf("NOCALL-10") != 0 && !Utils::checkValidCallsign(Config.callsign)) {
show_display("***** ERROR ******", "CALLSIGN = NOT VALID!", "", "Only Rx Mode Active", 3000);
Config.loramodule.txActive = false;
Config.aprs_is.messagesToRF = false;
Config.aprs_is.objectsToRF = false;
Config.beacon.sendViaRF = false;
Config.digi.mode = 0;
}
String beaconPacket = Config.callsign; String beaconPacket = Config.callsign;
beaconPacket += ">APLRG1"; beaconPacket += ">APLRG1";
if (Config.beacon.path.indexOf("WIDE") == 0) { if (Config.beacon.path.indexOf("WIDE") == 0) {
beaconPacket += ","; beaconPacket += ",";
beaconPacket += Config.beacon.path; beaconPacket += Config.beacon.path;
} }
iGateBeaconPacket = beaconPacket; iGateBeaconPacket = beaconPacket;
iGateBeaconPacket += ",qAC:!"; iGateBeaconPacket += ",qAC:!";
iGateLoRaBeaconPacket = beaconPacket; iGateLoRaBeaconPacket = beaconPacket;
iGateLoRaBeaconPacket += ":!"; iGateLoRaBeaconPacket += ":!";
}
void generateBeacons() {
if (Config.callsign.indexOf("NOCALL-10") != 0 && !Utils::checkValidCallsign(Config.callsign)) {
displayShow("***** ERROR ******", "CALLSIGN = NOT VALID!", "", "Only Rx Mode Active", 3000);
Config.loramodule.txActive = false;
Config.aprs_is.messagesToRF = false;
Config.aprs_is.objectsToRF = false;
Config.beacon.sendViaRF = false;
Config.digi.mode = 0;
Config.backupDigiMode = false;
}
generateBeaconFirstPart();
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;
@@ -183,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());
}
}
} }
+5 -2
View File
@@ -5,16 +5,19 @@
namespace GPS_Utils { 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
+15 -14
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"
@@ -18,18 +19,18 @@ bool transmitFlag = true;
#ifdef HAS_SX1262 #ifdef HAS_SX1262
SX1262 radio = new Module(RADIO_CS_PIN, RADIO_DIO1_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN); SX1262 radio = new Module(RADIO_CS_PIN, RADIO_DIO1_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN);
#endif #endif
#ifdef HAS_SX1268 #ifdef HAS_SX1268
SX1268 radio = new Module(RADIO_CS_PIN, RADIO_DIO1_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN); SX1268 radio = new Module(RADIO_CS_PIN, RADIO_DIO1_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN);
#endif #endif
#ifdef HAS_SX1278 #ifdef HAS_SX1278
SX1278 radio = new Module(RADIO_CS_PIN, RADIO_BUSY_PIN, RADIO_RST_PIN); SX1278 radio = new Module(RADIO_CS_PIN, RADIO_BUSY_PIN, RADIO_RST_PIN);
#endif #endif
#ifdef HAS_SX1276 #ifdef HAS_SX1276
SX1276 radio = new Module(RADIO_CS_PIN, RADIO_BUSY_PIN, RADIO_RST_PIN); SX1276 radio = new Module(RADIO_CS_PIN, RADIO_BUSY_PIN, RADIO_RST_PIN);
#endif #endif
#if defined(HAS_LLCC68) //LLCC68 supports spreading factor only in range of 5-11!
LLCC68 radio = new Module(RADIO_CS_PIN, RADIO_DIO1_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN);
#endif
int rssi, freqError; int rssi, freqError;
float snr; float snr;
@@ -53,7 +54,7 @@ namespace LoRa_Utils {
Utils::println("Starting LoRa failed! State: " + String(state)); Utils::println("Starting LoRa failed! State: " + String(state));
while (true); while (true);
} }
#if defined(HAS_SX1262) || defined(HAS_SX1268) #if defined(HAS_SX1262) || defined(HAS_SX1268) || defined(HAS_LLCC68)
if (!Config.lowPowerMode) { if (!Config.lowPowerMode) {
radio.setDio1Action(setFlag); radio.setDio1Action(setFlag);
} else { } else {
@@ -73,7 +74,7 @@ namespace LoRa_Utils {
radio.setRfSwitchPins(RADIO_RXEN, RADIO_TXEN); radio.setRfSwitchPins(RADIO_RXEN, RADIO_TXEN);
#endif #endif
#ifdef HAS_1W_LORA // Ebyte E22 400M30S (SX1268) / 900M30S (SX1262) #ifdef HAS_1W_LORA // Ebyte E22 400M30S (SX1268) / 900M30S (SX1262) / Ebyte E220 400M30S (LLCC68)
state = radio.setOutputPower(Config.loramodule.power); // max value 20dB for 1W modules as they have Low Noise Amp state = radio.setOutputPower(Config.loramodule.power); // max value 20dB for 1W modules as they have Low Noise Amp
radio.setCurrentLimit(140); // to be validated (100 , 120, 140)? radio.setCurrentLimit(140); // to be validated (100 , 120, 140)?
#endif #endif
@@ -86,7 +87,7 @@ namespace LoRa_Utils {
radio.setCurrentLimit(140); radio.setCurrentLimit(140);
#endif #endif
#if defined(HAS_SX1262) || defined(HAS_SX1268) #if defined(HAS_SX1262) || defined(HAS_SX1268) || defined(HAS_LLCC68)
radio.setRxBoostedGainMode(true); radio.setRxBoostedGainMode(true);
#endif #endif
@@ -116,9 +117,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 +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
+7 -7
View File
@@ -29,31 +29,31 @@ namespace OTA_Utils {
void onOTAStart() { void onOTAStart() {
Serial.println("OTA update started!"); Serial.println("OTA update started!");
display_toggle(true); displayToggle(true);
lastScreenOn = millis(); lastScreenOn = millis();
show_display("", "", "", " OTA update started!", "", "", "", 1000); displayShow("", "", "", " OTA update started!", "", "", "", 1000);
isUpdatingOTA = true; isUpdatingOTA = true;
} }
void onOTAProgress(size_t current, size_t final) { void onOTAProgress(size_t current, size_t final) {
if (millis() - ota_progress_millis > 1000) { if (millis() - ota_progress_millis > 1000) {
display_toggle(true); displayToggle(true);
lastScreenOn = millis(); lastScreenOn = millis();
ota_progress_millis = millis(); ota_progress_millis = millis();
Serial.printf("OTA Progress Current: %u bytes, Final: %u bytes\n", current, final); Serial.printf("OTA Progress Current: %u bytes, Final: %u bytes\n", current, final);
show_display("", "", " OTA Progress : " + String((current*100)/final) + "%", "", "", "", "", 100); displayShow("", "", " OTA Progress : " + String((current*100)/final) + "%", "", "", "", "", 100);
} }
} }
void onOTAEnd(bool success) { void onOTAEnd(bool success) {
display_toggle(true); displayToggle(true);
lastScreenOn = millis(); lastScreenOn = millis();
if (success) { if (success) {
Serial.println("OTA update finished successfully!"); Serial.println("OTA update finished successfully!");
show_display("", "", " OTA update success!", "", " Rebooting ...", "", "", 4000); displayShow("", "", " OTA update success!", "", " Rebooting ...", "", "", 4000);
} else { } else {
Serial.println("There was an error during OTA update!"); Serial.println("There was an error during OTA update!");
show_display("", "", " OTA update fail!", "", "", "", "", 4000); displayShow("", "", " OTA update fail!", "", "", "", "", 4000);
} }
isUpdatingOTA = false; isUpdatingOTA = false;
} }
+44 -3
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);
@@ -154,22 +184,33 @@ namespace POWER_Utils {
#ifndef HELTEC_WSL_V3 #ifndef HELTEC_WSL_V3
digitalWrite(VEXT_CTRL, HIGH); digitalWrite(VEXT_CTRL, HIGH);
#endif #endif
#ifdef HELTEC_WP
digitalWrite(VEXT_CTRL, LOW);
#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
#ifdef HELTEC_WIRELESS_TRACKER #if defined(HELTEC_WIRELESS_TRACKER)
Wire.begin(BOARD_I2C_SDA, BOARD_I2C_SCL); Wire.begin(BOARD_I2C_SDA, BOARD_I2C_SCL);
#endif #endif
#if defined(HELTEC_V3) || defined(HELTEC_WSL_V3) || defined(HELTEC_WSL_V3_DISPLAY) #if defined(HELTEC_V3) || defined(HELTEC_WP) || defined(HELTEC_WSL_V3) || defined(HELTEC_WSL_V3_DISPLAY)
Wire1.begin(BOARD_I2C_SDA, BOARD_I2C_SCL); Wire1.begin(BOARD_I2C_SDA, BOARD_I2C_SCL);
#endif #endif
#if defined(HELTEC_V3) || defined(HELTEC_WS)
Wire.begin(OLED_SDA, OLED_SCL);
#endif
delay(1000); delay(1000);
BATTERY_Utils::setup();
BATTERY_Utils::startupBatteryHealth(); BATTERY_Utils::startupBatteryHealth();
} }
+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);
+22 -10
View File
@@ -1,13 +1,15 @@
#include "configuration.h" #include "configuration.h"
#include "station_utils.h"
#include "query_utils.h" #include "query_utils.h"
#include "lora_utils.h" #include "lora_utils.h"
extern Configuration Config;
extern std::vector<String> lastHeardStation; extern Configuration Config;
extern String versionDate; extern std::vector<LastHeardStation> lastHeardStations;
extern int rssi; extern String versionDate;
extern float snr; extern int rssi;
extern int freqError; extern float snr;
extern int freqError;
namespace QUERY_Utils { namespace QUERY_Utils {
@@ -19,7 +21,7 @@ namespace QUERY_Utils {
if (queryQuestion == "?APRS?" || queryQuestion == "H" || queryQuestion == "HELP" || queryQuestion=="?") { if (queryQuestion == "?APRS?" || queryQuestion == "H" || queryQuestion == "HELP" || queryQuestion=="?") {
answer.concat("?APRSV ?APRSP ?APRSL ?APRSH ?WHERE callsign"); answer.concat("?APRSV ?APRSP ?APRSL ?APRSH ?WHERE callsign");
} else if (queryQuestion == "?APRSV") { } else if (queryQuestion == "?APRSV") {
answer.concat("CA2RXU_LoRa_iGate 1.4 v"); answer.concat("CA2RXU_LoRa_iGate 2.0 v");
answer.concat(versionDate); answer.concat(versionDate);
} else if (queryQuestion == "?APRSP") { } else if (queryQuestion == "?APRSP") {
answer.concat("iGate QTH: "); answer.concat("iGate QTH: ");
@@ -27,13 +29,13 @@ namespace QUERY_Utils {
answer.concat(" "); answer.concat(" ");
answer.concat(String(Config.beacon.longitude,3)); answer.concat(String(Config.beacon.longitude,3));
} else if (queryQuestion == "?APRSL") { } else if (queryQuestion == "?APRSL") {
if (lastHeardStation.size() == 0) { if (lastHeardStations.size() == 0) {
char answerArray[50]; char answerArray[50];
snprintf(answerArray, sizeof(answerArray), "No Station Listened in the last %d min.", Config.rememberStationTime); snprintf(answerArray, sizeof(answerArray), "No Station Listened in the last %d min.", Config.rememberStationTime);
answer.concat(answerArray); answer.concat(answerArray);
} else { } else {
for (int i=0; i<lastHeardStation.size(); i++) { for (int i=0; i<lastHeardStations.size(); i++) {
answer += lastHeardStation[i].substring(0,lastHeardStation[i].indexOf(",")) + " "; answer += lastHeardStations[i].station + " ";
} }
answer.trim(); answer.trim();
} }
@@ -49,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;
+54 -37
View File
@@ -1,34 +1,35 @@
#include "station_utils.h" #include "station_utils.h"
#include "battery_utils.h"
#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>
extern Configuration Config; extern Configuration Config;
extern uint32_t lastRxTime; extern uint32_t lastRxTime;
extern String fourthLine; extern String fourthLine;
extern bool shouldSleepLowVoltage;
uint32_t lastTxTime = millis(); uint32_t lastTxTime = millis();
std::vector<String> lastHeardStation; std::vector<LastHeardStation> lastHeardStations;
std::vector<String> outputPacketBuffer; std::vector<String> outputPacketBuffer;
std::vector<String> packet25SegBuffer; std::vector<Packet25SegBuffer> packet25SegBuffer;
namespace STATION_Utils { namespace STATION_Utils {
void deleteNotHeard() { void deleteNotHeard() {
std::vector<String> lastHeardStation_temp; std::vector<LastHeardStation> lastHeardStation_temp;
for (int i = 0; i < lastHeardStation.size(); i++) { for (int i = 0; i < lastHeardStations.size(); i++) {
String deltaTimeString = lastHeardStation[i].substring(lastHeardStation[i].indexOf(",") + 1); if (millis() - lastHeardStations[i].lastHeardTime < Config.rememberStationTime * 60 * 1000) {
uint32_t deltaTime = deltaTimeString.toInt(); lastHeardStation_temp.push_back(lastHeardStations[i]);
if ((millis() - deltaTime) < Config.rememberStationTime * 60 * 1000) {
lastHeardStation_temp.push_back(lastHeardStation[i]);
} }
} }
lastHeardStation.clear(); lastHeardStations.clear();
for (int j = 0; j < lastHeardStation_temp.size(); j++) { for (int j = 0; j < lastHeardStation_temp.size(); j++) {
lastHeardStation.push_back(lastHeardStation_temp[j]); lastHeardStations.push_back(lastHeardStation_temp[j]);
} }
lastHeardStation_temp.clear(); lastHeardStation_temp.clear();
} }
@@ -36,29 +37,32 @@ namespace STATION_Utils {
void updateLastHeard(const String& station) { void updateLastHeard(const String& station) {
deleteNotHeard(); deleteNotHeard();
bool stationHeard = false; bool stationHeard = false;
for (int i = 0; i < lastHeardStation.size(); i++) { for (int i = 0; i < lastHeardStations.size(); i++) {
if (lastHeardStation[i].substring(0, lastHeardStation[i].indexOf(",")) == station) { if (lastHeardStations[i].station == station) {
lastHeardStation[i] = station + "," + String(millis()); lastHeardStations[i].lastHeardTime = millis();
stationHeard = true; stationHeard = true;
} }
} }
if (!stationHeard) { if (!stationHeard) {
lastHeardStation.push_back(station + "," + String(millis())); LastHeardStation lastStation;
lastStation.lastHeardTime = millis();
lastStation.station = station;
lastHeardStations.push_back(lastStation);
} }
fourthLine = "Stations ("; fourthLine = "Stations (";
fourthLine += String(Config.rememberStationTime); fourthLine += String(Config.rememberStationTime);
fourthLine += "min) = "; fourthLine += "min) = ";
if (lastHeardStation.size() < 10) { if (lastHeardStations.size() < 10) {
fourthLine += " "; fourthLine += " ";
} }
fourthLine += String(lastHeardStation.size()); fourthLine += String(lastHeardStations.size());
} }
bool wasHeard(const String& station) { bool wasHeard(const String& station) {
deleteNotHeard(); deleteNotHeard();
for (int i = 0; i < lastHeardStation.size(); i++) { for (int i = 0; i < lastHeardStations.size(); i++) {
if (lastHeardStation[i].substring(0, lastHeardStation[i].indexOf(",")) == station) { if (lastHeardStations[i].station == station) {
Utils::println(" ---> Listened Station"); Utils::println(" ---> Listened Station");
return true; return true;
} }
@@ -69,46 +73,59 @@ namespace STATION_Utils {
void clean25SegBuffer() { void clean25SegBuffer() {
if (!packet25SegBuffer.empty()) { if (!packet25SegBuffer.empty()) {
String deltaTimeString = packet25SegBuffer[0].substring(0, packet25SegBuffer[0].indexOf(",")); if ((millis() - packet25SegBuffer[0].receivedTime) > 25 * 1000) {
uint32_t deltaTime = deltaTimeString.toInt();
if ((millis() - deltaTime) > 25 * 1000) {
packet25SegBuffer.erase(packet25SegBuffer.begin()); packet25SegBuffer.erase(packet25SegBuffer.begin());
} }
} }
} }
bool check25SegBuffer(const String& station, const String& textMessage) { bool check25SegBuffer(const String& station, const String& textMessage) {
bool shouldBeIgnored = false;
if (!packet25SegBuffer.empty()) { if (!packet25SegBuffer.empty()) {
bool shouldBeIgnored = false;
for (int i = 0; i < packet25SegBuffer.size(); i++) { for (int i = 0; i < packet25SegBuffer.size(); i++) {
const String& temp = packet25SegBuffer[i].substring(packet25SegBuffer[i].indexOf(",") + 1); if (packet25SegBuffer[i].station == station && packet25SegBuffer[i].payload == textMessage) {
const String& bufferStation = temp.substring(0, temp.indexOf(","));
const String& bufferMessage = temp.substring(temp.indexOf(",") + 1);
if (bufferStation == station && bufferMessage == textMessage) {
shouldBeIgnored = true; shouldBeIgnored = true;
} }
} }
if (shouldBeIgnored) { }
return false; if (shouldBeIgnored) {
} else { return false;
packet25SegBuffer.push_back(String(millis()) + "," + station + "," + textMessage);
return true;
}
} else { } else {
packet25SegBuffer.push_back(String(millis()) + "," + station + "," + textMessage); Packet25SegBuffer packet;
packet.receivedTime = millis();
packet.station = station;
packet.payload = textMessage;
packet25SegBuffer.push_back(packet);
return true; return true;
} }
} }
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();
} }
if (shouldSleepLowVoltage) {
while (outputPacketBuffer.size() > 0) {
LoRa_Utils::sendNewPacket(outputPacketBuffer[0]);
outputPacketBuffer.erase(outputPacketBuffer.begin());
delay(4000);
}
}
if (saveNewDigiEcoModeConfig) {
Config.writeFile();
displayToggle(false);
ESP.restart();
}
} }
void addToOutputPacketBuffer(const String& packet) { void addToOutputPacketBuffer(const String& packet) {
+13
View File
@@ -1,9 +1,22 @@
#ifndef STATION_UTILS_H_ #ifndef STATION_UTILS_H_
#define STATION_UTILS_H_ #define STATION_UTILS_H_
#include <Arduino.h> #include <Arduino.h>
struct Packet25SegBuffer {
uint32_t receivedTime;
String station;
String payload;
};
struct LastHeardStation {
uint32_t lastHeardTime;
String station;
};
namespace STATION_Utils { namespace STATION_Utils {
void deleteNotHeard(); void deleteNotHeard();
+10 -8
View File
@@ -22,14 +22,14 @@ 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();
} }
} }
void checkNewClients() { void checkNewClients() {
WiFiClient new_client = tncServer.available(); WiFiClient new_client = tncServer.accept();
if (new_client.connected()) { if (new_client.connected()) {
for (int i = 0; i < MAX_CLIENTS; i++) { for (int i = 0; i < MAX_CLIENTS; i++) {
WiFiClient* client = clients[i]; WiFiClient* client = clients[i];
@@ -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();
}
} }
} }
} }
+167 -52
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;
@@ -25,7 +28,6 @@ extern String sixthLine;
extern String seventhLine; extern String seventhLine;
extern String iGateBeaconPacket; extern String iGateBeaconPacket;
extern String iGateLoRaBeaconPacket; extern String iGateLoRaBeaconPacket;
extern std::vector<String> lastHeardStation;
extern int rssi; extern int rssi;
extern float snr; extern float snr;
extern int freqError; extern int freqError;
@@ -36,10 +38,15 @@ extern bool backUpDigiMode;
extern bool shouldSleepLowVoltage; extern bool shouldSleepLowVoltage;
extern bool transmitFlag; extern bool transmitFlag;
extern std::vector<LastHeardStation> lastHeardStations;
bool statusAfterBoot = true; bool statusAfterBoot = true;
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 {
@@ -60,7 +67,6 @@ namespace Utils {
statusAfterBoot = false; statusAfterBoot = false;
} }
if (statusAfterBoot && !Config.beacon.sendViaAPRSIS && Config.beacon.sendViaRF) { if (statusAfterBoot && !Config.beacon.sendViaAPRSIS && Config.beacon.sendViaRF) {
delay(2000);
status.concat(":>https://github.com/richonguzman/LoRa_APRS_iGate "); status.concat(":>https://github.com/richonguzman/LoRa_APRS_iGate ");
status.concat(versionDate); status.concat(versionDate);
STATION_Utils::addToOutputPacketBuffer(status); STATION_Utils::addToOutputPacketBuffer(status);
@@ -69,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 -";
@@ -79,12 +87,13 @@ namespace Utils {
} }
void setupDisplay() { void setupDisplay() {
setup_display(); displaySetup();
#ifdef INTERNAL_LED_PIN #ifdef INTERNAL_LED_PIN
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);
show_display(" LoRa APRS", "", " ( iGATE & DIGI )", "", "", "Richonguzman / CA2RXU", " " + versionDate, 4000); Serial.println((Config.digi.ecoMode) ? "(DigiEcoMode: ON)" : "(DigiEcoMode: OFF)");
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);
#endif #endif
@@ -96,37 +105,127 @@ namespace Utils {
fourthLine = "Stations ("; fourthLine = "Stations (";
fourthLine.concat(String(Config.rememberStationTime)); fourthLine.concat(String(Config.rememberStationTime));
fourthLine.concat("min) = "); fourthLine.concat("min) = ");
if (lastHeardStation.size() < 10) { if (lastHeardStations.size() < 10) {
fourthLine += " "; fourthLine += " ";
} }
fourthLine.concat(String(lastHeardStation.size())); fourthLine.concat(String(lastHeardStations.size()));
} }
void sendInitialTelemetryPackets() {
String sender = Config.callsign;
for (int i = sender.length(); i < 9; i++) {
sender += ' ';
}
String baseAPRSISTelemetryPacket = Config.callsign;
baseAPRSISTelemetryPacket += ">APLRG1,TCPIP,qAC::";
baseAPRSISTelemetryPacket += sender;
baseAPRSISTelemetryPacket += ":";
String baseRFTelemetryPacket = Config.callsign;
baseRFTelemetryPacket += ">APLRG1,WIDE1-1::";
baseRFTelemetryPacket += sender;
baseRFTelemetryPacket += ":";
String telemetryPacket1 = "EQNS.";
if (Config.battery.sendInternalVoltage) {
telemetryPacket1 += "0,0.01,0";
}
if (Config.battery.sendExternalVoltage) {
telemetryPacket1 += String(Config.battery.sendInternalVoltage ? "," : "") + "0,0.02,0";
}
String telemetryPacket2 = "UNIT.";
if (Config.battery.sendInternalVoltage) {
telemetryPacket2 += "VDC";
}
if (Config.battery.sendExternalVoltage) {
telemetryPacket2 += String(Config.battery.sendInternalVoltage ? "," : "") + "VDC";
}
String telemetryPacket3 = "PARM.";
if (Config.battery.sendInternalVoltage) {
telemetryPacket3 += "V_Batt";
}
if (Config.battery.sendExternalVoltage) {
telemetryPacket3 += String(Config.battery.sendInternalVoltage ? "," : "") + "V_Ext";
}
if (Config.beacon.sendViaAPRSIS) {
#ifdef HAS_A7670
A7670_Utils::uploadToAPRSIS(baseAPRSISTelemetryPacket + telemetryPacket1);
delay(300);
A7670_Utils::uploadToAPRSIS(baseAPRSISTelemetryPacket + telemetryPacket2);
delay(300);
A7670_Utils::uploadToAPRSIS(baseAPRSISTelemetryPacket + telemetryPacket3);
delay(300);
#else
APRS_IS_Utils::upload(baseAPRSISTelemetryPacket + telemetryPacket1);
delay(300);
APRS_IS_Utils::upload(baseAPRSISTelemetryPacket + telemetryPacket2);
delay(300);
APRS_IS_Utils::upload(baseAPRSISTelemetryPacket + telemetryPacket3);
delay(300);
#endif
delay(300);
} else if (Config.beacon.sendViaRF) {
LoRa_Utils::sendNewPacket(baseRFTelemetryPacket + telemetryPacket1);
delay(3000);
LoRa_Utils::sendNewPacket(baseRFTelemetryPacket + telemetryPacket2);
delay(3000);
LoRa_Utils::sendNewPacket(baseRFTelemetryPacket + telemetryPacket3);
delay(3000);
}
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) {
display_toggle(true); displayToggle(true);
} }
Utils::println("-- Sending Beacon to APRSIS --");
if (sendStartTelemetry && Config.battery.sendVoltageAsTelemetry && !Config.wxsensor.active && (Config.battery.sendInternalVoltage || Config.battery.sendExternalVoltage)) {
sendInitialTelemetryPackets();
}
STATION_Utils::deleteNotHeard(); STATION_Utils::deleteNotHeard();
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...r...p...P...h..b....."; beaconPacket += ".../...g...t...";
secondaryBeaconPacket += ".../...g...t...r...p...P...h..b....."; secondaryBeaconPacket += ".../...g...t...";
} }
beaconPacket += Config.beacon.comment; beaconPacket += Config.beacon.comment;
secondaryBeaconPacket += Config.beacon.comment; secondaryBeaconPacket += Config.beacon.comment;
@@ -134,45 +233,60 @@ namespace Utils {
#if defined(BATTERY_PIN) || defined(HAS_AXP192) || defined(HAS_AXP2101) #if defined(BATTERY_PIN) || defined(HAS_AXP192) || defined(HAS_AXP2101)
if (Config.battery.sendInternalVoltage || Config.battery.monitorInternalVoltage) { if (Config.battery.sendInternalVoltage || Config.battery.monitorInternalVoltage) {
float internalVoltage = BATTERY_Utils::checkInternalVoltage(); float internalVoltage = BATTERY_Utils::checkInternalVoltage();
String internalVoltageInfo = String(internalVoltage,2) + "V";
if (Config.battery.sendInternalVoltage) {
beaconPacket += " Batt=";
beaconPacket += internalVoltageInfo;
secondaryBeaconPacket += " Batt=";
secondaryBeaconPacket += internalVoltageInfo;
sixthLine = " (Batt=";
sixthLine += internalVoltageInfo;
sixthLine += ")";
}
if (Config.battery.monitorInternalVoltage && internalVoltage < Config.battery.internalSleepVoltage) { if (Config.battery.monitorInternalVoltage && internalVoltage < Config.battery.internalSleepVoltage) {
beaconPacket += " **IntBatWarning:SLEEP**"; beaconPacket += " **IntBatWarning:SLEEP**";
secondaryBeaconPacket += " **IntBatWarning:SLEEP**"; secondaryBeaconPacket += " **IntBatWarning:SLEEP**";
shouldSleepLowVoltage = true; shouldSleepLowVoltage = true;
}
String internalVoltageInfo = String(internalVoltage,2) + "V";
if (Config.battery.sendInternalVoltage) {
sixthLine = " (Batt=";
sixthLine += internalVoltageInfo;
sixthLine += ")";
if (!Config.battery.sendVoltageAsTelemetry) {
beaconPacket += " Batt=";
beaconPacket += internalVoltageInfo;
secondaryBeaconPacket += " Batt=";
secondaryBeaconPacket += internalVoltageInfo;
}
}
}
#endif
#ifndef HELTEC_WP
if (Config.battery.sendExternalVoltage || Config.battery.monitorExternalVoltage) {
float externalVoltage = BATTERY_Utils::checkExternalVoltage();
if (Config.battery.monitorExternalVoltage && externalVoltage < Config.battery.externalSleepVoltage) {
beaconPacket += " **ExtBatWarning:SLEEP**";
secondaryBeaconPacket += " **ExtBatWarning:SLEEP**";
shouldSleepLowVoltage = true;
}
String externalVoltageInfo = String(externalVoltage,2) + "V";
if (Config.battery.sendExternalVoltage) {
sixthLine = " (Ext V=";
sixthLine += externalVoltageInfo;
sixthLine += ")";
if (!Config.battery.sendVoltageAsTelemetry) {
beaconPacket += " Ext=";
beaconPacket += externalVoltageInfo;
secondaryBeaconPacket += " Ext=";
secondaryBeaconPacket += externalVoltageInfo;
}
} }
} }
#endif #endif
if (Config.battery.sendExternalVoltage || Config.battery.monitorExternalVoltage) { if (Config.battery.sendVoltageAsTelemetry && !Config.wxsensor.active && (Config.battery.sendInternalVoltage || Config.battery.sendExternalVoltage)){
float externalVoltage = BATTERY_Utils::checkExternalVoltage(); String encodedTelemetry = BATTERY_Utils::generateEncodedTelemetry();
String externalVoltageInfo = String(externalVoltage,2) + "V"; beaconPacket += encodedTelemetry;
if (Config.battery.sendExternalVoltage) { secondaryBeaconPacket += encodedTelemetry;
beaconPacket += " Ext=";
beaconPacket += externalVoltageInfo;
secondaryBeaconPacket += " Ext=";
secondaryBeaconPacket += externalVoltageInfo;
sixthLine = " (Ext V=";
sixthLine += externalVoltageInfo;
sixthLine += ")";
}
if (Config.battery.monitorExternalVoltage && externalVoltage < Config.battery.externalSleepVoltage) {
beaconPacket += " **ExtBatWarning:SLEEP**";
secondaryBeaconPacket += " **ExtBatWarning:SLEEP**";
shouldSleepLowVoltage = true;
}
} }
if (Config.aprs_is.active && Config.beacon.sendViaAPRSIS && !backUpDigiMode) { if (Config.aprs_is.active && Config.beacon.sendViaAPRSIS && !backUpDigiMode) {
show_display(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, "SENDING IGATE BEACON", 0); Utils::println("-- Sending Beacon to APRSIS --");
displayShow(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, "SENDING IGATE BEACON", 0);
seventhLine = " listening..."; seventhLine = " listening...";
#ifdef HAS_A7670 #ifdef HAS_A7670
A7670_Utils::uploadToAPRSIS(beaconPacket); A7670_Utils::uploadToAPRSIS(beaconPacket);
@@ -182,7 +296,8 @@ namespace Utils {
} }
if (Config.beacon.sendViaRF || backUpDigiMode) { if (Config.beacon.sendViaRF || backUpDigiMode) {
show_display(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, "SENDING DIGI BEACON", 0); Utils::println("-- Sending Beacon to RF --");
displayShow(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, "SENDING DIGI BEACON", 0);
seventhLine = " listening..."; seventhLine = " listening...";
STATION_Utils::addToOutputPacketBuffer(secondaryBeaconPacket); STATION_Utils::addToOutputPacketBuffer(secondaryBeaconPacket);
} }
@@ -200,14 +315,14 @@ namespace Utils {
void checkDisplayInterval() { void checkDisplayInterval() {
uint32_t lastDisplayTime = millis() - lastScreenOn; uint32_t lastDisplayTime = millis() - lastScreenOn;
if (!Config.display.alwaysOn && lastDisplayTime >= Config.display.timeout * 1000) { if (!Config.display.alwaysOn && lastDisplayTime >= Config.display.timeout * 1000) {
display_toggle(false); displayToggle(false);
} }
} }
void validateFreqs() { void validateFreqs() {
if (Config.loramodule.txFreq != Config.loramodule.rxFreq && abs(Config.loramodule.txFreq - Config.loramodule.rxFreq) < 125000) { if (Config.loramodule.txFreq != Config.loramodule.rxFreq && abs(Config.loramodule.txFreq - Config.loramodule.rxFreq) < 125000) {
Serial.println("Tx Freq less than 125kHz from Rx Freq ---> NOT VALID"); Serial.println("Tx Freq less than 125kHz from Rx Freq ---> NOT VALID");
show_display("Tx Freq is less than ", "125kHz from Rx Freq", "device will autofix", "and then reboot", 1000); displayShow("Tx Freq is less than ", "125kHz from Rx Freq", "device will autofix", "and then reboot", 1000);
Config.loramodule.txFreq = Config.loramodule.rxFreq; // Inform about that but then change the TX QRG to RX QRG and reset the device Config.loramodule.txFreq = Config.loramodule.rxFreq; // Inform about that but then change the TX QRG to RX QRG and reset the device
Config.writeFile(); Config.writeFile();
ESP.restart(); ESP.restart();
@@ -244,7 +359,7 @@ namespace Utils {
} else if (packet[firstColonIndex + 1] == '>') { } else if (packet[firstColonIndex + 1] == '>') {
sixthLine += "> NEW STATUS"; sixthLine += "> NEW STATUS";
seventhLine = seventhLineHelper; seventhLine = seventhLineHelper;
} else if (packet[firstColonIndex + 1] == '!' || packet[firstColonIndex + 1] == '=') { } else if (packet[firstColonIndex + 1] == '!' || packet[firstColonIndex + 1] == '=' || packet[firstColonIndex + 1] == '@') {
sixthLine += "> GPS BEACON"; sixthLine += "> GPS BEACON";
if (!Config.syslog.active) { if (!Config.syslog.active) {
GPS_Utils::getDistanceAndComment(packet); // to be checked!!! GPS_Utils::getDistanceAndComment(packet); // to be checked!!!
@@ -307,13 +422,13 @@ namespace Utils {
void checkSleepByLowBatteryVoltage(uint8_t mode) { void checkSleepByLowBatteryVoltage(uint8_t mode) {
if (shouldSleepLowVoltage) { if (shouldSleepLowVoltage) {
if (mode == 0) { if (mode == 0) { // at startup
delay(3000); delay(3000);
} }
Serial.println("\n\n*** Sleeping Low Battey Voltage ***\n\n"); Serial.println("\n\n*** Sleeping Low Battey Voltage ***\n\n");
esp_sleep_enable_timer_wakeup(30 * 60 * 1000000); // sleep 30 min esp_sleep_enable_timer_wakeup(30 * 60 * 1000000); // sleep 30 min
if (mode == 1) { if (mode == 1) { // low voltage detected after a while
display_toggle(false); displayToggle(false);
} }
#ifdef VEXT_CTRL #ifdef VEXT_CTRL
#ifndef HELTEC_WSL_V3 #ifndef HELTEC_WSL_V3
+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;
+48 -38
View File
@@ -52,13 +52,13 @@ namespace WEB_Utils {
if(Config.webadmin.active && !request->authenticate(Config.webadmin.username.c_str(), Config.webadmin.password.c_str())) if(Config.webadmin.active && !request->authenticate(Config.webadmin.username.c_str(), Config.webadmin.password.c_str()))
return request->requestAuthentication(); return request->requestAuthentication();
AsyncWebServerResponse *response = request->beginResponse_P(200, "text/html", (const uint8_t*)web_index_html, web_index_html_len); AsyncWebServerResponse *response = request->beginResponse(200, "text/html", (const uint8_t*)web_index_html, web_index_html_len);
response->addHeader("Content-Encoding", "gzip"); response->addHeader("Content-Encoding", "gzip");
request->send(response); request->send(response);
} }
void handleFavicon(AsyncWebServerRequest *request) { void handleFavicon(AsyncWebServerRequest *request) {
AsyncWebServerResponse *response = request->beginResponse_P(200, "image/x-icon", (const uint8_t*)favicon_data, favicon_data_len); AsyncWebServerResponse *response = request->beginResponse(200, "image/x-icon", (const uint8_t*)favicon_data, favicon_data_len);
response->addHeader("Content-Encoding", "gzip"); response->addHeader("Content-Encoding", "gzip");
request->send(response); request->send(response);
} }
@@ -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;
@@ -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();
@@ -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,16 +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.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 = "_";
} }
@@ -205,12 +211,14 @@ 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", "");
response->addHeader("Location", "/"); response->addHeader("Location", "/");
request->send(response); request->send(response);
display_toggle(false); displayToggle(false);
ESP.restart(); ESP.restart();
} }
@@ -222,7 +230,7 @@ namespace WEB_Utils {
request->send(200, "text/plain", "Beacon will be sent in a while"); request->send(200, "text/plain", "Beacon will be sent in a while");
} else if (type == "reboot") { } else if (type == "reboot") {
display_toggle(false); displayToggle(false);
ESP.restart(); ESP.restart();
} else { } else {
request->send(404, "text/plain", "Not Found"); request->send(404, "text/plain", "Not Found");
@@ -230,49 +238,51 @@ namespace WEB_Utils {
} }
void handleStyle(AsyncWebServerRequest *request) { void handleStyle(AsyncWebServerRequest *request) {
AsyncWebServerResponse *response = request->beginResponse_P(200, "text/css", (const uint8_t*)web_style_css, web_style_css_len); AsyncWebServerResponse *response = request->beginResponse(200, "text/css", (const uint8_t*)web_style_css, web_style_css_len);
response->addHeader("Content-Encoding", "gzip"); response->addHeader("Content-Encoding", "gzip");
request->send(response); request->send(response);
} }
void handleScript(AsyncWebServerRequest *request) { void handleScript(AsyncWebServerRequest *request) {
AsyncWebServerResponse *response = request->beginResponse_P(200, "text/javascript", (const uint8_t*)web_script_js, web_script_js_len); AsyncWebServerResponse *response = request->beginResponse(200, "text/javascript", (const uint8_t*)web_script_js, web_script_js_len);
response->addHeader("Content-Encoding", "gzip"); response->addHeader("Content-Encoding", "gzip");
request->send(response); request->send(response);
} }
void handleBootstrapStyle(AsyncWebServerRequest *request) { void handleBootstrapStyle(AsyncWebServerRequest *request) {
AsyncWebServerResponse *response = request->beginResponse_P(200, "text/css", (const uint8_t*)web_bootstrap_css, web_bootstrap_css_len); AsyncWebServerResponse *response = request->beginResponse(200, "text/css", (const uint8_t*)web_bootstrap_css, web_bootstrap_css_len);
response->addHeader("Content-Encoding", "gzip"); response->addHeader("Content-Encoding", "gzip");
response->addHeader("Cache-Control", "max-age=3600"); response->addHeader("Cache-Control", "max-age=3600");
request->send(response); request->send(response);
} }
void handleBootstrapScript(AsyncWebServerRequest *request) { void handleBootstrapScript(AsyncWebServerRequest *request) {
AsyncWebServerResponse *response = request->beginResponse_P(200, "text/javascript", (const uint8_t*)web_bootstrap_js, web_bootstrap_js_len); AsyncWebServerResponse *response = request->beginResponse(200, "text/javascript", (const uint8_t*)web_bootstrap_js, web_bootstrap_js_len);
response->addHeader("Content-Encoding", "gzip"); response->addHeader("Content-Encoding", "gzip");
response->addHeader("Cache-Control", "max-age=3600"); response->addHeader("Cache-Control", "max-age=3600");
request->send(response); request->send(response);
} }
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();
}
} }
} }
+38 -34
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;
@@ -70,11 +72,13 @@ namespace WIFI_Utils {
startAP = true; startAP = true;
} else { } else {
uint8_t wifiCounter = 0; uint8_t wifiCounter = 0;
String hostName = "iGATE-" + Config.callsign;
WiFi.setHostname(hostName.c_str());
WiFi.mode(WIFI_STA); WiFi.mode(WIFI_STA);
WiFi.disconnect(); WiFi.disconnect();
delay(500); delay(500);
unsigned long start = millis(); unsigned long start = millis();
show_display("", "Connecting to Wifi:", "", currentWiFi->ssid + " ...", 0); displayShow("", "Connecting to Wifi:", "", currentWiFi->ssid + " ...", 0);
Serial.print("\nConnecting to WiFi '"); Serial.print(currentWiFi->ssid); Serial.println("' ..."); Serial.print("\nConnecting to WiFi '"); Serial.print(currentWiFi->ssid); Serial.println("' ...");
WiFi.begin(currentWiFi->ssid.c_str(), currentWiFi->password.c_str()); WiFi.begin(currentWiFi->ssid.c_str(), currentWiFi->password.c_str());
while (WiFi.status() != WL_CONNECTED && wifiCounter<myWiFiAPSize) { while (WiFi.status() != WL_CONNECTED && wifiCounter<myWiFiAPSize) {
@@ -99,7 +103,7 @@ namespace WIFI_Utils {
currentWiFi = &Config.wifiAPs[myWiFiAPIndex]; currentWiFi = &Config.wifiAPs[myWiFiAPIndex];
start = millis(); start = millis();
Serial.print("\nConnecting to WiFi '"); Serial.print(currentWiFi->ssid); Serial.println("' ..."); Serial.print("\nConnecting to WiFi '"); Serial.print(currentWiFi->ssid); Serial.println("' ...");
show_display("", "Connecting to Wifi:", "", currentWiFi->ssid + " ...", 0); displayShow("", "Connecting to Wifi:", "", currentWiFi->ssid + " ...", 0);
WiFi.disconnect(); WiFi.disconnect();
WiFi.begin(currentWiFi->ssid.c_str(), currentWiFi->password.c_str()); WiFi.begin(currentWiFi->ssid.c_str(), currentWiFi->password.c_str());
} }
@@ -113,30 +117,30 @@ namespace WIFI_Utils {
Serial.print(WiFi.localIP()); Serial.print(WiFi.localIP());
Serial.print(" / MAC Address: "); Serial.print(" / MAC Address: ");
Serial.println(WiFi.macAddress()); Serial.println(WiFi.macAddress());
show_display("", " Connected!!", "" , " loading ...", 1000); displayShow("", " Connected!!", "" , " loading ...", 1000);
} else if (WiFi.status() != WL_CONNECTED) { } else if (WiFi.status() != WL_CONNECTED) {
startAP = true; startAP = true;
Serial.println("\nNot connected to WiFi! Starting Auto AP"); Serial.println("\nNot connected to WiFi! Starting Auto AP");
show_display("", " WiFi Not Connected!", "" , " loading ...", 1000); displayShow("", " WiFi Not Connected!", "" , " loading ...", 1000);
} }
WiFiConnected = !startAP; WiFiConnected = !startAP;
if (startAP) { if (startAP) {
Serial.println("\nNot connected to WiFi! Starting Auto AP"); Serial.println("\nNot connected to WiFi! Starting Auto AP");
show_display("", " Starting Auto AP", " Please connect to it " , " loading ...", 1000); displayShow("", " Starting Auto AP", " Please connect to it " , " loading ...", 1000);
startAutoAP(); startAutoAP();
} }
} }
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;
@@ -149,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();
} }
+33 -35
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,17 +27,17 @@ Adafruit_Si7021 sensor = Adafruit_Si7021();
namespace BME_Utils { namespace WX_Utils {
void getWxModuleAddres() { void getWxModuleAddres() {
uint8_t err, addr; uint8_t err, addr;
for(addr = 1; addr < 0x7F; addr++) { for(addr = 1; addr < 0x7F; addr++) {
#if defined(HELTEC_V3) || defined(HELTEC_WSL_V3) || defined(HELTEC_WSL_V3_DISPLAY) #if defined(HELTEC_V3) || defined(HELTEC_WSL_V3) || defined(HELTEC_WSL_V3_DISPLAY)
Wire1.beginTransmission(addr); Wire1.beginTransmission(addr);
err = Wire1.endTransmission(); err = Wire1.endTransmission();
#else #else
Wire.beginTransmission(addr); Wire.beginTransmission(addr);
err = Wire.endTransmission(); err = Wire.endTransmission();
#endif #endif
if (err == 0) { if (err == 0) {
//Serial.println(addr); this shows any connected board to I2C //Serial.println(addr); this shows any connected board to I2C
@@ -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;
@@ -93,7 +93,7 @@ namespace BME_Utils {
} }
} }
if (!wxModuleFound) { if (!wxModuleFound) {
show_display("ERROR", "", "BME/BMP/Si7021 sensor active", "but no sensor found...", 2000); displayShow("ERROR", "", "BME/BMP/Si7021 sensor active", "but no sensor found...", 2000);
Serial.println("BME/BMP/Si7021 sensor Active in config but not found! Check Wiring"); Serial.println("BME/BMP/Si7021 sensor Active in config but not found! Check Wiring");
} else { } else {
switch (wxModuleType) { switch (wxModuleType) {
@@ -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...r...p...P...h..b.....";
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 += "r...p...P...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