mirror of
https://github.com/richonguzman/LoRa_APRS_iGate.git
synced 2026-03-28 16:52:33 +01:00
Compare commits
62 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2f0f991785 | ||
|
|
975b140c73 | ||
|
|
f2abe34af1 | ||
|
|
a786d83b9e | ||
|
|
bf0a0d6e4c | ||
|
|
d08e5b1b27 | ||
|
|
f387e03b53 | ||
|
|
16215f9e56 | ||
|
|
ce01d0aa4d | ||
|
|
b0a05f89f6 | ||
|
|
58d8736969 | ||
|
|
df9060d906 | ||
|
|
2bd6844d89 | ||
|
|
0a79b6459b | ||
|
|
d5eb32a38b | ||
|
|
d6c5741fde | ||
|
|
1063a82294 | ||
|
|
6913b6b89f | ||
|
|
42c990f5cf | ||
|
|
a17900e4d0 | ||
|
|
3fd819bd4e | ||
|
|
640166a50b | ||
|
|
a9bcae62e2 | ||
|
|
3e0368383a | ||
|
|
8b790ef656 | ||
|
|
c110b41b99 | ||
|
|
be7fe23cd5 | ||
|
|
202d03c61f | ||
|
|
ddb45544db | ||
|
|
c9ea51c6da | ||
|
|
72fd2b45ec | ||
|
|
0e46c64880 | ||
|
|
dd12330e85 | ||
|
|
2edb183cad | ||
|
|
775677d5e8 | ||
|
|
a60a6d6e4b | ||
|
|
14abe14703 | ||
|
|
345fb1e937 | ||
|
|
916eb038e5 | ||
|
|
40fc177828 | ||
|
|
5dc6e99972 | ||
|
|
db5710ec6a | ||
|
|
65acb54dbe | ||
|
|
6088c61e73 | ||
|
|
a8c972c5e1 | ||
|
|
bd3a9f91d6 | ||
|
|
643a18f40c | ||
|
|
46e5bdd21e | ||
|
|
ea426f4126 | ||
|
|
5cbdd318a2 | ||
|
|
735988ee1c | ||
|
|
d5b666f458 | ||
|
|
702f4abcbb | ||
|
|
d0070e4381 | ||
|
|
f4744eab6a | ||
|
|
bd672857f4 | ||
|
|
9cc26ccdae | ||
|
|
8863838210 | ||
|
|
f11b6de57a | ||
|
|
55d6bc325f | ||
|
|
ee687e6959 | ||
|
|
d1732a6bba |
17
.github/workflows/build.yml
vendored
17
.github/workflows/build.yml
vendored
@@ -33,6 +33,8 @@ jobs:
|
||||
chip: esp32
|
||||
- name: ESP32_DIY_1W_LoRa_915
|
||||
chip: esp32
|
||||
- name: ESP32_DIY_1W_LoRa_LLCC68
|
||||
chip: esp32
|
||||
- name: ESP32_DIY_1W_LoRa_Mesh_V1_2
|
||||
chip: esp32
|
||||
- name: ttgo-t-beam-v1_2
|
||||
@@ -55,12 +57,16 @@ jobs:
|
||||
chip: esp32s3
|
||||
- name: heltec_ht-ct62
|
||||
chip: esp32c3
|
||||
- name: heltec_wireless_paper
|
||||
chip: esp32s3
|
||||
- name: OE5HWN_MeshCom
|
||||
chip: esp32
|
||||
- name: WEMOS-LOLIN32-OLED-DIY
|
||||
chip: esp32
|
||||
- name: WEMOS-D1-R32-RA02
|
||||
chip: esp32
|
||||
- name: WEMOS_S2_MINI_DIY_LoRa
|
||||
chip: esp32s2
|
||||
- name: esp32c3_DIY_1W_LoRa
|
||||
chip: esp32c3
|
||||
- name: esp32c3_DIY_1W_LoRa_915
|
||||
@@ -108,6 +114,17 @@ jobs:
|
||||
0xe000 installer/firmware/boot_app0.bin \
|
||||
0x10000 installer/firmware/firmware.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
|
||||
python installer/bin/esptool/esptool.py --chip esp32s3 merge_bin \
|
||||
-o installer/web_factory.bin \
|
||||
|
||||
11
README.md
11
README.md
@@ -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>))__
|
||||
<br />
|
||||
|
||||
____________________________________________________
|
||||
|
||||
## 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)
|
||||
@@ -14,7 +16,8 @@ __(This iGate Firmware works with all LoRa Tracker Firmwares (specially this <a
|
||||
<br />
|
||||
|
||||
# WEB FLASHER/INSTALLER is <a href="https://richonguzman.github.io/lora-igate-web-flasher/installer.html" target="_blank">here</a>
|
||||
<br />
|
||||
|
||||
____________________________________________________
|
||||
|
||||
# WIKI
|
||||
|
||||
@@ -47,6 +50,12 @@ __(This iGate Firmware works with all LoRa Tracker Firmwares (specially this <a
|
||||
|
||||
## Timeline (Versions):
|
||||
|
||||
- 2024.10.08 New EcoMode for Remote Digirepeaters without WiFi/WiFiAP, Screen, Leds (Example: LILYGO LoRa32 uses only 24mA, with WifiAP and all was 150mA). APRS Message/Queries can start/stop this mode too.
|
||||
- 2024.10.06 Cross Frequency Digirepeater Rules added.
|
||||
- 2024.09.23 Libraries Update for SDK3
|
||||
- 2024.09.23 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.05 WIDE2-n added to WIDE1-n in Digirepeater Modes.
|
||||
- 2024.06.27 External Voltage Divider Resistor configuration on WebUI. Thanks Tilen S54B.
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"wifi": {
|
||||
"autoAP": {
|
||||
"password": "1234567890",
|
||||
"powerOff": 10
|
||||
"timeout": 10
|
||||
},
|
||||
"AP": []
|
||||
},
|
||||
@@ -28,7 +28,8 @@
|
||||
"objectsToRF": false
|
||||
},
|
||||
"digi": {
|
||||
"mode": 0
|
||||
"mode": 0,
|
||||
"ecoMode": false
|
||||
},
|
||||
"lora": {
|
||||
"txFreq": 433775000,
|
||||
@@ -48,15 +49,16 @@
|
||||
"battery": {
|
||||
"sendInternalVoltage": false,
|
||||
"monitorInternalVoltage": false,
|
||||
"internalSleepVoltage": 3.0,
|
||||
"internalSleepVoltage": 2.9,
|
||||
"sendExternalVoltage": false,
|
||||
"externalVoltagePin": 34,
|
||||
"monitorExternalVoltage": false,
|
||||
"externalSleepVoltage": 10.9,
|
||||
"voltageDividerR1": 100.0,
|
||||
"voltageDividerR2": 27.0
|
||||
"voltageDividerR2": 27.0,
|
||||
"sendVoltageAsTelemetry": true
|
||||
},
|
||||
"bme": {
|
||||
"wxsensor": {
|
||||
"active": false,
|
||||
"heightCorrection": 0,
|
||||
"temperatureCorrection": 0.0
|
||||
|
||||
@@ -585,6 +585,21 @@
|
||||
</option>
|
||||
</select>
|
||||
</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>
|
||||
@@ -973,6 +988,20 @@
|
||||
>Send Internal Voltage</label
|
||||
>
|
||||
</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">
|
||||
<input
|
||||
type="checkbox"
|
||||
@@ -998,7 +1027,7 @@
|
||||
placeholder="3.0"
|
||||
class="form-control"
|
||||
step="0.1"
|
||||
min="3.0"
|
||||
min="2.9"
|
||||
max="3.7"
|
||||
/>
|
||||
<span class="input-group-text"
|
||||
@@ -1021,7 +1050,7 @@
|
||||
>Send External Voltage</label
|
||||
>
|
||||
</div>
|
||||
<div class="form-check form-switch mt-3">
|
||||
<div class="form-check form-switch mt-5">
|
||||
<input
|
||||
type="checkbox"
|
||||
name="battery.monitorExternalVoltage"
|
||||
@@ -1121,7 +1150,7 @@
|
||||
d="M3.05 3.05a7 7 0 0 0 0 9.9.5.5 0 0 1-.707.707 8 8 0 0 1 0-11.314.5.5 0 0 1 .707.707m2.122 2.122a4 4 0 0 0 0 5.656.5.5 0 1 1-.708.708 5 5 0 0 1 0-7.072.5.5 0 0 1 .708.708m5.656-.708a.5.5 0 0 1 .708 0 5 5 0 0 1 0 7.072.5.5 0 1 1-.708-.708 4 4 0 0 0 0-5.656.5.5 0 0 1 0-.708m2.122-2.12a.5.5 0 0 1 .707 0 8 8 0 0 1 0 11.313.5.5 0 0 1-.707-.707 7 7 0 0 0 0-9.9.5.5 0 0 1 0-.707zM6 8a2 2 0 1 1 2.5 1.937V15.5a.5.5 0 0 1-1 0V9.937A2 2 0 0 1 6 8"
|
||||
/>
|
||||
</svg>
|
||||
Telemetry
|
||||
WX Telemetry
|
||||
</h5>
|
||||
<small>Define Wx telemetry</small>
|
||||
</div>
|
||||
@@ -1131,12 +1160,12 @@
|
||||
<div class="form-check form-switch">
|
||||
<input
|
||||
type="checkbox"
|
||||
name="bme.active"
|
||||
id="bme.active"
|
||||
name="wxsensor.active"
|
||||
id="wxsensor.active"
|
||||
class="form-check-input"
|
||||
/>
|
||||
<label
|
||||
for="bme.active"
|
||||
for="wxsensor.active"
|
||||
class="form-label"
|
||||
><b>Activate Wx Telemetry</b>
|
||||
<small
|
||||
@@ -1148,14 +1177,14 @@
|
||||
</div>
|
||||
<div class="row mt-3">
|
||||
<div class="col-6">
|
||||
<label for="bme.heightCorrection" class="form-label"
|
||||
<label for="wxsensor.heightCorrection" class="form-label"
|
||||
>Height Correction (Above Sea-Level)</label
|
||||
>
|
||||
<div class="input-group">
|
||||
<input
|
||||
type="number"
|
||||
name="bme.heightCorrection"
|
||||
id="bme.heightCorrection"
|
||||
name="wxsensor.heightCorrection"
|
||||
id="wxsensor.heightCorrection"
|
||||
placeholder="0"
|
||||
class="form-control"
|
||||
step="1"
|
||||
@@ -1167,14 +1196,14 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
<label for="bme.temperatureCorrection" class="form-label"
|
||||
<label for="wxsensor.temperatureCorrection" class="form-label"
|
||||
>Temperature Correction</label
|
||||
>
|
||||
<div class="input-group">
|
||||
<input
|
||||
type="number"
|
||||
name="bme.temperatureCorrection"
|
||||
id="bme.temperatureCorrection"
|
||||
name="wxsensor.temperatureCorrection"
|
||||
id="wxsensor.temperatureCorrection"
|
||||
placeholder="0.0"
|
||||
class="form-control"
|
||||
step="0.1"
|
||||
@@ -1439,10 +1468,10 @@
|
||||
d="M8.5 5.5a.5.5 0 1 1-1 0 .5.5 0 0 1 1 0"
|
||||
/>
|
||||
</svg>
|
||||
Auto AP
|
||||
WiFi Auto AP
|
||||
</h5>
|
||||
<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
|
||||
there is no WiFi connection. Timeout will
|
||||
count from startup or last client
|
||||
@@ -1467,24 +1496,24 @@
|
||||
</div>
|
||||
<div class="col-12 mt-3">
|
||||
<label
|
||||
for="wifi.autoAP.powerOff"
|
||||
for="wifi.autoAP.timeout"
|
||||
class="form-label"
|
||||
>Power off timeout
|
||||
>WiFi AP timeout to search again for available WiFi's
|
||||
<small>(in minutes)</small></label
|
||||
>
|
||||
<input
|
||||
type="number"
|
||||
name="wifi.autoAP.powerOff"
|
||||
id="wifi.autoAP.powerOff"
|
||||
name="wifi.autoAP.timeout"
|
||||
id="wifi.autoAP.timeout"
|
||||
class="form-control"
|
||||
placeholder="15"
|
||||
placeholder="10"
|
||||
required=""
|
||||
step="1"
|
||||
min="0"
|
||||
/>
|
||||
<div class="form-text">
|
||||
Set to <strong>0</strong> if you don't
|
||||
want this option.
|
||||
want WiFi AP to stop.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -136,6 +136,7 @@ function loadSettings(settings) {
|
||||
|
||||
// Digi
|
||||
document.getElementById("digi.mode").value = settings.digi.mode;
|
||||
document.getElementById("digi.ecoMode").checked = settings.digi.ecoMode;
|
||||
|
||||
// LoRa
|
||||
document.getElementById("lora.txFreq").value = settings.lora.txFreq;
|
||||
@@ -162,15 +163,16 @@ function loadSettings(settings) {
|
||||
document.getElementById("battery.internalSleepVoltage").value = settings.battery.internalSleepVoltage.toFixed(1);
|
||||
document.getElementById("battery.sendExternalVoltage").checked = settings.battery.sendExternalVoltage;
|
||||
document.getElementById("battery.externalVoltagePin").value = settings.battery.externalVoltagePin;
|
||||
document.getElementById("battery.voltageDividerR1").value = settings.battery.voltageDividerR1.toFixed(1);
|
||||
document.getElementById("battery.voltageDividerR2").value = settings.battery.voltageDividerR2.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.monitorExternalVoltage").checked = settings.battery.monitorExternalVoltage;
|
||||
document.getElementById("battery.externalSleepVoltage").value = settings.battery.externalSleepVoltage.toFixed(1);
|
||||
document.getElementById("battery.sendVoltageAsTelemetry").checked = settings.battery.sendVoltageAsTelemetry;
|
||||
|
||||
// TELEMETRY BME/WX
|
||||
document.getElementById("bme.active").checked = settings.bme.active;
|
||||
document.getElementById("bme.heightCorrection").value = settings.bme.heightCorrection;
|
||||
document.getElementById("bme.temperatureCorrection").value = settings.bme.temperatureCorrection.toFixed(1);
|
||||
// TELEMETRY WX SENSOR
|
||||
document.getElementById("wxsensor.active").checked = settings.wxsensor.active;
|
||||
document.getElementById("wxsensor.heightCorrection").value = settings.wxsensor.heightCorrection;
|
||||
document.getElementById("wxsensor.temperatureCorrection").value = settings.wxsensor.temperatureCorrection.toFixed(1);
|
||||
|
||||
// SYSLOG
|
||||
document.getElementById("syslog.active").checked = settings.syslog.active;
|
||||
@@ -195,7 +197,7 @@ function loadSettings(settings) {
|
||||
|
||||
// WiFi Auto AP
|
||||
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
|
||||
document.getElementById("ota.username").value = settings.ota.username;
|
||||
@@ -241,7 +243,7 @@ document.getElementById('reboot').addEventListener('click', function (e) {
|
||||
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']");
|
||||
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 110 KiB After Width: | Height: | Size: 198 KiB |
@@ -37,9 +37,9 @@ lib_deps =
|
||||
adafruit/Adafruit BMP280 Library @ 2.6.8
|
||||
adafruit/Adafruit BME680 Library @ 2.0.4
|
||||
adafruit/Adafruit Si7021 Library @ 1.5.3
|
||||
ayushsharma82/ElegantOTA @ 3.1.1
|
||||
ottowinter/ESPAsyncWebServer-esphome @ 3.2.2
|
||||
esphome/AsyncTCP-esphome @ 2.1.1
|
||||
ayushsharma82/ElegantOTA @ 3.1.5
|
||||
mathieucarbou/ESPAsyncWebServer @ 3.2.3
|
||||
mathieucarbou/AsyncTCP @ 3.2.5
|
||||
|
||||
[env:ttgo-lora32-v21]
|
||||
board = ttgo-lora32-v21
|
||||
@@ -93,7 +93,7 @@ lib_deps =
|
||||
adafruit/Adafruit SSD1306 @ 2.5.10
|
||||
|
||||
[env:heltec_wireless_stick]
|
||||
board = heltec_wifi_lora_32_V3
|
||||
board = esp32-s3-devkitc-1
|
||||
board_build.mcu = esp32s3
|
||||
build_flags =
|
||||
-Werror -Wall
|
||||
@@ -177,6 +177,19 @@ lib_deps =
|
||||
adafruit/Adafruit GFX Library @ 1.11.9
|
||||
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]
|
||||
board = esp32dev
|
||||
build_flags =
|
||||
@@ -305,6 +318,7 @@ lib_deps =
|
||||
vshymanskyy/TinyGSM @ 0.12.0
|
||||
vshymanskyy/StreamDebugger @ 1.0.1
|
||||
|
||||
|
||||
[env:heltec_wireless_tracker]
|
||||
board = esp32-s3-devkitc-1
|
||||
board_build.mcu = esp32s3
|
||||
@@ -355,6 +369,19 @@ lib_deps =
|
||||
adafruit/Adafruit GFX Library @ 1.11.9
|
||||
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]
|
||||
board = esp32dev
|
||||
build_flags =
|
||||
@@ -392,6 +419,18 @@ lib_deps =
|
||||
adafruit/Adafruit GFX Library @ 1.11.9
|
||||
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]
|
||||
board = esp32-c3-devkitm-1
|
||||
board_build.mcu = esp32c3
|
||||
|
||||
@@ -29,16 +29,16 @@ ________________________________________________________________________________
|
||||
#include "wifi_utils.h"
|
||||
#include "digi_utils.h"
|
||||
#include "gps_utils.h"
|
||||
#include "bme_utils.h"
|
||||
#include "web_utils.h"
|
||||
#include "tnc_utils.h"
|
||||
#include "wx_utils.h"
|
||||
#include "display.h"
|
||||
#include "utils.h"
|
||||
#ifdef HAS_A7670
|
||||
#include "A7670_utils.h"
|
||||
#endif
|
||||
|
||||
String versionDate = "2024.08.14";
|
||||
String versionDate = "2024.10.08";
|
||||
Configuration Config;
|
||||
WiFiClient espClient;
|
||||
|
||||
@@ -61,7 +61,6 @@ String firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, seven
|
||||
void setup() {
|
||||
Serial.begin(115200);
|
||||
POWER_Utils::setup();
|
||||
BATTERY_Utils::setup();
|
||||
Utils::setupDisplay();
|
||||
LoRa_Utils::setup();
|
||||
Utils::validateFreqs();
|
||||
@@ -112,9 +111,10 @@ void setup() {
|
||||
Config.loramodule.rxActive = false;
|
||||
}
|
||||
#endif
|
||||
DIGI_Utils::checkEcoMode();
|
||||
WIFI_Utils::setup();
|
||||
SYSLOG_Utils::setup();
|
||||
BME_Utils::setup();
|
||||
WX_Utils::setup();
|
||||
WEB_Utils::setup();
|
||||
TNC_Utils::setup();
|
||||
#ifdef HAS_A7670
|
||||
@@ -124,7 +124,7 @@ void setup() {
|
||||
}
|
||||
|
||||
void loop() {
|
||||
WIFI_Utils::checkIfAutoAPShouldPowerOff();
|
||||
WIFI_Utils::checkAutoAPTimeout();
|
||||
|
||||
if (isUpdatingOTA) {
|
||||
ElegantOTA.loop();
|
||||
@@ -137,7 +137,7 @@ void loop() {
|
||||
|
||||
thirdLine = Utils::getLocalIP();
|
||||
|
||||
WIFI_Utils::checkWiFi(); // Always use WiFi, not related to IGate/Digi mode
|
||||
WIFI_Utils::checkWiFi();
|
||||
|
||||
#ifdef HAS_A7670
|
||||
if (Config.aprs_is.active && !modemLoggedToAPRSIS) A7670_Utils::APRS_IS_connect();
|
||||
|
||||
@@ -59,7 +59,7 @@ namespace APRS_IS_Utils {
|
||||
aprsAuth += Config.callsign;
|
||||
aprsAuth += " pass ";
|
||||
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;
|
||||
upload(aprsAuth);
|
||||
delay(200);
|
||||
@@ -71,7 +71,7 @@ namespace APRS_IS_Utils {
|
||||
if (WiFi.status() == WL_CONNECTED) {
|
||||
wifiState = "OK";
|
||||
} else {
|
||||
if (backUpDigiMode) {
|
||||
if (backUpDigiMode || Config.digi.ecoMode) {
|
||||
wifiState = "--";
|
||||
} else {
|
||||
wifiState = "AP";
|
||||
@@ -138,7 +138,8 @@ namespace APRS_IS_Utils {
|
||||
//Serial.println(ackMessage);
|
||||
|
||||
String addToBuffer = Config.callsign;
|
||||
addToBuffer += ">APLRG1,RFONLY";
|
||||
addToBuffer += ">APLRG1";
|
||||
if (!thirdParty) addToBuffer += ",RFONLY";
|
||||
if (Config.beacon.path != "") {
|
||||
addToBuffer += ",";
|
||||
addToBuffer += Config.beacon.path;
|
||||
@@ -302,7 +303,7 @@ namespace APRS_IS_Utils {
|
||||
A7670_Utils::uploadToAPRSIS(queryAnswer);
|
||||
#else
|
||||
upload(queryAnswer);
|
||||
#endif
|
||||
#endif
|
||||
SYSLOG_Utils::log(2, queryAnswer, 0, 0.0, 0); // APRSIS TX
|
||||
fifthLine = "APRS-IS ----> APRS-IS";
|
||||
sixthLine = Config.callsign;
|
||||
|
||||
@@ -17,6 +17,8 @@ float multiplyCorrection = 0.035;
|
||||
|
||||
float voltageDividerTransformation = 0.0;
|
||||
|
||||
int telemetryCounter = random(1,999);
|
||||
|
||||
|
||||
#ifdef HAS_ADC_CALIBRATION
|
||||
#include <esp_adc_cal.h>
|
||||
@@ -102,7 +104,7 @@ namespace BATTERY_Utils {
|
||||
#if defined(HELTEC_WIRELESS_TRACKER)
|
||||
digitalWrite(ADC_CTRL, HIGH);
|
||||
#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);
|
||||
#endif
|
||||
#endif
|
||||
@@ -133,10 +135,15 @@ namespace BATTERY_Utils {
|
||||
#if defined(HELTEC_WIRELESS_TRACKER)
|
||||
digitalWrite(ADC_CTRL, LOW);
|
||||
#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);
|
||||
#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.
|
||||
#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.
|
||||
#else
|
||||
#ifdef HAS_ADC_CALIBRATION
|
||||
@@ -205,12 +212,55 @@ namespace BATTERY_Utils {
|
||||
shouldSleepLowVoltage = true;
|
||||
}
|
||||
#endif
|
||||
if (Config.battery.monitorExternalVoltage && checkExternalVoltage() < Config.battery.externalSleepVoltage + 0.1) {
|
||||
shouldSleepLowVoltage = true;
|
||||
}
|
||||
#ifndef HELTEC_WP
|
||||
if (Config.battery.monitorExternalVoltage && checkExternalVoltage() < Config.battery.externalSleepVoltage + 0.1) {
|
||||
shouldSleepLowVoltage = true;
|
||||
}
|
||||
#endif
|
||||
if (shouldSleepLowVoltage) {
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -14,6 +14,9 @@ namespace BATTERY_Utils {
|
||||
void checkIfShouldSleep(); // ????
|
||||
void startupBatteryHealth();
|
||||
|
||||
String generateEncodedTelemetryBytes(float value, bool firstBytes, byte voltageType);
|
||||
String generateEncodedTelemetry();
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -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
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
// 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)
|
||||
#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_MOSI_PIN 27 // GPIO27 - SX1278 MOSI
|
||||
#define RADIO_CS_PIN 18 // GPIO18 - SX1278 CS ---> NSS
|
||||
@@ -18,17 +18,17 @@
|
||||
#define RADIO_BUSY_PIN 26 // GPIO26 - SX1278 IRQ ---->DIO0
|
||||
#endif
|
||||
|
||||
#if defined(HELTEC_V3) || defined(HELTEC_WSL_V3) || defined(HELTEC_WSL_V3_DISPLAY) || defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_WS)
|
||||
#define RADIO_SCLK_PIN 9 // SX1262 SCK
|
||||
#define RADIO_MISO_PIN 11 // SX1262 MISO
|
||||
#define RADIO_MOSI_PIN 10 // SX1262 MOSI
|
||||
#define RADIO_CS_PIN 8 // SX1262 NSS
|
||||
#define RADIO_RST_PIN 12 // SX1262 RST
|
||||
#define RADIO_DIO1_PIN 14 // SX1262 DIO1
|
||||
#define RADIO_BUSY_PIN 13 // SX1262 BUSY
|
||||
#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_MISO_PIN 11 // SX1262 MISO
|
||||
#define RADIO_MOSI_PIN 10 // SX1262 MOSI
|
||||
#define RADIO_CS_PIN 8 // SX1262 NSS
|
||||
#define RADIO_RST_PIN 12 // SX1262 RST
|
||||
#define RADIO_DIO1_PIN 14 // SX1262 DIO1
|
||||
#define RADIO_BUSY_PIN 13 // SX1262 BUSY
|
||||
#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_MISO_PIN 19
|
||||
#define RADIO_MOSI_PIN 23
|
||||
@@ -84,7 +84,7 @@
|
||||
#define RADIO_TXEN 13
|
||||
#endif
|
||||
|
||||
#ifdef HELTEC_HTCT62
|
||||
#if defined(HELTEC_HTCT62)
|
||||
#define RADIO_SCLK_PIN 10 // SX1262 SCK
|
||||
#define RADIO_MISO_PIN 6 // SX1262 MISO
|
||||
#define RADIO_MOSI_PIN 7 // SX1262 MOSI
|
||||
@@ -132,21 +132,30 @@
|
||||
#define RADIO_TXEN 7
|
||||
#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
|
||||
#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_SCL 22
|
||||
#define OLED_RST -1 // Reset pin # (or -1 if sharing Arduino reset pin)
|
||||
#endif
|
||||
|
||||
#ifdef HELTEC_V2
|
||||
#if defined(HELTEC_V2) || defined(HELTEC_WS)
|
||||
#define OLED_SDA 4
|
||||
#define OLED_SCL 15
|
||||
#define OLED_RST 16
|
||||
#endif
|
||||
|
||||
#if defined(HELTEC_V3) || defined(HELTEC_WS)
|
||||
#if defined(HELTEC_V3)
|
||||
#define OLED_SDA 17
|
||||
#define OLED_SCL 18
|
||||
#define OLED_RST 21
|
||||
@@ -158,7 +167,7 @@
|
||||
#define OLED_RST -1
|
||||
#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
|
||||
#endif
|
||||
|
||||
@@ -166,6 +175,9 @@
|
||||
#ifdef HELTEC_HTCT62
|
||||
#define BATTERY_PIN 1
|
||||
#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)
|
||||
#define INTERNAL_LED_PIN 25 // Green Led
|
||||
#define BATTERY_PIN 35
|
||||
@@ -179,7 +191,7 @@
|
||||
#define INTERNAL_LED_PIN 35
|
||||
#define BATTERY_PIN 1
|
||||
#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_SCL 42
|
||||
#ifdef HELTEC_WSL_V3_DISPLAY
|
||||
@@ -204,6 +216,21 @@
|
||||
#define BOARD_I2C_SCL 6
|
||||
#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!
|
||||
#define OLED_SDA 8
|
||||
#define OLED_SCL 9
|
||||
|
||||
@@ -18,7 +18,7 @@ void Configuration::writeFile() {
|
||||
}
|
||||
|
||||
data["wifi"]["autoAP"]["password"] = wifiAutoAP.password;
|
||||
data["wifi"]["autoAP"]["powerOff"] = wifiAutoAP.powerOff;
|
||||
data["wifi"]["autoAP"]["timeout"] = wifiAutoAP.timeout;
|
||||
|
||||
data["callsign"] = callsign;
|
||||
|
||||
@@ -41,6 +41,7 @@ void Configuration::writeFile() {
|
||||
data["beacon"]["path"] = beacon.path;
|
||||
|
||||
data["digi"]["mode"] = digi.mode;
|
||||
data["digi"]["ecoMode"] = digi.ecoMode;
|
||||
|
||||
data["lora"]["rxFreq"] = loramodule.rxFreq;
|
||||
data["lora"]["txFreq"] = loramodule.txFreq;
|
||||
@@ -65,10 +66,12 @@ void Configuration::writeFile() {
|
||||
data["battery"]["externalSleepVoltage"] = battery.externalSleepVoltage;
|
||||
data["battery"]["voltageDividerR1"] = battery.voltageDividerR1;
|
||||
data["battery"]["voltageDividerR2"] = battery.voltageDividerR2;
|
||||
|
||||
data["battery"]["sendVoltageAsTelemetry"] = battery.sendVoltageAsTelemetry;
|
||||
|
||||
data["bme"]["active"] = bme.active;
|
||||
data["bme"]["heightCorrection"] = bme.heightCorrection;
|
||||
data["bme"]["temperatureCorrection"] = bme.temperatureCorrection;
|
||||
data["wxsensor"]["active"] = wxsensor.active;
|
||||
data["wxsensor"]["heightCorrection"] = wxsensor.heightCorrection;
|
||||
data["wxsensor"]["temperatureCorrection"] = wxsensor.temperatureCorrection;
|
||||
|
||||
data["syslog"]["active"] = syslog.active;
|
||||
data["syslog"]["server"] = syslog.server;
|
||||
@@ -127,7 +130,7 @@ bool Configuration::readFile() {
|
||||
}
|
||||
|
||||
wifiAutoAP.password = data["wifi"]["autoAP"]["password"] | "1234567890";
|
||||
wifiAutoAP.powerOff = data["wifi"]["autoAP"]["powerOff"] | 10;
|
||||
wifiAutoAP.timeout = data["wifi"]["autoAP"]["timeout"] | 10;
|
||||
|
||||
callsign = data["callsign"] | "NOCALL-10";
|
||||
rememberStationTime = data["other"]["rememberStationTime"] | 30;
|
||||
@@ -137,8 +140,8 @@ bool Configuration::readFile() {
|
||||
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.symbol = data["beacon"]["symbol"] | "a";
|
||||
beacon.path = data["beacon"]["path"] | "WIDE1-1";
|
||||
beacon.sendViaAPRSIS = data["beacon"]["sendViaAPRSIS"] | false;
|
||||
beacon.sendViaRF = data["beacon"]["sendViaRF"] | false;
|
||||
|
||||
@@ -150,7 +153,8 @@ bool Configuration::readFile() {
|
||||
aprs_is.messagesToRF = data["aprs_is"]["messagesToRF"] | false;
|
||||
aprs_is.objectsToRF = data["aprs_is"]["objectsToRF"] | false;
|
||||
|
||||
digi.mode = data["digi"]["mode"].as<int>();
|
||||
digi.mode = data["digi"]["mode"] | 0;
|
||||
digi.ecoMode = data["digi"]["ecoMode"] | false;
|
||||
|
||||
loramodule.txFreq = data["lora"]["txFreq"] | 433775000;
|
||||
loramodule.rxFreq = data["lora"]["rxFreq"] | 433775000;
|
||||
@@ -167,18 +171,20 @@ bool Configuration::readFile() {
|
||||
|
||||
battery.sendInternalVoltage = data["battery"]["sendInternalVoltage"] | false;
|
||||
battery.monitorInternalVoltage = data["battery"]["monitorInternalVoltage"] | false;
|
||||
battery.internalSleepVoltage = data["battery"]["internalSleepVoltage"] | 3.0;
|
||||
battery.internalSleepVoltage = data["battery"]["internalSleepVoltage"] | 2.9;
|
||||
|
||||
battery.sendExternalVoltage = data["battery"]["sendExternalVoltage"] | false;
|
||||
battery.externalVoltagePin = data["battery"]["externalVoltagePin"] | 34;
|
||||
battery.monitorExternalVoltage = data["battery"]["monitorExternalVoltage"] | false;
|
||||
battery.externalSleepVoltage = data["battery"]["externalSleepVoltage"] | false;
|
||||
battery.externalSleepVoltage = data["battery"]["externalSleepVoltage"] | 10.9;
|
||||
battery.voltageDividerR1 = data["battery"]["voltageDividerR1"] | 100.0;
|
||||
battery.voltageDividerR2 = data["battery"]["voltageDividerR2"] | 27.0;
|
||||
|
||||
bme.active = data["bme"]["active"] | false;
|
||||
bme.heightCorrection = data["bme"]["heightCorrection"] | 0;
|
||||
bme.temperatureCorrection = data["bme"]["temperatureCorrection"] | 0.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";
|
||||
@@ -230,7 +236,7 @@ void Configuration::init() {
|
||||
wifiAPs.push_back(wifiap);
|
||||
|
||||
wifiAutoAP.password = "1234567890";
|
||||
wifiAutoAP.powerOff = 15;
|
||||
wifiAutoAP.timeout = 10;
|
||||
|
||||
callsign = "N0CALL-10";
|
||||
|
||||
@@ -244,7 +250,8 @@ void Configuration::init() {
|
||||
beacon.sendViaRF = false;
|
||||
beacon.path = "WIDE1-1";
|
||||
|
||||
digi.mode = 0;
|
||||
digi.mode = 0;
|
||||
digi.ecoMode = false;
|
||||
|
||||
tnc.enableServer = false;
|
||||
tnc.enableSerial = false;
|
||||
@@ -275,9 +282,9 @@ void Configuration::init() {
|
||||
syslog.server = "192.168.0.100";
|
||||
syslog.port = 514;
|
||||
|
||||
bme.active = false;
|
||||
bme.heightCorrection = 0;
|
||||
bme.temperatureCorrection = 0.0;
|
||||
wxsensor.active = false;
|
||||
wxsensor.heightCorrection = 0;
|
||||
wxsensor.temperatureCorrection = 0.0;
|
||||
|
||||
ota.username = "";
|
||||
ota.password = "";
|
||||
@@ -286,7 +293,7 @@ void Configuration::init() {
|
||||
|
||||
battery.sendInternalVoltage = false;
|
||||
battery.monitorInternalVoltage = false;
|
||||
battery.internalSleepVoltage = 3.0;
|
||||
battery.internalSleepVoltage = 2.9;
|
||||
|
||||
battery.sendExternalVoltage = false;
|
||||
battery.externalVoltagePin = 34;
|
||||
@@ -295,6 +302,8 @@ void Configuration::init() {
|
||||
battery.voltageDividerR1 = 100.0;
|
||||
battery.voltageDividerR2 = 27.0;
|
||||
|
||||
battery.sendVoltageAsTelemetry = true;
|
||||
|
||||
lowPowerMode = false;
|
||||
lowVoltageCutOff = 0;
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@ public:
|
||||
class WiFi_Auto_AP {
|
||||
public:
|
||||
String password;
|
||||
int powerOff;
|
||||
int timeout;
|
||||
};
|
||||
|
||||
class BEACON {
|
||||
@@ -44,6 +44,7 @@ public:
|
||||
class DIGI {
|
||||
public:
|
||||
int mode;
|
||||
bool ecoMode;
|
||||
};
|
||||
|
||||
|
||||
@@ -77,9 +78,10 @@ public:
|
||||
float externalSleepVoltage;
|
||||
float voltageDividerR1;
|
||||
float voltageDividerR2;
|
||||
bool sendVoltageAsTelemetry;
|
||||
};
|
||||
|
||||
class BME {
|
||||
class WXSENSOR {
|
||||
public:
|
||||
bool active;
|
||||
int heightCorrection;
|
||||
@@ -131,7 +133,7 @@ public:
|
||||
LoraModule loramodule;
|
||||
Display display;
|
||||
BATTERY battery;
|
||||
BME bme;
|
||||
WXSENSOR wxsensor;
|
||||
SYSLOG syslog;
|
||||
TNC tnc;
|
||||
OTA ota;
|
||||
|
||||
@@ -25,31 +25,52 @@ extern bool backUpDigiMode;
|
||||
|
||||
namespace DIGI_Utils {
|
||||
|
||||
String buildPacket(const String& path, const String& packet, bool thirdParty) {
|
||||
String packetToRepeat = packet.substring(0, packet.indexOf(",") + 1);
|
||||
String tempPath = path;
|
||||
String buildPacket(const String& path, const String& packet, bool thirdParty, bool crossFreq) {
|
||||
if (!crossFreq) {
|
||||
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)) {
|
||||
tempPath.replace("WIDE1-1", Config.callsign + "*");
|
||||
} else if (path.indexOf("WIDE2-") != -1 && Config.digi.mode == 3) {
|
||||
if (path.indexOf("*") != 1) {
|
||||
tempPath.remove(path.indexOf("*"), 1);
|
||||
if (path.indexOf("WIDE1-1") != -1 && (Config.digi.mode == 2 || Config.digi.mode == 3)) {
|
||||
tempPath.replace("WIDE1-1", Config.callsign + "*");
|
||||
} else if (path.indexOf("WIDE2-") != -1 && Config.digi.mode == 3) {
|
||||
if (path.indexOf(",WIDE1*") != -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) {
|
||||
tempPath.replace("WIDE2-1", Config.callsign + "*");
|
||||
} else if (path.indexOf("WIDE2-2") != -1) {
|
||||
tempPath.replace("WIDE2-2", Config.callsign + "*,WIDE2-1");
|
||||
packetToRepeat += tempPath;
|
||||
if (thirdParty) {
|
||||
packetToRepeat += APRS_IS_Utils::checkForStartingBytes(packet.substring(packet.indexOf(":}")));
|
||||
} 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){
|
||||
@@ -62,24 +83,34 @@ namespace DIGI_Utils {
|
||||
}
|
||||
if (temp.indexOf(",") > 2) { // checks for path
|
||||
const String& path = temp.substring(temp.indexOf(",") + 1); // after tocall
|
||||
if ((Config.digi.mode == 2 || backUpDigiMode) && path.indexOf("WIDE1-1") != - 1) {
|
||||
return buildPacket(path, packet, thirdParty);
|
||||
if (Config.digi.mode == 2 || backUpDigiMode) {
|
||||
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) {
|
||||
int wide1Index = path.indexOf("WIDE1-1");
|
||||
int wide2Index = path.indexOf("WIDE2-");
|
||||
if (path.indexOf("WIDE1-1") != -1 || path.indexOf("WIDE2-") != -1) {
|
||||
int wide1Index = path.indexOf("WIDE1-1");
|
||||
int wide2Index = path.indexOf("WIDE2-");
|
||||
|
||||
if (wide1Index != -1 && wide2Index != -1 && wide1Index < wide2Index) { // WIDE1-1 && WIDE2-n
|
||||
return buildPacket(path, packet, thirdParty);
|
||||
} else if (wide1Index != -1 && wide2Index == -1) { // only WIDE1-1
|
||||
return buildPacket(path, packet, thirdParty);
|
||||
} else if (wide1Index == -1 && wide2Index != -1) { // only WIDE2-n
|
||||
return buildPacket(path, packet, thirdParty);
|
||||
// WIDE1-1 && WIDE2-n / only WIDE1-1 / only WIDE2-n
|
||||
if ((wide1Index != -1 && wide2Index != -1 && wide1Index < wide2Index) || (wide1Index != -1 && wide2Index == -1) || (wide1Index == -1 && wide2Index != -1)) {
|
||||
return buildPacket(path, packet, thirdParty, false);
|
||||
}
|
||||
return "";
|
||||
} 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 {
|
||||
return "";
|
||||
}
|
||||
} else {
|
||||
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 {
|
||||
return "";
|
||||
}
|
||||
@@ -133,4 +164,12 @@ namespace DIGI_Utils {
|
||||
}
|
||||
}
|
||||
|
||||
void checkEcoMode() {
|
||||
if (Config.digi.ecoMode) {
|
||||
Config.display.alwaysOn = false;
|
||||
Config.display.timeout = 0;
|
||||
setCpuFrequencyMhz(10);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -6,9 +6,10 @@
|
||||
|
||||
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);
|
||||
void processLoRaPacket(const String& packet);
|
||||
void checkEcoMode();
|
||||
|
||||
}
|
||||
|
||||
|
||||
138
src/display.cpp
138
src/display.cpp
@@ -16,15 +16,19 @@
|
||||
#define lineSpacing 12
|
||||
#endif
|
||||
#else
|
||||
#include <Adafruit_GFX.h>
|
||||
#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);
|
||||
#if HAS_EPAPER
|
||||
//
|
||||
#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
|
||||
@@ -52,32 +56,32 @@ void displaySetup() {
|
||||
}
|
||||
tft.setTextFont(0);
|
||||
tft.fillScreen(TFT_BLACK);
|
||||
#else
|
||||
#ifdef OLED_DISPLAY_HAS_RST_PIN
|
||||
pinMode(OLED_RST, OUTPUT);
|
||||
digitalWrite(OLED_RST, LOW);
|
||||
delay(20);
|
||||
digitalWrite(OLED_RST, HIGH);
|
||||
#endif
|
||||
#else
|
||||
#if HAS_EPAPER
|
||||
//
|
||||
#else
|
||||
#ifdef OLED_DISPLAY_HAS_RST_PIN
|
||||
pinMode(OLED_RST, OUTPUT);
|
||||
digitalWrite(OLED_RST, LOW);
|
||||
delay(20);
|
||||
digitalWrite(OLED_RST, HIGH);
|
||||
#endif
|
||||
|
||||
#ifndef HELTEC_WSL_V3_DISPLAY
|
||||
Wire.begin(OLED_SDA, OLED_SCL);
|
||||
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
|
||||
|
||||
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
|
||||
delay(1000);
|
||||
#endif
|
||||
@@ -89,13 +93,21 @@ void displayToggle(bool toggle) {
|
||||
#ifdef HAS_TFT
|
||||
digitalWrite(TFT_BL, HIGH);
|
||||
#else
|
||||
display.ssd1306_command(SSD1306_DISPLAYON);
|
||||
#if HAS_EPAPER
|
||||
// ... to be continued
|
||||
#else
|
||||
display.ssd1306_command(SSD1306_DISPLAYON);
|
||||
#endif
|
||||
#endif
|
||||
} else {
|
||||
#ifdef HAS_TFT
|
||||
digitalWrite(TFT_BL, LOW);
|
||||
#else
|
||||
display.ssd1306_command(SSD1306_DISPLAYOFF);
|
||||
#if HAS_EPAPER
|
||||
// ... to be continued
|
||||
#else
|
||||
display.ssd1306_command(SSD1306_DISPLAYOFF);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
@@ -145,18 +157,22 @@ void displayShow(const String& header, const String& line1, const String& line2,
|
||||
tft.print(*lines[i]);
|
||||
}
|
||||
#else
|
||||
display.clearDisplay();
|
||||
display.setTextColor(WHITE);
|
||||
display.setTextSize(1);
|
||||
display.setCursor(0, 0);
|
||||
display.println(header);
|
||||
for (int i = 0; i < 3; i++) {
|
||||
display.setCursor(0, 8 + (8 * i));
|
||||
display.println(*lines[i]);
|
||||
}
|
||||
display.ssd1306_command(SSD1306_SETCONTRAST);
|
||||
display.ssd1306_command(1);
|
||||
display.display();
|
||||
#ifdef HAS_EPAPER
|
||||
// ... to be continued
|
||||
#else
|
||||
display.clearDisplay();
|
||||
display.setTextColor(WHITE);
|
||||
display.setTextSize(1);
|
||||
display.setCursor(0, 0);
|
||||
display.println(header);
|
||||
for (int i = 0; i < 3; i++) {
|
||||
display.setCursor(0, 8 + (8 * i));
|
||||
display.println(*lines[i]);
|
||||
}
|
||||
display.ssd1306_command(SSD1306_SETCONTRAST);
|
||||
display.ssd1306_command(1);
|
||||
display.display();
|
||||
#endif
|
||||
#endif
|
||||
delay(wait);
|
||||
#endif
|
||||
@@ -179,19 +195,23 @@ void displayShow(const String& header, const String& line1, const String& line2,
|
||||
tft.print(*lines[i]);
|
||||
}
|
||||
#else
|
||||
display.clearDisplay();
|
||||
display.setTextColor(WHITE);
|
||||
display.setTextSize(2);
|
||||
display.setCursor(0, 0);
|
||||
display.println(header);
|
||||
display.setTextSize(1);
|
||||
for (int i = 0; i < 6; i++) {
|
||||
display.setCursor(0, 16 + (8 * i));
|
||||
display.println(*lines[i]);
|
||||
}
|
||||
display.ssd1306_command(SSD1306_SETCONTRAST);
|
||||
display.ssd1306_command(1);
|
||||
display.display();
|
||||
#ifdef HAS_EPAPER
|
||||
// ... to be continued
|
||||
#else
|
||||
display.clearDisplay();
|
||||
display.setTextColor(WHITE);
|
||||
display.setTextSize(2);
|
||||
display.setCursor(0, 0);
|
||||
display.println(header);
|
||||
display.setTextSize(1);
|
||||
for (int i = 0; i < 6; i++) {
|
||||
display.setCursor(0, 16 + (8 * i));
|
||||
display.println(*lines[i]);
|
||||
}
|
||||
display.ssd1306_command(SSD1306_SETCONTRAST);
|
||||
display.ssd1306_command(1);
|
||||
display.display();
|
||||
#endif
|
||||
#endif
|
||||
delay(wait);
|
||||
#endif
|
||||
|
||||
@@ -50,7 +50,7 @@ namespace GPS_Utils {
|
||||
encodedData += helper_base91[i];
|
||||
}
|
||||
encodedData += symbol;
|
||||
encodedData += " x";
|
||||
encodedData += " ";
|
||||
encodedData += "\x47";
|
||||
return encodedData;
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ namespace GPS_Utils {
|
||||
char *ax25_base91enc(char *s, uint8_t n, uint32_t v);
|
||||
String encodeGPS(float latitude, float longitude, const String& overlay, const String& symbol);
|
||||
void generateBeacons();
|
||||
double calculateDistanceCourse(double latitude, double longitude);
|
||||
//double calculateDistanceCourse(double latitude, double longitude);
|
||||
String decodeEncodedGPS(const String& packet);
|
||||
String getReceivedGPS(const String& packet);
|
||||
String getDistanceAndComment(const String& packet);
|
||||
|
||||
@@ -18,18 +18,18 @@ bool transmitFlag = true;
|
||||
#ifdef HAS_SX1262
|
||||
SX1262 radio = new Module(RADIO_CS_PIN, RADIO_DIO1_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN);
|
||||
#endif
|
||||
|
||||
#ifdef HAS_SX1268
|
||||
SX1268 radio = new Module(RADIO_CS_PIN, RADIO_DIO1_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN);
|
||||
#endif
|
||||
|
||||
#ifdef HAS_SX1278
|
||||
SX1278 radio = new Module(RADIO_CS_PIN, RADIO_BUSY_PIN, RADIO_RST_PIN);
|
||||
#endif
|
||||
|
||||
#ifdef HAS_SX1276
|
||||
SX1276 radio = new Module(RADIO_CS_PIN, RADIO_BUSY_PIN, RADIO_RST_PIN);
|
||||
#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;
|
||||
float snr;
|
||||
@@ -53,7 +53,7 @@ namespace LoRa_Utils {
|
||||
Utils::println("Starting LoRa failed! State: " + String(state));
|
||||
while (true);
|
||||
}
|
||||
#if defined(HAS_SX1262) || defined(HAS_SX1268)
|
||||
#if defined(HAS_SX1262) || defined(HAS_SX1268) || defined(HAS_LLCC68)
|
||||
if (!Config.lowPowerMode) {
|
||||
radio.setDio1Action(setFlag);
|
||||
} else {
|
||||
@@ -73,7 +73,7 @@ namespace LoRa_Utils {
|
||||
radio.setRfSwitchPins(RADIO_RXEN, RADIO_TXEN);
|
||||
#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
|
||||
radio.setCurrentLimit(140); // to be validated (100 , 120, 140)?
|
||||
#endif
|
||||
@@ -86,7 +86,7 @@ namespace LoRa_Utils {
|
||||
radio.setCurrentLimit(140);
|
||||
#endif
|
||||
|
||||
#if defined(HAS_SX1262) || defined(HAS_SX1268)
|
||||
#if defined(HAS_SX1262) || defined(HAS_SX1268) || defined(HAS_LLCC68)
|
||||
radio.setRxBoostedGainMode(true);
|
||||
#endif
|
||||
|
||||
@@ -116,9 +116,9 @@ namespace LoRa_Utils {
|
||||
if (Config.loramodule.txFreq != Config.loramodule.rxFreq) {
|
||||
changeFreqTx();
|
||||
}
|
||||
|
||||
|
||||
#ifdef INTERNAL_LED_PIN
|
||||
digitalWrite(INTERNAL_LED_PIN, HIGH);
|
||||
if (!Config.digi.ecoMode) digitalWrite(INTERNAL_LED_PIN, HIGH);
|
||||
#endif
|
||||
int state = radio.transmit("\x3c\xff\x01" + newPacket);
|
||||
transmitFlag = true;
|
||||
@@ -133,7 +133,7 @@ namespace LoRa_Utils {
|
||||
Utils::println(String(state));
|
||||
}
|
||||
#ifdef INTERNAL_LED_PIN
|
||||
digitalWrite(INTERNAL_LED_PIN, LOW);
|
||||
if (!Config.digi.ecoMode) digitalWrite(INTERNAL_LED_PIN, LOW);
|
||||
#endif
|
||||
if (Config.loramodule.txFreq != Config.loramodule.rxFreq) {
|
||||
changeFreqRx();
|
||||
|
||||
@@ -154,22 +154,29 @@ namespace POWER_Utils {
|
||||
#ifndef HELTEC_WSL_V3
|
||||
digitalWrite(VEXT_CTRL, HIGH);
|
||||
#endif
|
||||
#ifdef HELTEC_WP
|
||||
digitalWrite(VEXT_CTRL, LOW);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef ADC_CTRL
|
||||
pinMode(ADC_CTRL, OUTPUT);
|
||||
#endif
|
||||
|
||||
#ifdef HELTEC_WIRELESS_TRACKER
|
||||
#if defined(HELTEC_WIRELESS_TRACKER)
|
||||
Wire.begin(BOARD_I2C_SDA, BOARD_I2C_SCL);
|
||||
#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);
|
||||
#endif
|
||||
|
||||
#if defined(HELTEC_V3) || defined(HELTEC_WS)
|
||||
Wire.begin(OLED_SDA, OLED_SCL);
|
||||
#endif
|
||||
|
||||
delay(1000);
|
||||
|
||||
BATTERY_Utils::setup();
|
||||
BATTERY_Utils::startupBatteryHealth();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,13 +1,15 @@
|
||||
#include "configuration.h"
|
||||
#include "station_utils.h"
|
||||
#include "query_utils.h"
|
||||
#include "lora_utils.h"
|
||||
|
||||
extern Configuration Config;
|
||||
extern std::vector<String> lastHeardStation;
|
||||
extern String versionDate;
|
||||
extern int rssi;
|
||||
extern float snr;
|
||||
extern int freqError;
|
||||
|
||||
extern Configuration Config;
|
||||
extern std::vector<LastHeardStation> lastHeardStations;
|
||||
extern String versionDate;
|
||||
extern int rssi;
|
||||
extern float snr;
|
||||
extern int freqError;
|
||||
|
||||
|
||||
namespace QUERY_Utils {
|
||||
@@ -19,7 +21,7 @@ namespace QUERY_Utils {
|
||||
if (queryQuestion == "?APRS?" || queryQuestion == "H" || queryQuestion == "HELP" || queryQuestion=="?") {
|
||||
answer.concat("?APRSV ?APRSP ?APRSL ?APRSH ?WHERE callsign");
|
||||
} else if (queryQuestion == "?APRSV") {
|
||||
answer.concat("CA2RXU_LoRa_iGate 1.4 v");
|
||||
answer.concat("CA2RXU_LoRa_iGate 2.0 v");
|
||||
answer.concat(versionDate);
|
||||
} else if (queryQuestion == "?APRSP") {
|
||||
answer.concat("iGate QTH: ");
|
||||
@@ -27,13 +29,13 @@ namespace QUERY_Utils {
|
||||
answer.concat(" ");
|
||||
answer.concat(String(Config.beacon.longitude,3));
|
||||
} else if (queryQuestion == "?APRSL") {
|
||||
if (lastHeardStation.size() == 0) {
|
||||
if (lastHeardStations.size() == 0) {
|
||||
char answerArray[50];
|
||||
snprintf(answerArray, sizeof(answerArray), "No Station Listened in the last %d min.", Config.rememberStationTime);
|
||||
answer.concat(answerArray);
|
||||
} else {
|
||||
for (int i=0; i<lastHeardStation.size(); i++) {
|
||||
answer += lastHeardStation[i].substring(0,lastHeardStation[i].indexOf(",")) + " ";
|
||||
for (int i=0; i<lastHeardStations.size(); i++) {
|
||||
answer += lastHeardStations[i].station + " ";
|
||||
}
|
||||
answer.trim();
|
||||
}
|
||||
@@ -49,6 +51,16 @@ namespace QUERY_Utils {
|
||||
// agregar callsign para completar donde esta X callsign --> posicion
|
||||
Serial.println("estaciones escuchadas directo (ultimos 30 min)");
|
||||
answer.concat("?WHERE on development 73!");
|
||||
} else if (queryQuestion.indexOf("?APRSEEM") == 0) { // Exit DigiRepeater EcoMode
|
||||
answer = "DigiEcoMode:Stop";
|
||||
Config.digi.ecoMode = false;
|
||||
Config.display.alwaysOn = true;
|
||||
Config.display.timeout = 10;
|
||||
} else if (queryQuestion.indexOf("?APRSSEM") == 0) { // Start DigiRepeater EcoMode
|
||||
answer = "DigiEcoMode:Start";
|
||||
Config.digi.ecoMode = true;
|
||||
} else if (queryQuestion.indexOf("?APRSEMS") == 0) { // DigiRepeater EcoMode Status
|
||||
answer = (Config.digi.ecoMode) ? "DigiEcoMode:ON" : "DigiEcoMode:OFF";
|
||||
}
|
||||
|
||||
String queryAnswer = Config.callsign;
|
||||
|
||||
@@ -1,34 +1,35 @@
|
||||
#include "station_utils.h"
|
||||
#include "battery_utils.h"
|
||||
#include "aprs_is_utils.h"
|
||||
#include "configuration.h"
|
||||
#include "lora_utils.h"
|
||||
#include "display.h"
|
||||
#include "utils.h"
|
||||
#include <vector>
|
||||
|
||||
extern Configuration Config;
|
||||
extern uint32_t lastRxTime;
|
||||
extern String fourthLine;
|
||||
extern bool shouldSleepLowVoltage;
|
||||
|
||||
uint32_t lastTxTime = millis();
|
||||
std::vector<String> lastHeardStation;
|
||||
std::vector<LastHeardStation> lastHeardStations;
|
||||
std::vector<String> outputPacketBuffer;
|
||||
std::vector<String> packet25SegBuffer;
|
||||
std::vector<Packet25SegBuffer> packet25SegBuffer;
|
||||
|
||||
|
||||
namespace STATION_Utils {
|
||||
|
||||
void deleteNotHeard() {
|
||||
std::vector<String> lastHeardStation_temp;
|
||||
for (int i = 0; i < lastHeardStation.size(); i++) {
|
||||
String deltaTimeString = lastHeardStation[i].substring(lastHeardStation[i].indexOf(",") + 1);
|
||||
uint32_t deltaTime = deltaTimeString.toInt();
|
||||
if ((millis() - deltaTime) < Config.rememberStationTime * 60 * 1000) {
|
||||
lastHeardStation_temp.push_back(lastHeardStation[i]);
|
||||
std::vector<LastHeardStation> lastHeardStation_temp;
|
||||
for (int i = 0; i < lastHeardStations.size(); i++) {
|
||||
if (millis() - lastHeardStations[i].lastHeardTime < Config.rememberStationTime * 60 * 1000) {
|
||||
lastHeardStation_temp.push_back(lastHeardStations[i]);
|
||||
}
|
||||
}
|
||||
lastHeardStation.clear();
|
||||
lastHeardStations.clear();
|
||||
for (int j = 0; j < lastHeardStation_temp.size(); j++) {
|
||||
lastHeardStation.push_back(lastHeardStation_temp[j]);
|
||||
lastHeardStations.push_back(lastHeardStation_temp[j]);
|
||||
}
|
||||
lastHeardStation_temp.clear();
|
||||
}
|
||||
@@ -36,29 +37,32 @@ namespace STATION_Utils {
|
||||
void updateLastHeard(const String& station) {
|
||||
deleteNotHeard();
|
||||
bool stationHeard = false;
|
||||
for (int i = 0; i < lastHeardStation.size(); i++) {
|
||||
if (lastHeardStation[i].substring(0, lastHeardStation[i].indexOf(",")) == station) {
|
||||
lastHeardStation[i] = station + "," + String(millis());
|
||||
for (int i = 0; i < lastHeardStations.size(); i++) {
|
||||
if (lastHeardStations[i].station == station) {
|
||||
lastHeardStations[i].lastHeardTime = millis();
|
||||
stationHeard = true;
|
||||
}
|
||||
}
|
||||
if (!stationHeard) {
|
||||
lastHeardStation.push_back(station + "," + String(millis()));
|
||||
LastHeardStation lastStation;
|
||||
lastStation.lastHeardTime = millis();
|
||||
lastStation.station = station;
|
||||
lastHeardStations.push_back(lastStation);
|
||||
}
|
||||
|
||||
fourthLine = "Stations (";
|
||||
fourthLine += String(Config.rememberStationTime);
|
||||
fourthLine += "min) = ";
|
||||
if (lastHeardStation.size() < 10) {
|
||||
if (lastHeardStations.size() < 10) {
|
||||
fourthLine += " ";
|
||||
}
|
||||
fourthLine += String(lastHeardStation.size());
|
||||
fourthLine += String(lastHeardStations.size());
|
||||
}
|
||||
|
||||
bool wasHeard(const String& station) {
|
||||
deleteNotHeard();
|
||||
for (int i = 0; i < lastHeardStation.size(); i++) {
|
||||
if (lastHeardStation[i].substring(0, lastHeardStation[i].indexOf(",")) == station) {
|
||||
for (int i = 0; i < lastHeardStations.size(); i++) {
|
||||
if (lastHeardStations[i].station == station) {
|
||||
Utils::println(" ---> Listened Station");
|
||||
return true;
|
||||
}
|
||||
@@ -69,46 +73,59 @@ namespace STATION_Utils {
|
||||
|
||||
void clean25SegBuffer() {
|
||||
if (!packet25SegBuffer.empty()) {
|
||||
String deltaTimeString = packet25SegBuffer[0].substring(0, packet25SegBuffer[0].indexOf(","));
|
||||
uint32_t deltaTime = deltaTimeString.toInt();
|
||||
if ((millis() - deltaTime) > 25 * 1000) {
|
||||
if ((millis() - packet25SegBuffer[0].receivedTime) > 25 * 1000) {
|
||||
packet25SegBuffer.erase(packet25SegBuffer.begin());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool check25SegBuffer(const String& station, const String& textMessage) {
|
||||
bool shouldBeIgnored = false;
|
||||
if (!packet25SegBuffer.empty()) {
|
||||
bool shouldBeIgnored = false;
|
||||
for (int i = 0; i < packet25SegBuffer.size(); i++) {
|
||||
const String& temp = packet25SegBuffer[i].substring(packet25SegBuffer[i].indexOf(",") + 1);
|
||||
const String& bufferStation = temp.substring(0, temp.indexOf(","));
|
||||
const String& bufferMessage = temp.substring(temp.indexOf(",") + 1);
|
||||
if (bufferStation == station && bufferMessage == textMessage) {
|
||||
if (packet25SegBuffer[i].station == station && packet25SegBuffer[i].payload == textMessage) {
|
||||
shouldBeIgnored = true;
|
||||
}
|
||||
}
|
||||
if (shouldBeIgnored) {
|
||||
return false;
|
||||
} else {
|
||||
packet25SegBuffer.push_back(String(millis()) + "," + station + "," + textMessage);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
if (shouldBeIgnored) {
|
||||
return false;
|
||||
} 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void processOutputPacketBuffer() {
|
||||
int timeToWait = 3 * 1000; // 3 segs between packet Tx and also Rx ???
|
||||
uint32_t lastRx = millis() - lastRxTime;
|
||||
uint32_t lastTx = millis() - lastTxTime;
|
||||
int timeToWait = 3 * 1000; // 3 segs between packet Tx and also Rx ???
|
||||
uint32_t lastRx = millis() - lastRxTime;
|
||||
uint32_t lastTx = millis() - lastTxTime;
|
||||
bool saveNewDigiEcoModeConfig = false;
|
||||
if (outputPacketBuffer.size() > 0 && lastTx > timeToWait && lastRx > timeToWait) {
|
||||
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());
|
||||
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) {
|
||||
|
||||
@@ -1,9 +1,22 @@
|
||||
#ifndef STATION_UTILS_H_
|
||||
#define STATION_UTILS_H_
|
||||
|
||||
|
||||
#include <Arduino.h>
|
||||
|
||||
|
||||
struct Packet25SegBuffer {
|
||||
uint32_t receivedTime;
|
||||
String station;
|
||||
String payload;
|
||||
};
|
||||
|
||||
struct LastHeardStation {
|
||||
uint32_t lastHeardTime;
|
||||
String station;
|
||||
};
|
||||
|
||||
|
||||
namespace STATION_Utils {
|
||||
|
||||
void deleteNotHeard();
|
||||
|
||||
@@ -22,14 +22,14 @@ String inputSerialBuffer = "";
|
||||
namespace TNC_Utils {
|
||||
|
||||
void setup() {
|
||||
if (Config.tnc.enableServer) {
|
||||
if (Config.tnc.enableServer && !Config.digi.ecoMode) {
|
||||
tncServer.stop();
|
||||
tncServer.begin();
|
||||
}
|
||||
}
|
||||
|
||||
void checkNewClients() {
|
||||
WiFiClient new_client = tncServer.available();
|
||||
WiFiClient new_client = tncServer.accept();
|
||||
if (new_client.connected()) {
|
||||
for (int i = 0; i < MAX_CLIENTS; i++) {
|
||||
WiFiClient* client = clients[i];
|
||||
@@ -133,12 +133,14 @@ namespace TNC_Utils {
|
||||
}
|
||||
|
||||
void loop() {
|
||||
if (Config.tnc.enableServer) {
|
||||
checkNewClients();
|
||||
readFromClients();
|
||||
}
|
||||
if (Config.tnc.enableSerial) {
|
||||
readFromSerial();
|
||||
if (!Config.digi.ecoMode) {
|
||||
if (Config.tnc.enableServer) {
|
||||
checkNewClients();
|
||||
readFromClients();
|
||||
}
|
||||
if (Config.tnc.enableSerial) {
|
||||
readFromSerial();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
177
src/utils.cpp
177
src/utils.cpp
@@ -9,7 +9,7 @@
|
||||
#include "lora_utils.h"
|
||||
#include "wifi_utils.h"
|
||||
#include "gps_utils.h"
|
||||
#include "bme_utils.h"
|
||||
#include "wx_utils.h"
|
||||
#include "display.h"
|
||||
#include "utils.h"
|
||||
|
||||
@@ -25,7 +25,6 @@ extern String sixthLine;
|
||||
extern String seventhLine;
|
||||
extern String iGateBeaconPacket;
|
||||
extern String iGateLoRaBeaconPacket;
|
||||
extern std::vector<String> lastHeardStation;
|
||||
extern int rssi;
|
||||
extern float snr;
|
||||
extern int freqError;
|
||||
@@ -36,7 +35,10 @@ extern bool backUpDigiMode;
|
||||
extern bool shouldSleepLowVoltage;
|
||||
extern bool transmitFlag;
|
||||
|
||||
extern std::vector<LastHeardStation> lastHeardStations;
|
||||
|
||||
bool statusAfterBoot = true;
|
||||
bool sendStartTelemetry = true;
|
||||
bool beaconUpdate = true;
|
||||
uint32_t lastBeaconTx = 0;
|
||||
uint32_t lastScreenOn = millis();
|
||||
@@ -60,7 +62,6 @@ namespace Utils {
|
||||
statusAfterBoot = false;
|
||||
}
|
||||
if (statusAfterBoot && !Config.beacon.sendViaAPRSIS && Config.beacon.sendViaRF) {
|
||||
delay(2000);
|
||||
status.concat(":>https://github.com/richonguzman/LoRa_APRS_iGate ");
|
||||
status.concat(versionDate);
|
||||
STATION_Utils::addToOutputPacketBuffer(status);
|
||||
@@ -69,7 +70,9 @@ namespace Utils {
|
||||
}
|
||||
|
||||
String getLocalIP() {
|
||||
if (!WiFiConnected) {
|
||||
if (Config.digi.ecoMode) {
|
||||
return "** WiFi AP Killed **";
|
||||
} else if (!WiFiConnected) {
|
||||
return "IP : 192.168.4.1";
|
||||
} else if (backUpDigiMode) {
|
||||
return "- BACKUP DIGI MODE -";
|
||||
@@ -84,6 +87,7 @@ namespace Utils {
|
||||
digitalWrite(INTERNAL_LED_PIN,HIGH);
|
||||
#endif
|
||||
Serial.println("\nStarting Station: " + Config.callsign + " Version: " + versionDate);
|
||||
Serial.println((Config.digi.ecoMode) ? "(DigiEcoMode: ON)" : "(DigiEcoMode: OFF)");
|
||||
displayShow(" LoRa APRS", "", "", " ( iGATE & DIGI )", "", "" , " CA2RXU " + versionDate, 4000);
|
||||
#ifdef INTERNAL_LED_PIN
|
||||
digitalWrite(INTERNAL_LED_PIN,LOW);
|
||||
@@ -96,12 +100,82 @@ namespace Utils {
|
||||
fourthLine = "Stations (";
|
||||
fourthLine.concat(String(Config.rememberStationTime));
|
||||
fourthLine.concat("min) = ");
|
||||
if (lastHeardStation.size() < 10) {
|
||||
if (lastHeardStations.size() < 10) {
|
||||
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() {
|
||||
uint32_t lastTx = millis() - lastBeaconTx;
|
||||
if (lastBeaconTx == 0 || lastTx >= Config.beacon.interval * 60 * 1000) {
|
||||
@@ -112,21 +186,24 @@ namespace Utils {
|
||||
if (!Config.display.alwaysOn && Config.display.timeout != 0) {
|
||||
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();
|
||||
|
||||
activeStations();
|
||||
|
||||
String beaconPacket = iGateBeaconPacket;
|
||||
String secondaryBeaconPacket = iGateLoRaBeaconPacket;
|
||||
if (Config.bme.active && wxModuleType != 0) {
|
||||
String sensorData = BME_Utils::readDataSensor();
|
||||
if (Config.wxsensor.active && wxModuleType != 0) {
|
||||
String sensorData = WX_Utils::readDataSensor();
|
||||
beaconPacket += sensorData;
|
||||
secondaryBeaconPacket += sensorData;
|
||||
} else if (Config.bme.active && wxModuleType == 0) {
|
||||
beaconPacket += ".../...g...t...r...p...P...h..b.....";
|
||||
secondaryBeaconPacket += ".../...g...t...r...p...P...h..b.....";
|
||||
} else if (Config.wxsensor.active && wxModuleType == 0) {
|
||||
beaconPacket += ".../...g...t...";
|
||||
secondaryBeaconPacket += ".../...g...t...";
|
||||
}
|
||||
beaconPacket += Config.beacon.comment;
|
||||
secondaryBeaconPacket += Config.beacon.comment;
|
||||
@@ -134,44 +211,59 @@ namespace Utils {
|
||||
#if defined(BATTERY_PIN) || defined(HAS_AXP192) || defined(HAS_AXP2101)
|
||||
if (Config.battery.sendInternalVoltage || Config.battery.monitorInternalVoltage) {
|
||||
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) {
|
||||
beaconPacket += " **IntBatWarning:SLEEP**";
|
||||
secondaryBeaconPacket += " **IntBatWarning:SLEEP**";
|
||||
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
|
||||
|
||||
if (Config.battery.sendExternalVoltage || Config.battery.monitorExternalVoltage) {
|
||||
float externalVoltage = BATTERY_Utils::checkExternalVoltage();
|
||||
String externalVoltageInfo = String(externalVoltage,2) + "V";
|
||||
if (Config.battery.sendExternalVoltage) {
|
||||
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.battery.sendVoltageAsTelemetry && !Config.wxsensor.active && (Config.battery.sendInternalVoltage || Config.battery.sendExternalVoltage)){
|
||||
String encodedTelemetry = BATTERY_Utils::generateEncodedTelemetry();
|
||||
beaconPacket += encodedTelemetry;
|
||||
secondaryBeaconPacket += encodedTelemetry;
|
||||
}
|
||||
|
||||
if (Config.aprs_is.active && Config.beacon.sendViaAPRSIS && !backUpDigiMode) {
|
||||
Utils::println("-- Sending Beacon to APRSIS --");
|
||||
displayShow(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, "SENDING IGATE BEACON", 0);
|
||||
seventhLine = " listening...";
|
||||
#ifdef HAS_A7670
|
||||
@@ -182,6 +274,7 @@ namespace Utils {
|
||||
}
|
||||
|
||||
if (Config.beacon.sendViaRF || backUpDigiMode) {
|
||||
Utils::println("-- Sending Beacon to RF --");
|
||||
displayShow(firstLine, secondLine, thirdLine, fourthLine, fifthLine, sixthLine, "SENDING DIGI BEACON", 0);
|
||||
seventhLine = " listening...";
|
||||
STATION_Utils::addToOutputPacketBuffer(secondaryBeaconPacket);
|
||||
@@ -244,7 +337,7 @@ namespace Utils {
|
||||
} else if (packet[firstColonIndex + 1] == '>') {
|
||||
sixthLine += "> NEW STATUS";
|
||||
seventhLine = seventhLineHelper;
|
||||
} else if (packet[firstColonIndex + 1] == '!' || packet[firstColonIndex + 1] == '=') {
|
||||
} else if (packet[firstColonIndex + 1] == '!' || packet[firstColonIndex + 1] == '=' || packet[firstColonIndex + 1] == '@') {
|
||||
sixthLine += "> GPS BEACON";
|
||||
if (!Config.syslog.active) {
|
||||
GPS_Utils::getDistanceAndComment(packet); // to be checked!!!
|
||||
@@ -307,12 +400,12 @@ namespace Utils {
|
||||
|
||||
void checkSleepByLowBatteryVoltage(uint8_t mode) {
|
||||
if (shouldSleepLowVoltage) {
|
||||
if (mode == 0) {
|
||||
if (mode == 0) { // at startup
|
||||
delay(3000);
|
||||
}
|
||||
Serial.println("\n\n*** Sleeping Low Battey Voltage ***\n\n");
|
||||
esp_sleep_enable_timer_wakeup(30 * 60 * 1000000); // sleep 30 min
|
||||
if (mode == 1) {
|
||||
if (mode == 1) { // low voltage detected after a while
|
||||
displayToggle(false);
|
||||
}
|
||||
#ifdef VEXT_CTRL
|
||||
|
||||
@@ -52,13 +52,13 @@ namespace WEB_Utils {
|
||||
if(Config.webadmin.active && !request->authenticate(Config.webadmin.username.c_str(), Config.webadmin.password.c_str()))
|
||||
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");
|
||||
request->send(response);
|
||||
}
|
||||
|
||||
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");
|
||||
request->send(response);
|
||||
}
|
||||
@@ -110,10 +110,10 @@ namespace WEB_Utils {
|
||||
}
|
||||
|
||||
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.passcode = request->getParam("aprs_is.passcode", true)->value();
|
||||
@@ -135,7 +135,8 @@ namespace WEB_Utils {
|
||||
Config.beacon.path = request->getParam("beacon.path", true)->value();
|
||||
|
||||
|
||||
Config.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();
|
||||
@@ -148,11 +149,11 @@ namespace WEB_Utils {
|
||||
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) {
|
||||
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);
|
||||
@@ -162,16 +163,18 @@ namespace WEB_Utils {
|
||||
Config.battery.sendExternalVoltage = request->hasParam("battery.sendExternalVoltage", true);
|
||||
if (Config.battery.sendExternalVoltage) {
|
||||
Config.battery.externalVoltagePin = request->getParam("battery.externalVoltagePin", true)->value().toInt();
|
||||
Config.battery.voltageDividerR1 = request->getParam("battery.voltageDividerR1", true)->value().toFloat();
|
||||
Config.battery.voltageDividerR2 = request->getParam("battery.voltageDividerR2", 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.monitorExternalVoltage = request->hasParam("battery.monitorExternalVoltage", true);
|
||||
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.bme.heightCorrection = request->getParam("bme.heightCorrection", true)->value().toInt();
|
||||
Config.bme.temperatureCorrection = request->getParam("bme.temperatureCorrection", true)->value().toFloat();
|
||||
if (Config.bme.active) {
|
||||
Config.wxsensor.active = request->hasParam("wxsensor.active", true);
|
||||
Config.wxsensor.heightCorrection = request->getParam("wxsensor.heightCorrection", true)->value().toInt();
|
||||
Config.wxsensor.temperatureCorrection = request->getParam("wxsensor.temperatureCorrection", true)->value().toFloat();
|
||||
if (Config.wxsensor.active) {
|
||||
Config.beacon.symbol = "_";
|
||||
}
|
||||
|
||||
@@ -230,49 +233,51 @@ namespace WEB_Utils {
|
||||
}
|
||||
|
||||
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");
|
||||
request->send(response);
|
||||
}
|
||||
|
||||
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");
|
||||
request->send(response);
|
||||
}
|
||||
|
||||
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("Cache-Control", "max-age=3600");
|
||||
request->send(response);
|
||||
}
|
||||
|
||||
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("Cache-Control", "max-age=3600");
|
||||
request->send(response);
|
||||
}
|
||||
|
||||
void setup() {
|
||||
server.on("/", HTTP_GET, handleHome);
|
||||
server.on("/status", HTTP_GET, handleStatus);
|
||||
server.on("/received-packets.json", HTTP_GET, handleReceivedPackets);
|
||||
server.on("/configuration.json", HTTP_GET, handleReadConfiguration);
|
||||
server.on("/configuration.json", HTTP_POST, handleWriteConfiguration);
|
||||
server.on("/action", HTTP_POST, handleAction);
|
||||
server.on("/style.css", HTTP_GET, handleStyle);
|
||||
server.on("/script.js", HTTP_GET, handleScript);
|
||||
server.on("/bootstrap.css", HTTP_GET, handleBootstrapStyle);
|
||||
server.on("/bootstrap.js", HTTP_GET, handleBootstrapScript);
|
||||
server.on("/favicon.png", HTTP_GET, handleFavicon);
|
||||
if (!Config.digi.ecoMode) {
|
||||
server.on("/", HTTP_GET, handleHome);
|
||||
server.on("/status", HTTP_GET, handleStatus);
|
||||
server.on("/received-packets.json", HTTP_GET, handleReceivedPackets);
|
||||
server.on("/configuration.json", HTTP_GET, handleReadConfiguration);
|
||||
server.on("/configuration.json", HTTP_POST, handleWriteConfiguration);
|
||||
server.on("/action", HTTP_POST, handleAction);
|
||||
server.on("/style.css", HTTP_GET, handleStyle);
|
||||
server.on("/script.js", HTTP_GET, handleScript);
|
||||
server.on("/bootstrap.css", HTTP_GET, handleBootstrapStyle);
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -23,33 +23,35 @@ uint32_t lastBackupDigiTime = millis();
|
||||
namespace WIFI_Utils {
|
||||
|
||||
void checkWiFi() {
|
||||
if (backUpDigiMode) {
|
||||
uint32_t WiFiCheck = millis() - lastBackupDigiTime;
|
||||
if (WiFi.status() != WL_CONNECTED && WiFiCheck >= 15 * 60 * 1000) {
|
||||
Serial.println("*** Stoping BackUp Digi Mode ***");
|
||||
backUpDigiMode = false;
|
||||
wifiCounter = 0;
|
||||
} else if (WiFi.status() == WL_CONNECTED) {
|
||||
Serial.println("*** WiFi Reconnect Success (Stoping Backup Digi Mode) ***");
|
||||
backUpDigiMode = false;
|
||||
wifiCounter = 0;
|
||||
if (!Config.digi.ecoMode) {
|
||||
if (backUpDigiMode) {
|
||||
uint32_t WiFiCheck = millis() - lastBackupDigiTime;
|
||||
if (WiFi.status() != WL_CONNECTED && WiFiCheck >= 15 * 60 * 1000) {
|
||||
Serial.println("*** Stoping BackUp Digi Mode ***");
|
||||
backUpDigiMode = false;
|
||||
wifiCounter = 0;
|
||||
} else if (WiFi.status() == WL_CONNECTED) {
|
||||
Serial.println("*** WiFi Reconnect Success (Stoping Backup Digi Mode) ***");
|
||||
backUpDigiMode = false;
|
||||
wifiCounter = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!backUpDigiMode && (WiFi.status() != WL_CONNECTED) && ((millis() - previousWiFiMillis) >= 30 * 1000) && !WiFiAutoAPStarted) {
|
||||
Serial.print(millis());
|
||||
Serial.println("Reconnecting to WiFi...");
|
||||
WiFi.disconnect();
|
||||
WIFI_Utils::startWiFi();//WiFi.reconnect();
|
||||
previousWiFiMillis = millis();
|
||||
if (!backUpDigiMode && (WiFi.status() != WL_CONNECTED) && ((millis() - previousWiFiMillis) >= 30 * 1000) && !WiFiAutoAPStarted) {
|
||||
Serial.print(millis());
|
||||
Serial.println("Reconnecting to WiFi...");
|
||||
WiFi.disconnect();
|
||||
WIFI_Utils::startWiFi();//WiFi.reconnect();
|
||||
previousWiFiMillis = millis();
|
||||
|
||||
if (Config.backupDigiMode) {
|
||||
wifiCounter++;
|
||||
}
|
||||
if (wifiCounter >= 2) {
|
||||
Serial.println("*** Starting BackUp Digi Mode ***");
|
||||
backUpDigiMode = true;
|
||||
lastBackupDigiTime = millis();
|
||||
if (Config.backupDigiMode) {
|
||||
wifiCounter++;
|
||||
}
|
||||
if (wifiCounter >= 2) {
|
||||
Serial.println("*** Starting BackUp Digi Mode ***");
|
||||
backUpDigiMode = true;
|
||||
lastBackupDigiTime = millis();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -58,7 +60,7 @@ namespace WIFI_Utils {
|
||||
WiFi.mode(WIFI_MODE_NULL);
|
||||
|
||||
WiFi.mode(WIFI_AP);
|
||||
WiFi.softAP(Config.callsign + " AP", Config.wifiAutoAP.password);
|
||||
WiFi.softAP(Config.callsign + "-AP", Config.wifiAutoAP.password);
|
||||
|
||||
WiFiAutoAPTime = millis();
|
||||
WiFiAutoAPStarted = true;
|
||||
@@ -70,6 +72,8 @@ namespace WIFI_Utils {
|
||||
startAP = true;
|
||||
} else {
|
||||
uint8_t wifiCounter = 0;
|
||||
String hostName = "iGATE-" + Config.callsign;
|
||||
WiFi.setHostname(hostName.c_str());
|
||||
WiFi.mode(WIFI_STA);
|
||||
WiFi.disconnect();
|
||||
delay(500);
|
||||
@@ -129,14 +133,14 @@ namespace WIFI_Utils {
|
||||
}
|
||||
}
|
||||
|
||||
void checkIfAutoAPShouldPowerOff() {
|
||||
if (WiFiAutoAPStarted && Config.wifiAutoAP.powerOff > 0) {
|
||||
void checkAutoAPTimeout() {
|
||||
if (WiFiAutoAPStarted && Config.wifiAutoAP.timeout > 0) {
|
||||
if (WiFi.softAPgetStationNum() > 0) {
|
||||
WiFiAutoAPTime = 0;
|
||||
} else {
|
||||
if (WiFiAutoAPTime == 0) {
|
||||
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");
|
||||
|
||||
WiFiAutoAPStarted = false;
|
||||
@@ -149,7 +153,7 @@ namespace WIFI_Utils {
|
||||
}
|
||||
|
||||
void setup() {
|
||||
startWiFi();
|
||||
if (!Config.digi.ecoMode) startWiFi();
|
||||
btStop();
|
||||
}
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ namespace WIFI_Utils {
|
||||
void checkWiFi();
|
||||
void startAutoAP();
|
||||
void startWiFi();
|
||||
void checkIfAutoAPShouldPowerOff();
|
||||
void checkAutoAPTimeout();
|
||||
void setup();
|
||||
|
||||
}
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
#include "bme_utils.h"
|
||||
#include "configuration.h"
|
||||
#include "gps_utils.h"
|
||||
#include "wx_utils.h"
|
||||
#include "display.h"
|
||||
|
||||
|
||||
#define SEALEVELPRESSURE_HPA (1013.25)
|
||||
#define CORRECTION_FACTOR (8.2296) // for meters
|
||||
|
||||
@@ -27,17 +28,17 @@ Adafruit_Si7021 sensor = Adafruit_Si7021();
|
||||
|
||||
|
||||
|
||||
namespace BME_Utils {
|
||||
namespace WX_Utils {
|
||||
|
||||
void getWxModuleAddres() {
|
||||
uint8_t err, addr;
|
||||
for(addr = 1; addr < 0x7F; addr++) {
|
||||
#if defined(HELTEC_V3) || defined(HELTEC_WSL_V3) || defined(HELTEC_WSL_V3_DISPLAY)
|
||||
Wire1.beginTransmission(addr);
|
||||
err = Wire1.endTransmission();
|
||||
Wire1.beginTransmission(addr);
|
||||
err = Wire1.endTransmission();
|
||||
#else
|
||||
Wire.beginTransmission(addr);
|
||||
err = Wire.endTransmission();
|
||||
Wire.beginTransmission(addr);
|
||||
err = Wire.endTransmission();
|
||||
#endif
|
||||
if (err == 0) {
|
||||
//Serial.println(addr); this shows any connected board to I2C
|
||||
@@ -53,7 +54,7 @@ namespace BME_Utils {
|
||||
}
|
||||
|
||||
void setup() {
|
||||
if (Config.bme.active) {
|
||||
if (Config.wxsensor.active) {
|
||||
getWxModuleAddres();
|
||||
if (wxModuleAddress != 0x00) {
|
||||
bool wxModuleFound = false;
|
||||
@@ -129,8 +130,8 @@ namespace BME_Utils {
|
||||
}
|
||||
}
|
||||
|
||||
String generateTempString(const float bmeTemp) {
|
||||
String strTemp = String((int)bmeTemp);
|
||||
String generateTempString(const float sensorTemp) {
|
||||
String strTemp = String((int)sensorTemp);
|
||||
switch (strTemp.length()) {
|
||||
case 1:
|
||||
return "00" + strTemp;
|
||||
@@ -143,15 +144,15 @@ namespace BME_Utils {
|
||||
}
|
||||
}
|
||||
|
||||
String generateHumString(const float bmeHum) {
|
||||
String strHum = String((int)bmeHum);
|
||||
String generateHumString(const float sensorHum) {
|
||||
String strHum = String((int)sensorHum);
|
||||
switch (strHum.length()) {
|
||||
case 1:
|
||||
return "0" + strHum;
|
||||
case 2:
|
||||
return strHum;
|
||||
case 3:
|
||||
if ((int)bmeHum == 100) {
|
||||
if ((int)sensorHum == 100) {
|
||||
return "00";
|
||||
} else {
|
||||
return "-99";
|
||||
@@ -161,9 +162,9 @@ namespace BME_Utils {
|
||||
}
|
||||
}
|
||||
|
||||
String generatePresString(const float bmePress) {
|
||||
String strPress = String((int)bmePress);
|
||||
String decPress = String(int((bmePress - int(bmePress)) * 10));
|
||||
String generatePresString(const float sensorPres) {
|
||||
String strPress = String((int)sensorPres);
|
||||
String decPress = String(int((sensorPres - int(sensorPres)) * 10));
|
||||
switch (strPress.length()) {
|
||||
case 1:
|
||||
return "000" + strPress + decPress;
|
||||
@@ -213,14 +214,12 @@ namespace BME_Utils {
|
||||
break;
|
||||
}
|
||||
|
||||
String wx;
|
||||
if (isnan(newTemp) || isnan(newHum) || isnan(newPress)) {
|
||||
Serial.println("BME/BMP/Si7021 Module data failed");
|
||||
wx = ".../...g...t...r...p...P...h..b.....";
|
||||
fifthLine = "";
|
||||
return wx;
|
||||
return ".../...g...t...";
|
||||
} else {
|
||||
String tempStr = generateTempString(((newTemp + Config.bme.temperatureCorrection) * 1.8) + 32);
|
||||
String tempStr = generateTempString(((newTemp + Config.wxsensor.temperatureCorrection) * 1.8) + 32);
|
||||
|
||||
String humStr;
|
||||
if (wxModuleType == 1 || wxModuleType == 3 || wxModuleType == 4) {
|
||||
@@ -233,30 +232,30 @@ namespace BME_Utils {
|
||||
if (wxModuleAddress == 4) {
|
||||
presStr = ".....";
|
||||
} else {
|
||||
presStr = generatePresString(newPress + (Config.bme.heightCorrection/CORRECTION_FACTOR));
|
||||
presStr = generatePresString(newPress + (Config.wxsensor.heightCorrection/CORRECTION_FACTOR));
|
||||
}
|
||||
|
||||
fifthLine = "BME-> ";
|
||||
fifthLine += String(int(newTemp + Config.bme.temperatureCorrection));
|
||||
fifthLine += String(int(newTemp + Config.wxsensor.temperatureCorrection));
|
||||
fifthLine += "C ";
|
||||
fifthLine += humStr;
|
||||
fifthLine += "% ";
|
||||
fifthLine += presStr.substring(0,4);
|
||||
fifthLine += "hPa";
|
||||
|
||||
wx = ".../...g...t";
|
||||
wx += tempStr;
|
||||
wx += "r...p...P...h";
|
||||
wx += humStr;
|
||||
wx += "b";
|
||||
wx += presStr;
|
||||
String wxPayload = ".../...g...t";
|
||||
wxPayload += tempStr;
|
||||
wxPayload += "h";
|
||||
wxPayload += humStr;
|
||||
wxPayload += "b";
|
||||
wxPayload += presStr;
|
||||
|
||||
if (wxModuleType == 3) {
|
||||
wx += "Gas: ";
|
||||
wx += String(newGas);
|
||||
wx += "Kohms";
|
||||
wxPayload += "Gas: ";
|
||||
wxPayload += String(newGas);
|
||||
wxPayload += "Kohms";
|
||||
}
|
||||
return wx;
|
||||
return wxPayload;
|
||||
}
|
||||
}
|
||||
|
||||
23
src/wx_utils.h
Normal file
23
src/wx_utils.h
Normal 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
|
||||
Reference in New Issue
Block a user