Compare commits

..

46 Commits

Author SHA1 Message Date
Ricardo Guzman (Richonguzman) 400b77c2d3 date update 2025-12-22 19:57:18 -03:00
Ricardo Guzman (Richonguzman) 31daddf917 invalid Passcode non blocking fix 2025-12-22 19:56:15 -03:00
Ricardo Guzman (Richonguzman) 529a44018f readme and version update 2025-12-18 09:47:56 -03:00
Ricardo Guzman (Richonguzman) 5ba9c5b382 test 2025-12-18 09:28:56 -03:00
Ricardo Guzman (Richonguzman) c7a0e3773b ina bme update 2025-12-14 05:53:43 -03:00
Ricardo Guzman (Richonguzman) a5f9e5b844 typo TCXO fix 2025-12-12 12:25:41 -03:00
Ricardo Guzman (Richonguzman) 24f407d51c TCXO add 2025-12-12 12:24:53 -03:00
Ricardo Guzman (Richonguzman) 2c6665b557 FIX for boards with GPS onboard 2025-12-11 13:44:06 -03:00
Ricardo Guzman (Richonguzman) 38f52564f1 lib def fix 2025-12-11 10:27:29 -03:00
Ricardo Guzman (Richonguzman) 49e92c622f README UPDATE for v3.1.5 manual 2025-12-07 08:46:45 -03:00
Ricardo Guzman (Richonguzman) 5370850ae1 update to fix ntp without wifi 2025-12-03 12:31:36 -03:00
Ricardo Guzman (Richonguzman) 984e9f9561 encoded telemetry fix for INA219 2025-12-01 19:53:14 -03:00
Ricardo Guzman (Richonguzman) f60252ef94 fix for same declaration of variables 2025-12-01 16:02:26 -03:00
Ricardo Guzman (Richonguzman) 63257d6329 readme update 2025-12-01 13:30:37 -03:00
Ricardo Guzman (Richonguzman) 18929ad379 INA219 final test 2025-12-01 13:29:54 -03:00
Ricardo Guzman (Richonguzman) cda901142d INA219 3 2025-12-01 12:45:14 -03:00
Ricardo Guzman (Richonguzman) 8008143267 configuration INA219 add 2025-12-01 10:55:31 -03:00
Ricardo Guzman (Richonguzman) 3416e21a8c ready radiolib excludes 2025-12-01 10:45:14 -03:00
Ricardo Guzman (Richonguzman) 5882b54c62 radiolib exclude start 2025-12-01 10:11:15 -03:00
Ricardo Guzman (Richonguzman) 6a4c0ef01a readme update 2025-12-01 09:38:37 -03:00
Ricardo Guzman (Richonguzman) 0bd3201ef7 AHT20 add 2025-12-01 09:37:02 -03:00
Ricardo Guzman (Richonguzman) b5d9103ea5 gps beacon fix 2025-11-30 10:47:12 -03:00
Ricardo Guzman (Richonguzman) 20a5029da8 index fix 2025-11-30 10:37:23 -03:00
Ricardo Guzman (Richonguzman) b3cc8af180 test update aprspacketlib 2025-11-30 10:15:01 -03:00
Ricardo Guzman (Richonguzman) ca16761f68 loadCallsignList update 2025-11-29 14:11:43 -03:00
Ricardo Guzman (Richonguzman) e593b2c670 version number update 2025-11-08 21:16:03 -03:00
Ricardo Guzman (Richonguzman) 08a7e0aac1 T-Beam Supreme Screen Fix 2025-11-08 21:13:57 -03:00
Ricardo Guzman (Richonguzman) 9b258c42ab checkValidCallsign update 2025-11-06 10:11:55 -03:00
richonguzman 8712122d33 raw images 2025-10-29 10:34:43 -03:00
richonguzman 9e34684627 update pdf y blob 2025-10-29 10:28:25 -03:00
richonguzman e4aa52241d sin gitattributes ahora 2025-10-29 10:11:18 -03:00
richonguzman c840ef01fa sin manual en github 2025-10-29 10:10:58 -03:00
richonguzman 98f85725f8 test con Vista Previa 2025-10-29 09:13:48 -03:00
richonguzman 10bde884b1 new gitattributes 2025-10-28 22:54:22 -03:00
richonguzman 546e4f63a4 update pdf to v1.4 2025-10-28 22:46:44 -03:00
Ricardo Guzman (Richonguzman) 87f2ec2b7b test new version pdf 20250128 2025-10-28 22:40:15 -03:00
Ricardo Guzman (Richonguzman) c9c7e24aae Merge pull request #356 from richonguzman/richonguzman-patch-15
Delete manual/LoRa_APRS_iGate_CA2RXU_Firmware_Manual.pdf
2025-10-28 22:38:23 -03:00
Ricardo Guzman (Richonguzman) b86133223d Delete manual/LoRa_APRS_iGate_CA2RXU_Firmware_Manual.pdf 2025-10-28 22:38:02 -03:00
richonguzman 880a41bfd8 update manual 20251028 2025-10-28 22:34:06 -03:00
richonguzman d610b3a90f mqtt beacon fix 2025-10-21 14:33:58 -03:00
richonguzman 23a33ed27c new message warning 2025-10-19 14:20:11 -03:00
richonguzman 72ef827900 new update pdf manual v314 2025-10-18 11:42:18 -03:00
richonguzman b756f97f55 v314 manual update 2025-10-18 10:50:54 -03:00
richonguzman 2625e7b91d update readme v314 2025-10-15 17:29:26 -03:00
richonguzman 75337d6c29 update to Tnc strip bytes 2025-10-15 17:12:38 -03:00
richonguzman a618383617 APRS Bridge for TNC 2025-10-15 15:11:07 -03:00
86 changed files with 531 additions and 323 deletions
+7 -4
View File
@@ -2,7 +2,7 @@
This firmware is for using ESP32 based boards with LoRa Modules and GPS to live in the APRS world. This firmware is for using ESP32 based boards with LoRa Modules and GPS to live in the APRS world.
![Screenshot](https://github.com/richonguzman/LoRa_APRS_iGate/blob/main/images/iGateOledScreen.jpeg) ![Screenshot](https://github.com/richonguzman/LoRa_APRS_iGate/raw/main/images/iGateOledScreen.jpeg)
__(This iGate Firmware works with all LoRa Tracker Firmwares (specially this <a href="https://github.com/richonguzman/LoRa_APRS_Tracker" target="_blank">LoRa APRS Tracker Firmware</a>))__ __(This iGate Firmware works with all LoRa Tracker Firmwares (specially this <a href="https://github.com/richonguzman/LoRa_APRS_Tracker" target="_blank">LoRa APRS Tracker Firmware</a>))__
<br /> <br />
@@ -12,13 +12,13 @@ ____________________________________________________
# <a href="https://richonguzman.github.io/lora-igate-web-flasher/installer.html" target="_blank">WEB FLASHER/INSTALLER</a> # <a href="https://richonguzman.github.io/lora-igate-web-flasher/installer.html" target="_blank">WEB FLASHER/INSTALLER</a>
# <a href="https://github.com/richonguzman/LoRa_APRS_iGate/blob/main/manual/LoRa_APRS_iGate_CA2RXU_Firmware_Manual.pdf" target="_blank">LoRa APRS iGate CA2RXU Firmware Manual</a> # <a href="https://drive.google.com/file/d/1Hff_Szd7ks8RC7_RiV6POxPJlclbO05M/view?usp=sharing" target="_blank">LoRa APRS iGate CA2RXU Firmware Manual</a>
____________________________________________________ ____________________________________________________
## You can support this project to continue to grow: ## You can support this project to continue to grow:
[<img src="https://github.com/richonguzman/LoRa_APRS_Tracker/blob/main/images/github-sponsors.png">](https://github.com/sponsors/richonguzman) [<img src="https://github.com/richonguzman/LoRa_APRS_Tracker/blob/main/images/paypalme.png">](http://paypal.me/richonguzman) [<img src="https://github.com/richonguzman/LoRa_APRS_Tracker/raw/main/images/github-sponsors.png">](https://github.com/sponsors/richonguzman) [<img src="https://github.com/richonguzman/LoRa_APRS_Tracker/raw/main/images/paypalme.png">](http://paypal.me/richonguzman)
____________________________________________________ ____________________________________________________
@@ -51,9 +51,12 @@ ____________________________________________________
<br /> <br />
# Timeline (Versions): # Timeline (Versions):
- 2025-12-18 TCXO and packet decoding updates.
- 2025-12-01 APRSPacketLib updates, AHT20 sensor added, INA219 support added.
- 2025-10-15 APRS Bridge for TNC added.
- 2025-10-13 Rx and Tx Frequencies are now with fully configurable. - 2025-10-13 Rx and Tx Frequencies are now with fully configurable.
- 2025-10-13 Startup Delay to allow the Router/Modem to start WiFiAP before connecting. - 2025-10-13 Startup Delay to allow the Router/Modem to start WiFiAP before connecting.
- 2025-10-12 Choose to send Beacon on Rx or Tx frequency in Digipeater Mode. - 2025-10-12 Choose to send Beacon on Rx or Tx frequency.
- 2025-10-11 User defined NTP server and send beacon over MQTT added. - 2025-10-11 User defined NTP server and send beacon over MQTT added.
- 2025-10-10 Converted the Wiki into a PDF manual. - 2025-10-10 Converted the Wiki into a PDF manual.
- 2025-09-26 Heltec Wireless Bridge support added. - 2025-09-26 Heltec Wireless Bridge support added.
+22 -21
View File
@@ -2,32 +2,33 @@
build_flags = build_flags =
-Werror -Wall -Werror -Wall
-DELEGANTOTA_USE_ASYNC_WEBSERVER=1 -DELEGANTOTA_USE_ASYNC_WEBSERVER=1
-DRADIOLIB_EXCLUDE_CC1101=1 -D RADIOLIB_EXCLUDE_CC1101=1
-DRADIOLIB_EXCLUDE_NRF24=1 -D RADIOLIB_EXCLUDE_RF69=1
-DRADIOLIB_EXCLUDE_RF69=1 -D RADIOLIB_EXCLUDE_RFM2X=1
-DRADIOLIB_EXCLUDE_SX1231=1 -D RADIOLIB_EXCLUDE_SX1231=1
-DRADIOLIB_EXCLUDE_SX1233=1 -D RADIOLIB_EXCLUDE_SX1233=1
-DRADIOLIB_EXCLUDE_SI443X=1 -D RADIOLIB_EXCLUDE_SI443X=1
-DRADIOLIB_EXCLUDE_RFM2X=1 -D RADIOLIB_EXCLUDE_NRF24=1
-DRADIOLIB_EXCLUDE_AFSK=1 -D RADIOLIB_EXCLUDE_AFSK=1
-DRADIOLIB_EXCLUDE_BELL=1 -D RADIOLIB_EXCLUDE_APRS=1
-DRADIOLIB_EXCLUDE_HELLSCHREIBER=1 -D RADIOLIB_EXCLUDE_AX25=1
-DRADIOLIB_EXCLUDE_MORSE=1 -D RADIOLIB_EXCLUDE_BELL=1
-DRADIOLIB_EXCLUDE_RTTY=1 -D RADIOLIB_EXCLUDE_FSK4=1
-DRADIOLIB_EXCLUDE_SSTV=1 -D RADIOLIB_EXCLUDE_HELLSCHREIBER=1
-DRADIOLIB_EXCLUDE_AX25=1 -D RADIOLIB_EXCLUDE_LORAWAN=1
-DRADIOLIB_EXCLUDE_DIRECT_RECEIVE=1 -D RADIOLIB_EXCLUDE_MORSE=1
-DRADIOLIB_EXCLUDE_BELL=1 -D RADIOLIB_EXCLUDE_PAGER=1
-DRADIOLIB_EXCLUDE_PAGER=1 -D RADIOLIB_EXCLUDE_DIRECT_RECEIVE=1
-DRADIOLIB_EXCLUDE_FSK4=1 -D RADIOLIB_EXCLUDE_RTTY=1
-DRADIOLIB_EXCLUDE_APRS=1 -D RADIOLIB_EXCLUDE_SSTV=1
-DRADIOLIB_EXCLUDE_LORAWAN=1
-I variants/${PIOENV} -I variants/${PIOENV}
lib_deps = lib_deps =
adafruit/Adafruit Unified Sensor @ 1.1.14 adafruit/Adafruit Unified Sensor @ 1.1.14
adafruit/Adafruit AHTX0 @ 2.0.5
adafruit/Adafruit BME280 Library @ 2.2.4 adafruit/Adafruit BME280 Library @ 2.2.4
adafruit/Adafruit BMP280 Library @ 2.6.8 adafruit/Adafruit BMP280 Library @ 2.6.8
adafruit/Adafruit BME680 Library @ 2.0.4 adafruit/Adafruit BME680 Library @ 2.0.4
adafruit/Adafruit INA219 @ 1.2.3
adafruit/Adafruit Si7021 Library @ 1.5.3 adafruit/Adafruit Si7021 Library @ 1.5.3
arduino-libraries/NTPClient @ 3.2.1 arduino-libraries/NTPClient @ 3.2.1
ayushsharma82/ElegantOTA @ 3.1.5 ayushsharma82/ElegantOTA @ 3.1.5
@@ -37,7 +38,7 @@ lib_deps =
mathieucarbou/AsyncTCP @ 3.2.5 mathieucarbou/AsyncTCP @ 3.2.5
mathieucarbou/ESPAsyncWebServer @ 3.2.3 mathieucarbou/ESPAsyncWebServer @ 3.2.3
mikalhart/TinyGPSPlus @ 1.0.3 mikalhart/TinyGPSPlus @ 1.0.3
richonguzman/APRSPacketLib @1.0.0 richonguzman/APRSPacketLib @ 1.0.4
display_libs = display_libs =
adafruit/Adafruit GFX Library @ 1.11.9 adafruit/Adafruit GFX Library @ 1.11.9
adafruit/Adafruit SSD1306 @ 2.5.10 adafruit/Adafruit SSD1306 @ 2.5.10
+5 -3
View File
@@ -21,7 +21,7 @@
"statusActive": false, "statusActive": false,
"statusPacket": "", "statusPacket": "",
"gpsActive": false, "gpsActive": false,
"gpsAmbiguity": false "ambiguityLevel": 0
}, },
"aprs_is": { "aprs_is": {
"active": false, "active": false,
@@ -61,11 +61,12 @@
"monitorInternalVoltage": false, "monitorInternalVoltage": false,
"internalSleepVoltage": 2.9, "internalSleepVoltage": 2.9,
"sendExternalVoltage": false, "sendExternalVoltage": false,
"externalVoltagePin": 34,
"monitorExternalVoltage": false, "monitorExternalVoltage": false,
"externalSleepVoltage": 10.9, "externalSleepVoltage": 10.9,
"useExternalI2CSensor": false,
"voltageDividerR1": 100.0, "voltageDividerR1": 100.0,
"voltageDividerR2": 27.0, "voltageDividerR2": 27.0,
"externalVoltagePin": 34,
"sendVoltageAsTelemetry": false "sendVoltageAsTelemetry": false
}, },
"wxsensor": { "wxsensor": {
@@ -82,7 +83,8 @@
"tnc": { "tnc": {
"enableServer": false, "enableServer": false,
"enableSerial": false, "enableSerial": false,
"acceptOwn": false "acceptOwn": false,
"aprsBrigdeActive": false
}, },
"mqtt": { "mqtt": {
"active": false, "active": false,
+80 -75
View File
@@ -144,8 +144,7 @@
name="beacon.comment" name="beacon.comment"
id="beacon.comment" id="beacon.comment"
class="form-control" class="form-control"
placeholder="LoRa APRS" placeholder=""
required=""
/> />
</div> </div>
<div class="col-12 mt-3"> <div class="col-12 mt-3">
@@ -189,18 +188,10 @@
name="action.symbol" name="action.symbol"
id="action.symbol" id="action.symbol"
> >
<option value="L#"> <option value="L#">Green star with L</option>
Green star with L <option value="L_">Blue circle with L</option>
</option> <option value="L&">Black diamond with L</option>
<option value="L_"> <option value="La" selected>Red diamond with L</option>
Blue circle with L
</option>
<option value="L&">
Black diamond with L
</option>
<option value="La">
Red diamond with L
</option>
</select> </select>
</div> </div>
<div <div
@@ -583,12 +574,8 @@
name="beacon.beaconFreq" name="beacon.beaconFreq"
id="beacon.beaconFreq" id="beacon.beaconFreq"
> >
<option value="0"> <option value="0">Beacon on Rx Freq</option>
Beacon on Rx Freq <option value="1">Beacon on Tx Freq</option>
</option>
<option value="1">
Beacon on Tx Freq
</option>
</select> </select>
</div> </div>
</div> </div>
@@ -615,6 +602,23 @@
</span> </span>
</div> </div>
</div> </div>
<div class="col-6">
<label
for="beacon.ambiguityLevel"
class="form-label"
>APRS Position Ambiguity</label
>
<select
class="form-select form-select"
name="beacon.ambiguityLevel"
id="beacon.ambiguityLevel"
>
<option value="0" selected>No Ambiguity</option>
<option value="1">~110 m forced Ambiguity</option>
<option value="2">~1.1 km forced Ambiguity</option>
<option value="3">~11 km forced Ambiguity</option>
</select>
</div>
</div> </div>
<div class="col-12 mt-3"> <div class="col-12 mt-3">
<div class="form-check form-switch"> <div class="form-check form-switch">
@@ -631,21 +635,6 @@
</label> </label>
</div> </div>
</div> </div>
<div class="col-12">
<div class="form-check form-switch">
<input
type="checkbox"
name="beacon.gpsAmbiguity"
id="beacon.gpsAmbiguity"
class="form-check-input"
/>
<label
for="beacon.gpsAmbiguity"
class="form-label"
>Send Real-GPS Beacon with Ambiguity <small>(~ 1 Km of Random Error)</small>
</label>
</div>
</div>
</div> </div>
</div> </div>
<hr> <hr>
@@ -667,7 +656,7 @@
</svg> </svg>
Black List Black List
</h5> </h5>
<small>Add Callsigns with space between them to Blacklist them (* wild card allowed)</small> <small>Add Callsigns with space between them to Blacklist (* wildcard allowed)</small>
</div> </div>
<div class="col-9"> <div class="col-9">
<div class="row"> <div class="row">
@@ -723,15 +712,9 @@
name="digi.mode" name="digi.mode"
id="digi.mode" id="digi.mode"
> >
<option value="0"> <option value="0" selected>OFF</option>
OFF <option value="2">WIDE1 (fill-in) Digi</option>
</option> <option value="3">WIDE2 (+WIDE1) Digi</option>
<option value="2">
WIDE1 (fill-in) Digi
</option>
<option value="3">
WIDE2 (+WIDE1) Digi
</option>
</select> </select>
</div> </div>
<div class="col-12 mt-3"> <div class="col-12 mt-3">
@@ -748,15 +731,9 @@
name="digi.ecoMode" name="digi.ecoMode"
id="digi.ecoMode" id="digi.ecoMode"
> >
<option value="0"> <option value="0" selected>OFF (Normal Mode - WiFiAP and Serial Output enabled)</option>
OFF (Normal Mode - WiFiAP and Serial Output enabled) <option value="1">Ultra Eco Mode (Sleep till Packet Rx (WiFiAP/WebUI & Display disabled))</option>
</option> <option value="2">OFF (Normal Mode - WiFiAP disabled but Serial Output still enabled)</option>
<option value="1">
Ultra Eco Mode (Sleep till Packet Rx (WiFiAP/WebUI & Display disabled))
</option>
<option value="2">
OFF (Normal Mode - WiFiAP disabled but Serial Output still enabled)
</option>
</select> </select>
</div> </div>
</div> </div>
@@ -1219,7 +1196,20 @@
>Send External Voltage</label >Send External Voltage</label
> >
</div> </div>
<div class="form-check form-switch mt-5"> <div class="form-check form-switch">
<input
type="checkbox"
name="battery.useExternalI2CSensor"
id="battery.useExternalI2CSensor"
class="form-check-input"
/>
<label
for="battery.useExternalI2CSensor"
class="form-label"
>Use External I2C Voltage Sensor</label
>
</div>
<div class="form-check form-switch">
<input <input
type="checkbox" type="checkbox"
name="battery.monitorExternalVoltage" name="battery.monitorExternalVoltage"
@@ -1511,25 +1501,7 @@
</div> </div>
<div class="col-lg-9 col-sm-12"> <div class="col-lg-9 col-sm-12">
<div class="row"> <div class="row">
<div class="col-12"> <div class="col-6">
<div class="form-check form-switch">
<div class="form-text">
Server will be available at port <strong>8001</strong>
</div>
<input
type="checkbox"
name="tnc.enableServer"
id="tnc.enableServer"
class="form-check-input"
/>
<label
for="tnc.enableServer"
class="form-label"
>Enable TNC server</label
>
</div>
</div>
<div class="col-12">
<div class="form-check form-switch"> <div class="form-check form-switch">
<input <input
type="checkbox" type="checkbox"
@@ -1544,7 +1516,24 @@
> >
</div> </div>
</div> </div>
<div class="col-12"> <div class="col-6">
<div class="form-check form-switch">
<input
type="checkbox"
name="tnc.enableServer"
id="tnc.enableServer"
class="form-check-input"
/>
<label
for="tnc.enableServer"
class="form-label"
>Enable TNC server <small><strong>(Port 8001)</strong></small></label
>
</div>
</div>
</div>
<div class="row mt-2">
<div class="col-6">
<div class="form-check form-switch"> <div class="form-check form-switch">
<input <input
type="checkbox" type="checkbox"
@@ -1559,6 +1548,21 @@
> >
</div> </div>
</div> </div>
<div class="col-6">
<div class="form-check form-switch">
<input
type="checkbox"
name="tnc.aprsBridgeActive"
id="tnc.aprsBridgeActive"
class="form-check-input"
/>
<label
for="tnc.aprsBridgeActive"
class="form-label"
>Enable APRS Bridge</label
>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
@@ -2018,6 +2022,7 @@
name="remoteManagement.managers" name="remoteManagement.managers"
id="remoteManagement.managers" id="remoteManagement.managers"
class="form-control" class="form-control"
oninput="this.value = this.value.toUpperCase();"
/> />
</div> </div>
</div> </div>
+26 -14
View File
@@ -131,7 +131,7 @@ function loadSettings(settings) {
StatusPacket.disabled = !StatusCheckbox.checked; StatusPacket.disabled = !StatusCheckbox.checked;
document.getElementById("beacon.gpsActive").checked = settings.beacon.gpsActive; document.getElementById("beacon.gpsActive").checked = settings.beacon.gpsActive;
document.getElementById("beacon.gpsAmbiguity").checked = settings.beacon.gpsAmbiguity; document.getElementById("beacon.ambiguityLevel").value = settings.beacon.ambiguityLevel;
// Black List // Black List
document.getElementById("blacklist").value = settings.blacklist; document.getElementById("blacklist").value = settings.blacklist;
@@ -168,13 +168,16 @@ function loadSettings(settings) {
MonitorInternalSleepVoltage.disabled = !MonitorInternalVoltageCheckbox.checked; MonitorInternalSleepVoltage.disabled = !MonitorInternalVoltageCheckbox.checked;
document.getElementById("battery.sendExternalVoltage").checked = settings.battery.sendExternalVoltage; document.getElementById("battery.sendExternalVoltage").checked = settings.battery.sendExternalVoltage;
document.getElementById("battery.useExternalI2CSensor").checked = settings.battery.useExternalI2CSensor;
document.getElementById("battery.externalVoltagePin").value = settings.battery.externalVoltagePin; document.getElementById("battery.externalVoltagePin").value = settings.battery.externalVoltagePin;
document.getElementById("battery.voltageDividerR1").value = settings.battery.voltageDividerR1.toFixed(1); document.getElementById("battery.voltageDividerR1").value = settings.battery.voltageDividerR1.toFixed(1);
document.getElementById("battery.voltageDividerR2").value = settings.battery.voltageDividerR2.toFixed(1); document.getElementById("battery.voltageDividerR2").value = settings.battery.voltageDividerR2.toFixed(1);
SendExternalVoltageCheckbox.checked = settings.battery.sendExternalVoltage; SendExternalVoltageCheckbox.checked = settings.battery.sendExternalVoltage;
ExternalVoltagePin.disabled = !SendExternalVoltageCheckbox.checked; UseExternalI2CSensorCheckbox.disabled = !SendExternalVoltageCheckbox.checked;
ExternalVoltageDividerR1.disabled = !SendExternalVoltageCheckbox.checked; ExternalVoltagePin.disabled = !SendExternalVoltageCheckbox.checked || UseExternalI2CSensorCheckbox.checked;
ExternalVoltageDividerR2.disabled = !SendExternalVoltageCheckbox.checked; ExternalVoltageDividerR1.disabled = !SendExternalVoltageCheckbox.checked || UseExternalI2CSensorCheckbox.checked;
ExternalVoltageDividerR2.disabled = !SendExternalVoltageCheckbox.checked || UseExternalI2CSensorCheckbox.checked;
document.getElementById("battery.monitorExternalVoltage").checked = settings.battery.monitorExternalVoltage; document.getElementById("battery.monitorExternalVoltage").checked = settings.battery.monitorExternalVoltage;
document.getElementById("battery.externalSleepVoltage").value = settings.battery.externalSleepVoltage.toFixed(1); document.getElementById("battery.externalSleepVoltage").value = settings.battery.externalSleepVoltage.toFixed(1);
@@ -206,6 +209,7 @@ function loadSettings(settings) {
document.getElementById("tnc.enableServer").checked = settings.tnc.enableServer; document.getElementById("tnc.enableServer").checked = settings.tnc.enableServer;
document.getElementById("tnc.enableSerial").checked = settings.tnc.enableSerial; document.getElementById("tnc.enableSerial").checked = settings.tnc.enableSerial;
document.getElementById("tnc.acceptOwn").checked = settings.tnc.acceptOwn; document.getElementById("tnc.acceptOwn").checked = settings.tnc.acceptOwn;
document.getElementById("tnc.aprsBridgeActive").checked = settings.tnc.aprsBridgeActive;
} }
// MQTT // MQTT
@@ -215,14 +219,14 @@ function loadSettings(settings) {
document.getElementById("mqtt.username").value = settings.mqtt.username; document.getElementById("mqtt.username").value = settings.mqtt.username;
document.getElementById("mqtt.password").value = settings.mqtt.password; document.getElementById("mqtt.password").value = settings.mqtt.password;
document.getElementById("mqtt.port").value = settings.mqtt.port; document.getElementById("mqtt.port").value = settings.mqtt.port;
document.getElementById("mqtt.beaconOverMqtt").value = settings.mqtt.beaconOverMqtt; document.getElementById("mqtt.beaconOverMqtt").checked = settings.mqtt.beaconOverMqtt;
MqttCheckbox.checked = settings.mqtt.active; MqttCheckbox.checked = settings.mqtt.active;
MqttServer.disabled = !MqttCheckbox.check; MqttServer.disabled = !MqttCheckbox.checked;
MqttTopic.disabled = !MqttCheckbox.check; MqttTopic.disabled = !MqttCheckbox.checked;
MqttUsername.disabled = !MqttCheckbox.check; MqttUsername.disabled = !MqttCheckbox.checked;
MqttPassword.disabled = !MqttCheckbox.check; MqttPassword.disabled = !MqttCheckbox.checked;
MqttPort.disabled = !MqttCheckbox.check; MqttPort.disabled = !MqttCheckbox.checked;
MqttBeaconOverMqtt.disabled = !MqttCheckbox.check; MqttBeaconOverMqtt.disabled = !MqttCheckbox.checked;
// Reboot // Reboot
document.getElementById("other.rebootMode").checked = settings.other.rebootMode; document.getElementById("other.rebootMode").checked = settings.other.rebootMode;
@@ -359,13 +363,21 @@ MonitorExternalVoltageCheckbox.addEventListener("change", function () {
MonitorExternalSleepVoltage.disabled = !this.checked; MonitorExternalSleepVoltage.disabled = !this.checked;
}); });
const SendExternalVoltageCheckbox = document.querySelector('input[name="battery.sendExternalVoltage"]'); const SendExternalVoltageCheckbox = document.querySelector('input[name="battery.sendExternalVoltage"]');
const UseExternalI2CSensorCheckbox = document.querySelector('input[name="battery.useExternalI2CSensor"]');
const ExternalVoltagePin = document.querySelector('input[name="battery.externalVoltagePin"]'); const ExternalVoltagePin = document.querySelector('input[name="battery.externalVoltagePin"]');
const ExternalVoltageDividerR1 = document.querySelector('input[name="battery.voltageDividerR1"]'); const ExternalVoltageDividerR1 = document.querySelector('input[name="battery.voltageDividerR1"]');
const ExternalVoltageDividerR2 = document.querySelector('input[name="battery.voltageDividerR2"]'); const ExternalVoltageDividerR2 = document.querySelector('input[name="battery.voltageDividerR2"]');
SendExternalVoltageCheckbox.addEventListener("change", function () { SendExternalVoltageCheckbox.addEventListener("change", function () {
ExternalVoltagePin.disabled = !this.checked; UseExternalI2CSensorCheckbox.disabled = !this.checked;
ExternalVoltageDividerR1.disabled = !this.checked; ExternalVoltagePin.disabled = !this.checked || UseExternalI2CSensorCheckbox.checked;
ExternalVoltageDividerR2.disabled = !this.checked; ExternalVoltageDividerR1.disabled = !this.checked || UseExternalI2CSensorCheckbox.checked;
ExternalVoltageDividerR2.disabled = !this.checked || UseExternalI2CSensorCheckbox.checked;
});
UseExternalI2CSensorCheckbox.addEventListener("change", function () {
ExternalVoltagePin.disabled = this.checked;
ExternalVoltageDividerR1.disabled = this.checked;
ExternalVoltageDividerR2.disabled = this.checked;
}); });
// Telemetry Switches // Telemetry Switches
+3 -1
View File
@@ -51,7 +51,7 @@ public:
bool statusActive; bool statusActive;
String statusPacket; String statusPacket;
bool gpsActive; bool gpsActive;
bool gpsAmbiguity; int ambiguityLevel;
}; };
class APRS_IS { class APRS_IS {
@@ -102,6 +102,7 @@ public:
int externalVoltagePin; int externalVoltagePin;
bool monitorExternalVoltage; bool monitorExternalVoltage;
float externalSleepVoltage; float externalSleepVoltage;
bool useExternalI2CSensor;
float voltageDividerR1; float voltageDividerR1;
float voltageDividerR2; float voltageDividerR2;
bool sendVoltageAsTelemetry; bool sendVoltageAsTelemetry;
@@ -127,6 +128,7 @@ public:
bool enableServer; bool enableServer;
bool enableSerial; bool enableSerial;
bool acceptOwn; bool acceptOwn;
bool aprsBridgeActive;
}; };
class OTA { class OTA {
+2 -2
View File
@@ -27,8 +27,8 @@ namespace TNC_Utils {
void setup(); void setup();
void loop(); void loop();
void sendToClients(const String& packet); void sendToClients(const String& packet, bool stripBytes = false);
void sendToSerial(const String& packet); void sendToSerial(const String& packet, bool stripBytes = false);
} }
+1
View File
@@ -20,6 +20,7 @@
#define WX_UTILS_H_ #define WX_UTILS_H_
#include <Adafruit_Sensor.h> #include <Adafruit_Sensor.h>
#include <Adafruit_AHTX0.h>
#include <Adafruit_BME280.h> #include <Adafruit_BME280.h>
#include <Adafruit_BMP280.h> #include <Adafruit_BMP280.h>
#include <Adafruit_BME680.h> #include <Adafruit_BME680.h>
Binary file not shown.
+5 -5
View File
@@ -67,8 +67,8 @@ ___________________________________________________________________*/
#endif #endif
String versionDate = "2025-10-15"; String versionDate = "2025-12-22";
String versionNumber = "3.1.4"; String versionNumber = "3.1.6.1";
Configuration Config; Configuration Config;
WiFiClient aprsIsClient; WiFiClient aprsIsClient;
WiFiClient mqttClient; WiFiClient mqttClient;
@@ -192,9 +192,9 @@ void loop() {
DIGI_Utils::processLoRaPacket(packet); // Send received packet to Digi DIGI_Utils::processLoRaPacket(packet); // Send received packet to Digi
} }
if (Config.tnc.enableServer) TNC_Utils::sendToClients(packet); // Send received packet to TNC KISS if (Config.tnc.enableServer) TNC_Utils::sendToClients(packet, true); // Send received packet to TNC KISS
if (Config.tnc.enableSerial) TNC_Utils::sendToSerial(packet); // Send received packet to Serial KISS if (Config.tnc.enableSerial) TNC_Utils::sendToSerial(packet, true); // Send received packet to Serial KISS
if (Config.mqtt.active) MQTT_Utils::sendToMqtt(packet); // Send received packet to MQTT if (Config.mqtt.active) MQTT_Utils::sendToMqtt(packet); // Send received packet to MQTT
} }
if (Config.aprs_is.active) APRS_IS_Utils::listenAPRSIS(); // listen received packet from APRSIS if (Config.aprs_is.active) APRS_IS_Utils::listenAPRSIS(); // listen received packet from APRSIS
+10 -8
View File
@@ -16,6 +16,7 @@
* along with LoRa APRS iGate. If not, see <https://www.gnu.org/licenses/>. * along with LoRa APRS iGate. If not, see <https://www.gnu.org/licenses/>.
*/ */
#include <APRSPacketLib.h>
#include <WiFi.h> #include <WiFi.h>
#include "configuration.h" #include "configuration.h"
#include "aprs_is_utils.h" #include "aprs_is_utils.h"
@@ -25,6 +26,7 @@
#include "query_utils.h" #include "query_utils.h"
#include "A7670_utils.h" #include "A7670_utils.h"
#include "digi_utils.h" #include "digi_utils.h"
#include "tnc_utils.h"
#include "display.h" #include "display.h"
#include "utils.h" #include "utils.h"
@@ -235,12 +237,7 @@ namespace APRS_IS_Utils {
String buildPacketToTx(const String& aprsisPacket, uint8_t packetType) { String buildPacketToTx(const String& aprsisPacket, uint8_t packetType) {
String packet = aprsisPacket; String packet = aprsisPacket;
packet.trim(); packet.trim();
String outputPacket = Config.callsign; String outputPacket = APRSPacketLib::generateBasePacket(Config.callsign, "APLRG1", Config.beacon.path);
outputPacket += ">APLRG1";
if (Config.beacon.path != "") {
outputPacket += ",";
outputPacket += Config.beacon.path;
}
outputPacket += ":}"; outputPacket += ":}";
outputPacket += packet.substring(0, packet.indexOf(",")); // Callsign>Tocall outputPacket += packet.substring(0, packet.indexOf(",")); // Callsign>Tocall
outputPacket.concat(",TCPIP,"); outputPacket.concat(",TCPIP,");
@@ -281,8 +278,9 @@ namespace APRS_IS_Utils {
if (!passcodeValid && packet.indexOf(Config.callsign) != -1) { if (!passcodeValid && packet.indexOf(Config.callsign) != -1) {
if (packet.indexOf("unverified") != -1 ) { if (packet.indexOf("unverified") != -1 ) {
Serial.println("\n****APRS PASSCODE NOT VALID****\n"); Serial.println("\n****APRS PASSCODE NOT VALID****\n");
displayShow(firstLine, "", " APRS PASSCODE", " NOT VALID !!!", "", "", "", 0); displayShow(firstLine, "", " APRS PASSCODE", " NOT VALID !!!", "", "", "", 3000);
while (1) {}; aprsIsClient.stop();
Config.aprs_is.active = false;
} else if (packet.indexOf("verified") != -1 ) { } else if (packet.indexOf("verified") != -1 ) {
passcodeValid = true; passcodeValid = true;
} }
@@ -367,6 +365,10 @@ namespace APRS_IS_Utils {
Serial.println(" ---> Rejected (Time): No Tx"); Serial.println(" ---> Rejected (Time): No Tx");
} }
} }
if (Config.tnc.aprsBridgeActive) {
if (Config.tnc.enableServer) TNC_Utils::sendToClients(packet); // Send received packet to TNC KISS
if (Config.tnc.enableSerial) TNC_Utils::sendToSerial(packet); // Send received packet to Serial KISS
}
} }
} }
+74 -26
View File
@@ -16,7 +16,7 @@
* along with LoRa APRS iGate. If not, see <https://www.gnu.org/licenses/>. * along with LoRa APRS iGate. If not, see <https://www.gnu.org/licenses/>.
*/ */
#include <Arduino.h> #include <Adafruit_INA219.h>
#include "battery_utils.h" #include "battery_utils.h"
#include "configuration.h" #include "configuration.h"
#include "board_pinout.h" #include "board_pinout.h"
@@ -37,6 +37,10 @@ float multiplyCorrection = 0.035;
float voltageDividerTransformation = 0.0; float voltageDividerTransformation = 0.0;
uint8_t externalI2CSensorAddress = 0x00;
int externalI2CSensorType = 0; // 0 = None | 1 = INA219
Adafruit_INA219 ina219;
#ifdef HAS_ADC_CALIBRATION #ifdef HAS_ADC_CALIBRATION
@@ -98,6 +102,30 @@ namespace BATTERY_Utils {
#endif #endif
} }
void getI2CVoltageSensorAddress() {
uint8_t err, addr;
for(addr = 1; addr < 0x7F; addr++) {
#if defined(HELTEC_V3) || defined(HELTEC_V3_2) || defined(HELTEC_WSL_V3) || defined(HELTEC_WSL_V3_DISPLAY)
Wire1.beginTransmission(addr);
err = Wire1.endTransmission();
#else
Wire.beginTransmission(addr);
err = Wire.endTransmission();
#endif
delay(5);
if (err == 0) {
if (addr == 0x40) { // INA219
externalI2CSensorAddress = addr;
}
}
}
}
bool detectINA219(uint8_t addr) {
ina219 = Adafruit_INA219(addr);
return ina219.begin();
}
void setup() { void setup() {
if ((Config.battery.sendExternalVoltage || Config.battery.monitorExternalVoltage) && Config.battery.voltageDividerR2 != 0) voltageDividerTransformation = (Config.battery.voltageDividerR1 + Config.battery.voltageDividerR2) / Config.battery.voltageDividerR2; if ((Config.battery.sendExternalVoltage || Config.battery.monitorExternalVoltage) && Config.battery.voltageDividerR2 != 0) voltageDividerTransformation = (Config.battery.voltageDividerR1 + Config.battery.voltageDividerR2) / Config.battery.voltageDividerR2;
@@ -107,6 +135,14 @@ namespace BATTERY_Utils {
adcCalibration(); adcCalibration();
} }
#endif #endif
getI2CVoltageSensorAddress();
if (externalI2CSensorAddress != 0x00) {
if (detectINA219(externalI2CSensorAddress)) {
Serial.println("INA219 sensor found");
externalI2CSensorType = 1; // INA219
}
}
} }
float checkInternalVoltage() { float checkInternalVoltage() {
@@ -177,37 +213,49 @@ namespace BATTERY_Utils {
} }
float checkExternalVoltage() { float checkExternalVoltage() {
int sample; if (externalI2CSensorType == 0) {
int sampleSum = 0; int sample;
for (int i = 0; i < 100; i++) { int sampleSum = 0;
#ifdef HAS_ADC_CALIBRATION for (int i = 0; i < 100; i++) {
if (calibrationEnable){ #ifdef HAS_ADC_CALIBRATION
sample = adc1_get_raw(ExternalVoltage_ADC_Channel); if (calibrationEnable){
} else { sample = adc1_get_raw(ExternalVoltage_ADC_Channel);
} else {
sample = analogRead(Config.battery.externalVoltagePin);
}
#else
sample = analogRead(Config.battery.externalVoltagePin); sample = analogRead(Config.battery.externalVoltagePin);
#endif
sampleSum += sample;
delayMicroseconds(50);
}
float extVoltage;
#ifdef HAS_ADC_CALIBRATION
if (calibrationEnable) {
extVoltage = esp_adc_cal_raw_to_voltage(sampleSum / 100.0, &adc_chars) * voltageDividerTransformation; // in mV
extVoltage /= 1000.0;
} else {
extVoltage = ((((sampleSum/100.0)* adcReadingTransformation) + readingCorrection) * voltageDividerTransformation) - multiplyCorrection;
} }
#else #else
sample = analogRead(Config.battery.externalVoltagePin); extVoltage = ((((sampleSum/100.0)* adcReadingTransformation) + readingCorrection) * voltageDividerTransformation) - multiplyCorrection;
#endif #endif
sampleSum += sample;
delayMicroseconds(50); return extVoltage; // raw voltage without mapping
}
float extVoltage; // return mapVoltage(voltage, 5.05, 6.32, 4.5, 5.5); // mapped voltage
#ifdef HAS_ADC_CALIBRATION } else if (externalI2CSensorType == 1) { // INA219
if (calibrationEnable){ int sampleSum = 0;
extVoltage = esp_adc_cal_raw_to_voltage(sampleSum / 100, &adc_chars) * voltageDividerTransformation; // in mV for (int i = 0; i < 100; i++) {
extVoltage /= 1000; sampleSum += ina219.getBusVoltage_V() * 1000.0;
} else { delayMicroseconds(50);
extVoltage = ((((sampleSum/100)* adcReadingTransformation) + readingCorrection) * voltageDividerTransformation) - multiplyCorrection;
} }
#else float extVoltage = sampleSum/100.0;
extVoltage = ((((sampleSum/100)* adcReadingTransformation) + readingCorrection) * voltageDividerTransformation) - multiplyCorrection; return extVoltage/1000.0;
#endif } else {
return 0.0;
return extVoltage; // raw voltage without mapping }
// return mapVoltage(voltage, 5.05, 6.32, 4.5, 5.5); // mapped voltage
} }
void startupBatteryHealth() { void startupBatteryHealth() {
+18 -10
View File
@@ -78,7 +78,7 @@ bool Configuration::writeFile() {
data["beacon"]["statusPacket"] = beacon.statusPacket; data["beacon"]["statusPacket"] = beacon.statusPacket;
data["beacon"]["gpsActive"] = beacon.gpsActive; data["beacon"]["gpsActive"] = beacon.gpsActive;
data["beacon"]["gpsAmbiguity"] = beacon.gpsAmbiguity; data["beacon"]["ambiguityLevel"] = beacon.ambiguityLevel;
data["personalNote"] = personalNote; data["personalNote"] = personalNote;
@@ -111,11 +111,12 @@ bool Configuration::writeFile() {
data["battery"]["internalSleepVoltage"] = battery.internalSleepVoltage; data["battery"]["internalSleepVoltage"] = battery.internalSleepVoltage;
data["battery"]["sendExternalVoltage"] = battery.sendExternalVoltage; data["battery"]["sendExternalVoltage"] = battery.sendExternalVoltage;
data["battery"]["externalVoltagePin"] = battery.externalVoltagePin;
data["battery"]["monitorExternalVoltage"] = battery.monitorExternalVoltage; data["battery"]["monitorExternalVoltage"] = battery.monitorExternalVoltage;
data["battery"]["externalSleepVoltage"] = battery.externalSleepVoltage; data["battery"]["externalSleepVoltage"] = battery.externalSleepVoltage;
data["battery"]["useExternalI2CSensor"] = battery.useExternalI2CSensor;
data["battery"]["voltageDividerR1"] = battery.voltageDividerR1; data["battery"]["voltageDividerR1"] = battery.voltageDividerR1;
data["battery"]["voltageDividerR2"] = battery.voltageDividerR2; data["battery"]["voltageDividerR2"] = battery.voltageDividerR2;
data["battery"]["externalVoltagePin"] = battery.externalVoltagePin;
data["battery"]["sendVoltageAsTelemetry"] = battery.sendVoltageAsTelemetry; data["battery"]["sendVoltageAsTelemetry"] = battery.sendVoltageAsTelemetry;
@@ -131,6 +132,7 @@ bool Configuration::writeFile() {
data["tnc"]["enableServer"] = tnc.enableServer; data["tnc"]["enableServer"] = tnc.enableServer;
data["tnc"]["enableSerial"] = tnc.enableSerial; data["tnc"]["enableSerial"] = tnc.enableSerial;
data["tnc"]["acceptOwn"] = tnc.acceptOwn; data["tnc"]["acceptOwn"] = tnc.acceptOwn;
data["tnc"]["aprsBridgeActive"] = tnc.aprsBridgeActive;
data["mqtt"]["active"] = mqtt.active; data["mqtt"]["active"] = mqtt.active;
data["mqtt"]["server"] = mqtt.server; data["mqtt"]["server"] = mqtt.server;
@@ -231,7 +233,7 @@ bool Configuration::readFile() {
!data["beacon"].containsKey("statusActive") || !data["beacon"].containsKey("statusActive") ||
!data["beacon"].containsKey("statusPacket") || !data["beacon"].containsKey("statusPacket") ||
!data["beacon"].containsKey("gpsActive") || !data["beacon"].containsKey("gpsActive") ||
!data["beacon"].containsKey("gpsAmbiguity")) needsRewrite = true; !data["beacon"].containsKey("ambiguityLevel")) needsRewrite = true;
beacon.latitude = data["beacon"]["latitude"] | 0.0; beacon.latitude = data["beacon"]["latitude"] | 0.0;
beacon.longitude = data["beacon"]["longitude"] | 0.0; beacon.longitude = data["beacon"]["longitude"] | 0.0;
beacon.comment = data["beacon"]["comment"] | "LoRa APRS"; beacon.comment = data["beacon"]["comment"] | "LoRa APRS";
@@ -245,7 +247,7 @@ bool Configuration::readFile() {
beacon.statusActive = data["beacon"]["statusActive"] | false; beacon.statusActive = data["beacon"]["statusActive"] | false;
beacon.statusPacket = data["beacon"]["statusPacket"] | ""; beacon.statusPacket = data["beacon"]["statusPacket"] | "";
beacon.gpsActive = data["beacon"]["gpsActive"] | false; beacon.gpsActive = data["beacon"]["gpsActive"] | false;
beacon.gpsAmbiguity = data["beacon"]["gpsAmbiguity"] | false; beacon.ambiguityLevel = data["beacon"]["ambiguityLevel"] | 0;
if (!data.containsKey("personalNote")) needsRewrite = true; if (!data.containsKey("personalNote")) needsRewrite = true;
personalNote = data["personalNote"] | "personal note here"; personalNote = data["personalNote"] | "personal note here";
@@ -296,21 +298,23 @@ bool Configuration::readFile() {
!data["battery"].containsKey("monitorInternalVoltage") || !data["battery"].containsKey("monitorInternalVoltage") ||
!data["battery"].containsKey("internalSleepVoltage") || !data["battery"].containsKey("internalSleepVoltage") ||
!data["battery"].containsKey("sendExternalVoltage") || !data["battery"].containsKey("sendExternalVoltage") ||
!data["battery"].containsKey("externalVoltagePin") ||
!data["battery"].containsKey("monitorExternalVoltage") || !data["battery"].containsKey("monitorExternalVoltage") ||
!data["battery"].containsKey("externalSleepVoltage") || !data["battery"].containsKey("externalSleepVoltage") ||
!data["battery"].containsKey("useExternalI2CSensor") ||
!data["battery"].containsKey("voltageDividerR1") || !data["battery"].containsKey("voltageDividerR1") ||
!data["battery"].containsKey("voltageDividerR2") || !data["battery"].containsKey("voltageDividerR2") ||
!data["battery"].containsKey("externalVoltagePin") ||
!data["battery"].containsKey("sendVoltageAsTelemetry")) needsRewrite = true; !data["battery"].containsKey("sendVoltageAsTelemetry")) needsRewrite = true;
battery.sendInternalVoltage = data["battery"]["sendInternalVoltage"] | false; battery.sendInternalVoltage = data["battery"]["sendInternalVoltage"] | false;
battery.monitorInternalVoltage = data["battery"]["monitorInternalVoltage"] | false; battery.monitorInternalVoltage = data["battery"]["monitorInternalVoltage"] | false;
battery.internalSleepVoltage = data["battery"]["internalSleepVoltage"] | 2.9; battery.internalSleepVoltage = data["battery"]["internalSleepVoltage"] | 2.9;
battery.sendExternalVoltage = data["battery"]["sendExternalVoltage"] | false; battery.sendExternalVoltage = data["battery"]["sendExternalVoltage"] | false;
battery.externalVoltagePin = data["battery"]["externalVoltagePin"] | 34;
battery.monitorExternalVoltage = data["battery"]["monitorExternalVoltage"] | false; battery.monitorExternalVoltage = data["battery"]["monitorExternalVoltage"] | false;
battery.externalSleepVoltage = data["battery"]["externalSleepVoltage"] | 10.9; battery.externalSleepVoltage = data["battery"]["externalSleepVoltage"] | 10.9;
battery.useExternalI2CSensor = data["battery"]["useExternalI2CSensor"] | false;
battery.voltageDividerR1 = data["battery"]["voltageDividerR1"] | 100.0; battery.voltageDividerR1 = data["battery"]["voltageDividerR1"] | 100.0;
battery.voltageDividerR2 = data["battery"]["voltageDividerR2"] | 27.0; battery.voltageDividerR2 = data["battery"]["voltageDividerR2"] | 27.0;
battery.externalVoltagePin = data["battery"]["externalVoltagePin"] | 34;
battery.sendVoltageAsTelemetry = data["battery"]["sendVoltageAsTelemetry"] | false; battery.sendVoltageAsTelemetry = data["battery"]["sendVoltageAsTelemetry"] | false;
if (!data["wxsensor"].containsKey("active") || if (!data["wxsensor"].containsKey("active") ||
@@ -331,10 +335,12 @@ bool Configuration::readFile() {
if (!data["tnc"].containsKey("enableServer") || if (!data["tnc"].containsKey("enableServer") ||
!data["tnc"].containsKey("enableSerial") || !data["tnc"].containsKey("enableSerial") ||
!data["tnc"].containsKey("acceptOwn")) needsRewrite = true; !data["tnc"].containsKey("acceptOwn") ||
!data["tnc"].containsKey("aprsBridgeActive")) needsRewrite = true;
tnc.enableServer = data["tnc"]["enableServer"] | false; tnc.enableServer = data["tnc"]["enableServer"] | false;
tnc.enableSerial = data["tnc"]["enableSerial"] | false; tnc.enableSerial = data["tnc"]["enableSerial"] | false;
tnc.acceptOwn = data["tnc"]["acceptOwn"] | false; tnc.acceptOwn = data["tnc"]["acceptOwn"] | false;
tnc.aprsBridgeActive = data["tnc"]["aprsBridgeActive"] | false;
if (!data["mqtt"].containsKey("active") || if (!data["mqtt"].containsKey("active") ||
!data["mqtt"].containsKey("server") || !data["mqtt"].containsKey("server") ||
@@ -446,7 +452,7 @@ void Configuration::setDefaultValues() {
beacon.statusPacket = ""; beacon.statusPacket = "";
beacon.gpsActive = false; beacon.gpsActive = false;
beacon.gpsAmbiguity = false; beacon.ambiguityLevel = 0;
personalNote = ""; personalNote = "";
@@ -476,11 +482,12 @@ void Configuration::setDefaultValues() {
battery.internalSleepVoltage = 2.9; battery.internalSleepVoltage = 2.9;
battery.sendExternalVoltage = false; battery.sendExternalVoltage = false;
battery.externalVoltagePin = 34;
battery.monitorExternalVoltage = false; battery.monitorExternalVoltage = false;
battery.externalSleepVoltage = 10.9; battery.externalSleepVoltage = 10.9;
battery.useExternalI2CSensor = false;
battery.voltageDividerR1 = 100.0; battery.voltageDividerR1 = 100.0;
battery.voltageDividerR2 = 27.0; battery.voltageDividerR2 = 27.0;
battery.externalVoltagePin = 34;
battery.sendVoltageAsTelemetry = false; battery.sendVoltageAsTelemetry = false;
@@ -496,6 +503,7 @@ void Configuration::setDefaultValues() {
tnc.enableServer = false; tnc.enableServer = false;
tnc.enableSerial = false; tnc.enableSerial = false;
tnc.acceptOwn = false; tnc.acceptOwn = false;
tnc.aprsBridgeActive = false;
mqtt.active = false; mqtt.active = false;
mqtt.server = ""; mqtt.server = "";
@@ -525,7 +533,7 @@ void Configuration::setDefaultValues() {
backupDigiMode = false; backupDigiMode = false;
Serial.println("All is Written!"); Serial.println("New Data Created... All is Written!");
} }
Configuration::Configuration() { Configuration::Configuration() {
+2 -1
View File
@@ -96,6 +96,7 @@ void displaySetup() {
#ifdef HAS_EPAPER #ifdef HAS_EPAPER
display.landscape(); display.landscape();
display.printCenter("LoRa APRS iGate Initialising..."); display.printCenter("LoRa APRS iGate Initialising...");
if (Config.display.turn180) display.setRotation(2);
display.update(); display.update();
#else #else
#ifdef OLED_DISPLAY_HAS_RST_PIN #ifdef OLED_DISPLAY_HAS_RST_PIN
@@ -106,7 +107,7 @@ void displaySetup() {
#endif #endif
#if defined(TTGO_T_Beam_S3_SUPREME_V3) #if defined(TTGO_T_Beam_S3_SUPREME_V3)
if (!display.begin(0x3c, false)) { if (display.begin(0x3c, false)) {
displayFound = true; displayFound = true;
if (Config.display.turn180) display.setRotation(2); if (Config.display.turn180) display.setRotation(2);
display.clearDisplay(); display.clearDisplay();
+37 -113
View File
@@ -16,6 +16,7 @@
* along with LoRa APRS iGate. If not, see <https://www.gnu.org/licenses/>. * along with LoRa APRS iGate. If not, see <https://www.gnu.org/licenses/>.
*/ */
#include <APRSPacketLib.h>
#include <TinyGPS++.h> #include <TinyGPS++.h>
#include <WiFi.h> #include <WiFi.h>
#include "configuration.h" #include "configuration.h"
@@ -42,70 +43,6 @@ namespace GPS_Utils {
return iGateLoRaBeaconPacket; return iGateLoRaBeaconPacket;
} }
char *ax25_base91enc(char *s, uint8_t n, uint32_t v) {
for(s += n, *s = '\0'; n; n--) {
*(--s) = v % 91 + 33;
v /= 91;
}
return(s);
}
float roundToTwoDecimals(float degrees) {
return round(degrees * 100) / 100;
}
String encodeGPS(float latitude, float longitude, const String& overlay, const String& symbol) {
String encodedData = overlay;
uint32_t aprs_lat, aprs_lon;
float processedLatitude = latitude;
float processedLongitude = longitude;
if (Config.beacon.gpsActive && Config.beacon.gpsAmbiguity) {
processedLatitude = roundToTwoDecimals(latitude);
processedLongitude = roundToTwoDecimals(longitude);
}
aprs_lat = 900000000 - processedLatitude * 10000000;
aprs_lat = aprs_lat / 26 - aprs_lat / 2710 + aprs_lat / 15384615;
aprs_lon = 900000000 + processedLongitude * 10000000 / 2;
aprs_lon = aprs_lon / 26 - aprs_lon / 2710 + aprs_lon / 15384615;
String Ns, Ew, helper;
if(processedLatitude < 0) { Ns = "S"; } else { Ns = "N"; }
if(processedLatitude < 0) { processedLatitude = -processedLatitude; }
if(processedLongitude < 0) { Ew = "W"; } else { Ew = "E"; }
if(processedLongitude < 0) { processedLongitude = -processedLongitude; }
char helper_base91[] = {"0000\0"};
int i;
ax25_base91enc(helper_base91, 4, aprs_lat);
for (i = 0; i < 4; i++) {
encodedData += helper_base91[i];
}
ax25_base91enc(helper_base91, 4, aprs_lon);
for (i = 0; i < 4; i++) {
encodedData += helper_base91[i];
}
encodedData += symbol;
encodedData += " ";
encodedData += "\x47";
return encodedData;
}
void generateBeaconFirstPart() {
String beaconPacket = Config.callsign;
beaconPacket += ">APLRG1";
if (Config.beacon.path.indexOf("WIDE") == 0) {
beaconPacket += ",";
beaconPacket += Config.beacon.path;
}
iGateBeaconPacket = beaconPacket;
iGateBeaconPacket += ",qAC:!";
iGateLoRaBeaconPacket = beaconPacket;
iGateLoRaBeaconPacket += ":!";
}
void generateBeacons() { void generateBeacons() {
if (Config.callsign.indexOf("NOCALL-10") != 0 && !Utils::checkValidCallsign(Config.callsign)) { if (Config.callsign.indexOf("NOCALL-10") != 0 && !Utils::checkValidCallsign(Config.callsign)) {
displayShow("***** ERROR ******", "CALLSIGN = NOT VALID!", "", "Only Rx Mode Active", 3000); displayShow("***** ERROR ******", "CALLSIGN = NOT VALID!", "", "Only Rx Mode Active", 3000);
@@ -116,9 +53,17 @@ namespace GPS_Utils {
Config.digi.mode = 0; Config.digi.mode = 0;
Config.backupDigiMode = false; Config.backupDigiMode = false;
} }
generateBeaconFirstPart(); String beaconPacket = APRSPacketLib::generateBasePacket(Config.callsign, "APLRG1", Config.beacon.path);
String encodedGPS = encodeGPS(Config.beacon.latitude, Config.beacon.longitude, Config.beacon.overlay, Config.beacon.symbol); String encodedGPS = APRSPacketLib::encodeGPSIntoBase91(Config.beacon.latitude, Config.beacon.longitude, 0, 0, Config.beacon.symbol, false, 0, true, Config.beacon.ambiguityLevel);
iGateBeaconPacket = beaconPacket;
iGateBeaconPacket += ",qAC:!";
iGateBeaconPacket += Config.beacon.overlay;
iGateBeaconPacket += encodedGPS; iGateBeaconPacket += encodedGPS;
iGateLoRaBeaconPacket = beaconPacket;
iGateLoRaBeaconPacket += ":=";
iGateLoRaBeaconPacket += Config.beacon.overlay;
iGateLoRaBeaconPacket += encodedGPS; iGateLoRaBeaconPacket += encodedGPS;
} }
@@ -126,47 +71,40 @@ namespace GPS_Utils {
return TinyGPSPlus::distanceBetween(Config.beacon.latitude,Config.beacon.longitude, latitude, longitude) / 1000.0; return TinyGPSPlus::distanceBetween(Config.beacon.latitude,Config.beacon.longitude, latitude, longitude) / 1000.0;
} }
String buildDistanceAndComment(float latitude, float longitude, const String& comment) {
distance = String(calculateDistanceTo(latitude, longitude),1);
String distanceAndComment = String(latitude,5);
distanceAndComment += "N / ";
distanceAndComment += String(longitude,5);
distanceAndComment += "E / ";
distanceAndComment += distance;
distanceAndComment += "km";
if (comment != "") {
distanceAndComment += " / ";
distanceAndComment += comment;
}
return distanceAndComment;
}
String decodeEncodedGPS(const String& packet) { String decodeEncodedGPS(const String& packet) {
int indexOfExclamation = packet.indexOf(":!"); int indexOfExclamation = packet.indexOf(":!");
int indexOfEqual = packet.indexOf(":="); int indexOfEqual = packet.indexOf(":=");
const uint8_t OFFSET = 3; // Offset for encoded data in the packet const uint8_t OFFSET = 3; // Offset for encoded data in the packet
String GPSPacket; String infoGPS;
if (indexOfExclamation > 10) { if (indexOfExclamation > 10) {
GPSPacket = packet.substring(indexOfExclamation + OFFSET); infoGPS = packet.substring(indexOfExclamation + OFFSET);
} else if (indexOfEqual > 10) { } else if (indexOfEqual > 10) {
GPSPacket = packet.substring(indexOfEqual + OFFSET); infoGPS = packet.substring(indexOfEqual + OFFSET);
} }
String encodedLatitude = GPSPacket.substring(0,4); float decodedLatitude = APRSPacketLib::decodeBase91EncodedLatitude(infoGPS.substring(0,4));
int Y1 = encodedLatitude[0] - 33; float decodedLongitude = APRSPacketLib::decodeBase91EncodedLongitude(infoGPS.substring(4,8));
int Y2 = encodedLatitude[1] - 33;
int Y3 = encodedLatitude[2] - 33;
int Y4 = encodedLatitude[3] - 33;
float decodedLatitude = 90.0 - (((Y1 * pow(91,3)) + (Y2 * pow(91,2)) + (Y3 * 91) + Y4) / 380926.0);
String encodedLongitude = GPSPacket.substring(4,8); return buildDistanceAndComment(decodedLatitude, decodedLongitude, infoGPS.substring(12));
int X1 = encodedLongitude[0] - 33;
int X2 = encodedLongitude[1] - 33;
int X3 = encodedLongitude[2] - 33;
int X4 = encodedLongitude[3] - 33;
float decodedLongitude = -180.0 + (((X1 * pow(91,3)) + (X2 * pow(91,2)) + (X3 * 91) + X4) / 190463.0);
distance = String(calculateDistanceTo(decodedLatitude, decodedLongitude),1);
String decodedGPS = String(decodedLatitude,5);
decodedGPS += "N / ";
decodedGPS += String(decodedLongitude,5);
decodedGPS += "E / ";
decodedGPS += distance;
decodedGPS += "km";
String comment = GPSPacket.substring(12);
if (comment != "") {
decodedGPS += " / ";
decodedGPS += comment;
}
return decodedGPS;
} }
String getReceivedGPS(const String& packet) { String getReceivedGPS(const String& packet) {
@@ -195,21 +133,7 @@ namespace GPS_Utils {
convertedLongitude += Longitude.substring(Longitude.indexOf(".") + 1, Longitude.indexOf(".") + 3).toFloat() / (60*100); convertedLongitude += Longitude.substring(Longitude.indexOf(".") + 1, Longitude.indexOf(".") + 3).toFloat() / (60*100);
if (Longitude.endsWith("W")) convertedLongitude = -convertedLongitude; // Handle Western Hemisphere if (Longitude.endsWith("W")) convertedLongitude = -convertedLongitude; // Handle Western Hemisphere
distance = String(calculateDistanceTo(convertedLatitude, convertedLongitude),1); return buildDistanceAndComment(convertedLatitude, convertedLongitude, infoGPS.substring(19));
String decodedGPS = String(convertedLatitude,5);
decodedGPS += "N / ";
decodedGPS += String(convertedLongitude,5);
decodedGPS += "E / ";
decodedGPS += distance;
decodedGPS += "km";
String comment = infoGPS.substring(19);
if (comment != "") {
decodedGPS += " / ";
decodedGPS += comment;
}
return decodedGPS;
} }
String getDistanceAndComment(const String& packet) { String getDistanceAndComment(const String& packet) {
@@ -229,7 +153,7 @@ namespace GPS_Utils {
if (encodedBytePosition != 0) { if (encodedBytePosition != 0) {
char currentChar = packet[encodedBytePosition]; char currentChar = packet[encodedBytePosition];
if (currentChar == 'G' || currentChar == 'Q' || currentChar == '[' || currentChar == 'H' || currentChar == 'X') { if (currentChar == 'G' || currentChar == 'Q' || currentChar == '[' || currentChar == 'H' || currentChar == 'X' || currentChar == '3') {
return decodeEncodedGPS(packet); // If valid encoded data position is found, decode it return decodeEncodedGPS(packet); // If valid encoded data position is found, decode it
} else { } else {
return getReceivedGPS(packet); return getReceivedGPS(packet);
+23 -1
View File
@@ -93,6 +93,16 @@ namespace LoRa_Utils {
#if defined(HAS_SX1278) || defined(HAS_SX1276) #if defined(HAS_SX1278) || defined(HAS_SX1276)
radio.setDio0Action(setFlag, RISING); radio.setDio0Action(setFlag, RISING);
#endif #endif
/*#ifdef SX126X_DIO3_TCXO_VOLTAGE
if (radio.setTCXO(float(SX126X_DIO3_TCXO_VOLTAGE)) == RADIOLIB_ERR_NONE) {
Utils::println("Set LoRa Module TCXO Voltage to:" + String(SX126X_DIO3_TCXO_VOLTAGE));
} else {
Utils::println("Set LoRa Module TCXO Voltage failed! State: " + String(state));
while (true);
}
#endif*/
radio.setSpreadingFactor(Config.loramodule.rxSpreadingFactor); radio.setSpreadingFactor(Config.loramodule.rxSpreadingFactor);
radio.setCodingRate(Config.loramodule.rxCodingRate4); radio.setCodingRate(Config.loramodule.rxCodingRate4);
float signalBandwidth = Config.loramodule.rxSignalBandwidth/1000; float signalBandwidth = Config.loramodule.rxSignalBandwidth/1000;
@@ -103,6 +113,11 @@ namespace LoRa_Utils {
radio.setRfSwitchPins(RADIO_RXEN, RADIO_TXEN); radio.setRfSwitchPins(RADIO_RXEN, RADIO_TXEN);
#endif #endif
/*#ifdef SX126X_DIO2_AS_RF_SWITCH
radio.setRfSwitchPins(RADIO_RXEN, RADIOLIB_NC);
radio.setDio2AsRfSwitch(true);
#endif*/
#ifdef HAS_1W_LORA // Ebyte E22 400M30S (SX1268) / 900M30S (SX1262) / Ebyte E220 400M30S (LLCC68) #ifdef HAS_1W_LORA // Ebyte E22 400M30S (SX1268) / 900M30S (SX1262) / Ebyte E220 400M30S (LLCC68)
state = radio.setOutputPower(Config.loramodule.power); // max value 20dB for 1W modules as they have Low Noise Amp state = radio.setOutputPower(Config.loramodule.power); // max value 20dB for 1W modules as they have Low Noise Amp
radio.setCurrentLimit(140); // to be validated (100 , 120, 140)? radio.setCurrentLimit(140); // to be validated (100 , 120, 140)?
@@ -120,6 +135,13 @@ namespace LoRa_Utils {
radio.setRxBoostedGainMode(true); radio.setRxBoostedGainMode(true);
#endif #endif
#if defined(HAS_TCXO) && !defined(HAS_1W_LORA)
radio.setDio2AsRfSwitch();
#endif
#ifdef HAS_TCXO
radio.setTCXO(1.8);
#endif
if (state == RADIOLIB_ERR_NONE) { if (state == RADIOLIB_ERR_NONE) {
Utils::println("init : LoRa Module ... done!"); Utils::println("init : LoRa Module ... done!");
} else { } else {
@@ -204,7 +226,7 @@ namespace LoRa_Utils {
if (packet != "") { if (packet != "") {
String sender = packet.substring(3, packet.indexOf(">")); String sender = packet.substring(3, packet.indexOf(">"));
if (packet.substring(0,3) == "\x3c\xff\x01" && !STATION_Utils::isBlacklisted(sender)){ // avoid processing BlackListed stations if (packet.substring(0,3) == "\x3c\xff\x01" && !STATION_Utils::isBlacklisted(sender)) { // avoid processing BlackListed stations
rssi = radio.getRSSI(); rssi = radio.getRSSI();
snr = radio.getSNR(); snr = radio.getSNR();
freqError = radio.getFrequencyError(); freqError = radio.getFrequencyError();
+1 -1
View File
@@ -45,7 +45,7 @@ namespace NTP_Utils {
} }
String getFormatedTime() { String getFormatedTime() {
if (Config.digi.ecoMode == 0) return timeClient->getFormattedTime(); if (WiFi.status() == WL_CONNECTED && Config.digi.ecoMode == 0) return timeClient->getFormattedTime();
return "DigiEcoMode Active"; return "DigiEcoMode Active";
} }
+4 -4
View File
@@ -57,7 +57,7 @@ bool packetIsBeacon = false;
namespace STATION_Utils { namespace STATION_Utils {
std::vector<String> loadCallSignList(const String& list) { std::vector<String> loadCallsignList(const String& list) {
std::vector<String> loadedList; std::vector<String> loadedList;
String callsigns = list; String callsigns = list;
@@ -77,12 +77,12 @@ namespace STATION_Utils {
} }
void loadBlacklistAndManagers() { void loadBlacklistAndManagers() {
blacklist = loadCallSignList(Config.blacklist); blacklist = loadCallsignList(Config.blacklist);
managers = loadCallSignList(Config.remoteManagement.managers); managers = loadCallsignList(Config.remoteManagement.managers);
} }
bool checkCallsignList(const std::vector<String>& list, const String& callsign) { bool checkCallsignList(const std::vector<String>& list, const String& callsign) {
for (int i = 0; i < list.size(); i++) { for (size_t i = 0; i < list.size(); i++) {
int wildcardIndex = list[i].indexOf("*"); int wildcardIndex = list[i].indexOf("*");
if (wildcardIndex >= 0) { if (wildcardIndex >= 0) {
String wildcard = list[i].substring(0, wildcardIndex); String wildcard = list[i].substring(0, wildcardIndex);
+1 -1
View File
@@ -122,7 +122,7 @@ namespace TELEMETRY_Utils {
telemetryCounter++; telemetryCounter++;
if (telemetryCounter == 1000) telemetryCounter = 0; if (telemetryCounter == 1000) telemetryCounter = 0;
if (Config.battery.sendInternalVoltage) telemetry += generateEncodedTelemetryBytes(BATTERY_Utils::checkInternalVoltage(), false, 0); if (Config.battery.sendInternalVoltage) telemetry += generateEncodedTelemetryBytes(BATTERY_Utils::checkInternalVoltage(), false, 0);
if (Config.battery.sendExternalVoltage) telemetry += generateEncodedTelemetryBytes(BATTERY_Utils::checkExternalVoltage(), false, 1); if (Config.battery.sendExternalVoltage) telemetry += generateEncodedTelemetryBytes(BATTERY_Utils::checkExternalVoltage(), false, Config.battery.useExternalI2CSensor ? 0 : 1);
telemetry += "|"; telemetry += "|";
return telemetry; return telemetry;
} }
+10 -6
View File
@@ -21,12 +21,15 @@
#include "configuration.h" #include "configuration.h"
#include "station_utils.h" #include "station_utils.h"
#include "kiss_protocol.h" #include "kiss_protocol.h"
#include "aprs_is_utils.h"
#include "kiss_utils.h" #include "kiss_utils.h"
#include "tnc_utils.h" #include "tnc_utils.h"
#include "utils.h" #include "utils.h"
extern Configuration Config; extern Configuration Config;
extern WiFiClient aprsIsClient;
extern bool passcodeValid;
#define MAX_CLIENTS 4 #define MAX_CLIENTS 4
#define INPUT_BUFFER_SIZE (2 + MAX_CLIENTS) #define INPUT_BUFFER_SIZE (2 + MAX_CLIENTS)
@@ -94,7 +97,8 @@ namespace TNC_Utils {
String sender = frame.substring(0,frame.indexOf(">")); String sender = frame.substring(0,frame.indexOf(">"));
if (Config.tnc.acceptOwn || sender != Config.callsign) { if (Config.tnc.acceptOwn || sender != Config.callsign) {
STATION_Utils::addToOutputPacketBuffer(frame); if (Config.loramodule.txActive) STATION_Utils::addToOutputPacketBuffer(frame);
if (Config.tnc.aprsBridgeActive && Config.aprs_is.active && passcodeValid && aprsIsClient.connected()) APRS_IS_Utils::upload(frame);
} else { } else {
Utils::println("Ignored own frame from KISS"); Utils::println("Ignored own frame from KISS");
} }
@@ -131,8 +135,8 @@ namespace TNC_Utils {
} }
} }
void sendToClients(const String& packet) { void sendToClients(const String& packet, bool stripBytes) {
String cleanPacket = packet.substring(3); String cleanPacket = stripBytes ? packet.substring(3): packet;
const String kissEncoded = encodeKISS(cleanPacket); const String kissEncoded = encodeKISS(cleanPacket);
@@ -152,8 +156,8 @@ namespace TNC_Utils {
Utils::println(cleanPacket); Utils::println(cleanPacket);
} }
void sendToSerial(const String& packet) { void sendToSerial(const String& packet, bool stripBytes) {
String cleanPacket = packet.substring(3); String cleanPacket = stripBytes ? packet.substring(3): packet;
Serial.print(encodeKISS(cleanPacket)); Serial.print(encodeKISS(cleanPacket));
Serial.flush(); Serial.flush();
} }
+16 -10
View File
@@ -16,6 +16,7 @@
* along with LoRa APRS iGate. If not, see <https://www.gnu.org/licenses/>. * along with LoRa APRS iGate. If not, see <https://www.gnu.org/licenses/>.
*/ */
#include <APRSPacketLib.h>
#include <TinyGPS++.h> #include <TinyGPS++.h>
#include <WiFi.h> #include <WiFi.h>
#include "telemetry_utils.h" #include "telemetry_utils.h"
@@ -71,12 +72,8 @@ String secondaryBeaconPacket;
namespace Utils { namespace Utils {
void processStatus() { void processStatus() {
String status = Config.callsign; String status = APRSPacketLib::generateBasePacket(Config.callsign, "APLRG1", Config.beacon.path);
status.concat(">APLRG1");
if (Config.beacon.path.indexOf("WIDE") == 0) {
status.concat(",");
status.concat(Config.beacon.path);
}
if (WiFi.status() == WL_CONNECTED && Config.aprs_is.active && Config.beacon.sendViaAPRSIS) { if (WiFi.status() == WL_CONNECTED && Config.aprs_is.active && Config.beacon.sendViaAPRSIS) {
delay(1000); delay(1000);
status.concat(",qAC:>"); status.concat(",qAC:>");
@@ -167,10 +164,18 @@ namespace Utils {
if (Config.beacon.gpsActive && Config.digi.ecoMode == 0) { if (Config.beacon.gpsActive && Config.digi.ecoMode == 0) {
GPS_Utils::getData(); GPS_Utils::getData();
if (gps.location.isUpdated() && gps.location.lat() != 0.0 && gps.location.lng() != 0.0) { if (gps.location.isUpdated() && gps.location.lat() != 0.0 && gps.location.lng() != 0.0) {
GPS_Utils::generateBeaconFirstPart(); String basePacket = APRSPacketLib::generateBasePacket(Config.callsign, "APLRG1", Config.beacon.path);
String encodedGPS = GPS_Utils::encodeGPS(gps.location.lat(), gps.location.lng(), Config.beacon.overlay, Config.beacon.symbol); String encodedGPS = APRSPacketLib::encodeGPSIntoBase91(gps.location.lat(),gps.location.lng(), 0, 0, Config.beacon.symbol, false, 0, true, Config.beacon.ambiguityLevel);
beaconPacket = iGateBeaconPacket + encodedGPS;
secondaryBeaconPacket = iGateLoRaBeaconPacket + encodedGPS; beaconPacket = basePacket;
beaconPacket += ",qAC:!";
beaconPacket += Config.beacon.overlay;
beaconPacket += encodedGPS;
secondaryBeaconPacket = basePacket;
secondaryBeaconPacket += ":=";
secondaryBeaconPacket += Config.beacon.overlay;
secondaryBeaconPacket += encodedGPS;
} }
} }
#endif #endif
@@ -402,6 +407,7 @@ namespace Utils {
cleanCallsign = callsign.substring(0, callsign.indexOf("-")); cleanCallsign = callsign.substring(0, callsign.indexOf("-"));
String ssid = callsign.substring(callsign.indexOf("-") + 1); String ssid = callsign.substring(callsign.indexOf("-") + 1);
if (ssid.indexOf("-") != -1 || ssid.length() > 2) return false; if (ssid.indexOf("-") != -1 || ssid.length() > 2) return false;
if (ssid.length() == 2 && ssid[0] == '0') return false;
for (int i = 0; i < ssid.length(); i++) { for (int i = 0; i < ssid.length(); i++) {
if (!isAlphaNumeric(ssid[i])) return false; if (!isAlphaNumeric(ssid[i])) return false;
} }
+5 -1
View File
@@ -191,7 +191,7 @@ namespace WEB_Utils {
} }
Config.beacon.gpsActive = request->hasParam("beacon.gpsActive", true); Config.beacon.gpsActive = request->hasParam("beacon.gpsActive", true);
Config.beacon.gpsAmbiguity = request->hasParam("beacon.gpsAmbiguity", true); Config.beacon.ambiguityLevel = getParamIntSafe("beacon.ambiguityLevel", Config.beacon.ambiguityLevel);
Config.personalNote = getParamStringSafe("personalNote", Config.personalNote); Config.personalNote = getParamStringSafe("personalNote", Config.personalNote);
@@ -228,6 +228,9 @@ namespace WEB_Utils {
} }
Config.battery.sendExternalVoltage = request->hasParam("battery.sendExternalVoltage", true); Config.battery.sendExternalVoltage = request->hasParam("battery.sendExternalVoltage", true);
if (Config.battery.sendExternalVoltage) {
Config.battery.useExternalI2CSensor = request->hasParam("battery.useExternalI2CSensor", true);
}
if (Config.battery.sendExternalVoltage) { if (Config.battery.sendExternalVoltage) {
Config.battery.externalVoltagePin = getParamIntSafe("battery.externalVoltagePin", Config.battery.externalVoltagePin); Config.battery.externalVoltagePin = getParamIntSafe("battery.externalVoltagePin", Config.battery.externalVoltagePin);
Config.battery.voltageDividerR1 = getParamFloatSafe("battery.voltageDividerR1", Config.battery.voltageDividerR1); Config.battery.voltageDividerR1 = getParamFloatSafe("battery.voltageDividerR1", Config.battery.voltageDividerR1);
@@ -259,6 +262,7 @@ namespace WEB_Utils {
Config.tnc.enableServer = request->hasParam("tnc.enableServer", true); Config.tnc.enableServer = request->hasParam("tnc.enableServer", true);
Config.tnc.enableSerial = request->hasParam("tnc.enableSerial", true); Config.tnc.enableSerial = request->hasParam("tnc.enableSerial", true);
Config.tnc.acceptOwn = request->hasParam("tnc.acceptOwn", true); Config.tnc.acceptOwn = request->hasParam("tnc.acceptOwn", true);
Config.tnc.aprsBridgeActive = request->hasParam("tnc.aprsBridgeActive", true);
Config.mqtt.active = request->hasParam("mqtt.active", true); Config.mqtt.active = request->hasParam("mqtt.active", true);
+2 -2
View File
@@ -60,7 +60,7 @@ namespace WIFI_Utils {
Serial.print(millis()); Serial.print(millis());
Serial.println("Reconnecting to WiFi..."); Serial.println("Reconnecting to WiFi...");
WiFi.disconnect(); WiFi.disconnect();
WIFI_Utils::startWiFi();//WiFi.reconnect(); WIFI_Utils::startWiFi();
previousWiFiMillis = millis(); previousWiFiMillis = millis();
if (Config.backupDigiMode) { if (Config.backupDigiMode) {
@@ -132,7 +132,7 @@ namespace WIFI_Utils {
digitalWrite(INTERNAL_LED_PIN,LOW); digitalWrite(INTERNAL_LED_PIN,LOW);
#endif #endif
if (WiFi.status() == WL_CONNECTED) { if (WiFi.status() == WL_CONNECTED) {
Serial.print("Connected as "); Serial.print("\nConnected as ");
Serial.print(WiFi.localIP()); Serial.print(WiFi.localIP());
Serial.print(" / MAC Address: "); Serial.print(" / MAC Address: ");
Serial.println(WiFi.macAddress()); Serial.println(WiFi.macAddress());
+31 -14
View File
@@ -42,6 +42,7 @@ float newHum, newTemp, newPress, newGas;
Adafruit_BME280 bme280; Adafruit_BME280 bme280;
Adafruit_AHTX0 aht20;
#if defined(HELTEC_V3) || defined(HELTEC_V3_2) #if defined(HELTEC_V3) || defined(HELTEC_V3_2)
Adafruit_BMP280 bmp280(&Wire1); Adafruit_BMP280 bmp280(&Wire1);
Adafruit_Si7021 si7021 = Adafruit_Si7021(); Adafruit_Si7021 si7021 = Adafruit_Si7021();
@@ -119,15 +120,19 @@ namespace WX_Utils {
Serial.println("BMP280 sensor found"); Serial.println("BMP280 sensor found");
wxModuleType = 2; wxModuleType = 2;
wxModuleFound = true; wxModuleFound = true;
if (aht20.begin()) {
Serial.println("AHT20 sensor found");
if (wxModuleType == 2) wxModuleType = 6;
}
} }
} }
} else if (wxModuleAddress == 0x40) { } else if (wxModuleAddress == 0x40 && Config.battery.useExternalI2CSensor == false) {
if(si7021.begin()) { if(si7021.begin()) {
Serial.println("Si7021 sensor found"); Serial.println("Si7021 sensor found");
wxModuleType = 4; wxModuleType = 4;
wxModuleFound = true; wxModuleFound = true;
} }
} }
#ifdef LIGHTGATEWAY_PLUS_1_0 #ifdef LIGHTGATEWAY_PLUS_1_0
else if (wxModuleAddress == 0x70) { else if (wxModuleAddress == 0x70) {
if (shtc3.begin()) { if (shtc3.begin()) {
@@ -265,15 +270,27 @@ namespace WX_Utils {
newPress = 0; newPress = 0;
break; break;
case 5: // SHTC3 case 5: // SHTC3
#ifdef LIGHTGATEWAY_PLUS_1_0 {
sensors_event_t humidity, temp; #ifdef LIGHTGATEWAY_PLUS_1_0
shtc3.getEvent(&humidity, &temp); sensors_event_t humidity, temp;
newTemp = temp.temperature; shtc3.getEvent(&humidity, &temp);
newHum = humidity.relative_humidity; newTemp = temp.temperature;
newPress = 0; newHum = humidity.relative_humidity;
#endif newPress = 0;
#endif
}
break; break;
} case 6: // BMP280 + AHT20
{
bmp280.takeForcedMeasurement();
newTemp = bmp280.readTemperature();
newPress = (bmp280.readPressure() / 100.0F);
sensors_event_t humidity, temp;
aht20.getEvent(&humidity, &temp);
newHum = humidity.relative_humidity;
}
break;
}
if (isnan(newTemp) || isnan(newHum) || isnan(newPress)) { if (isnan(newTemp) || isnan(newHum) || isnan(newPress)) {
Serial.println("BME/BMP/Si7021 Module data failed"); Serial.println("BME/BMP/Si7021 Module data failed");
@@ -281,16 +298,16 @@ namespace WX_Utils {
return ".../...g...t..."; return ".../...g...t...";
} else { } else {
String tempStr = generateTempString(((newTemp + Config.wxsensor.temperatureCorrection) * 1.8) + 32); String tempStr = generateTempString(((newTemp + Config.wxsensor.temperatureCorrection) * 1.8) + 32);
String humStr; String humStr;
if (wxModuleType == 1 || wxModuleType == 3 || wxModuleType == 4 || wxModuleType == 5) { if (wxModuleType == 1 || wxModuleType == 3 || wxModuleType == 4 || wxModuleType == 5 || wxModuleType == 6) {
humStr = generateHumString(newHum); humStr = generateHumString(newHum);
} else if (wxModuleType == 2) { } else if (wxModuleType == 2) {
humStr = ".."; humStr = "..";
} }
String presStr = (wxModuleType == 4 || wxModuleType == 5) String presStr = (wxModuleType == 4 || wxModuleType == 5)
? "....." ? "....."
: generatePresString(newPress + getAltitudeCorrection() / CORRECTION_FACTOR); : generatePresString(newPress + getAltitudeCorrection() / CORRECTION_FACTOR);
fifthLine = "BME-> "; fifthLine = "BME-> ";
@@ -4,6 +4,9 @@ board_build.mcu = esp32c3
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
${common.usb_flags} ${common.usb_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX127X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D ESP32_C3_OctopusLab_LoRa -D ESP32_C3_OctopusLab_LoRa
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -22,6 +22,7 @@
// LoRa Radio // LoRa Radio
#define HAS_SX1268 #define HAS_SX1268
#define HAS_1W_LORA #define HAS_1W_LORA
#define HAS_TCXO
#define RADIO_SCLK_PIN 18 #define RADIO_SCLK_PIN 18
#define RADIO_MISO_PIN 19 #define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 23 #define RADIO_MOSI_PIN 23
@@ -2,6 +2,9 @@
board = esp32dev board = esp32dev
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX127X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D ESP32_DIY_1W_LoRa -D ESP32_DIY_1W_LoRa
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -22,6 +22,7 @@
// LoRa Radio // LoRa Radio
#define HAS_SX1262 #define HAS_SX1262
#define HAS_1W_LORA #define HAS_1W_LORA
#define HAS_TCXO
#define RADIO_SCLK_PIN 18 #define RADIO_SCLK_PIN 18
#define RADIO_MISO_PIN 19 #define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 23 #define RADIO_MOSI_PIN 23
@@ -2,6 +2,9 @@
board = esp32dev board = esp32dev
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX127X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D ESP32_DIY_1W_LoRa_915 -D ESP32_DIY_1W_LoRa_915
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -2,6 +2,9 @@
board = esp32dev board = esp32dev
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX127X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D ESP32_DIY_1W_LoRa_LLCC68 -D ESP32_DIY_1W_LoRa_LLCC68
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -2,6 +2,9 @@
board = esp32dev board = esp32dev
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX127X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D ESP32_DIY_1W_LoRa_Mesh_V1_2 -D ESP32_DIY_1W_LoRa_Mesh_V1_2
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
+3
View File
@@ -2,6 +2,9 @@
board = esp32dev board = esp32dev
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX126X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D ESP32_DIY_LoRa -D ESP32_DIY_LoRa
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -2,6 +2,9 @@
board = esp32dev board = esp32dev
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX126X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D ESP32_DIY_LoRa_915 -D ESP32_DIY_LoRa_915
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -2,6 +2,9 @@
board = esp32dev board = esp32dev
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX126X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D ESP32_DIY_LoRa_A7670 -D ESP32_DIY_LoRa_A7670
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -2,6 +2,9 @@
board = esp32dev board = esp32dev
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX126X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D ESP32_DIY_LoRa_A7670_915 -D ESP32_DIY_LoRa_A7670_915
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
+3
View File
@@ -2,6 +2,9 @@
board = esp32dev board = esp32dev
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX126X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D LoRaHAM_V2 -D LoRaHAM_V2
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
+1
View File
@@ -22,6 +22,7 @@
// LoRa Radio // LoRa Radio
#define HAS_SX1268 #define HAS_SX1268
#define HAS_1W_LORA #define HAS_1W_LORA
#define HAS_TCXO
#define RADIO_SCLK_PIN 18 #define RADIO_SCLK_PIN 18
#define RADIO_MISO_PIN 19 #define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 23 #define RADIO_MOSI_PIN 23
+3
View File
@@ -2,6 +2,9 @@
board = esp32dev board = esp32dev
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX127X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D OE5HWN_MeshCom -D OE5HWN_MeshCom
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -4,6 +4,9 @@ board_build.mcu = esp32s3
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
${common.usb_flags} ${common.usb_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX127X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D LIGHTGATEWAY_1_0 -D LIGHTGATEWAY_1_0
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -22,6 +22,7 @@
// LoRa Radio // LoRa Radio
#define HAS_SX1268 #define HAS_SX1268
#define HAS_1W_LORA #define HAS_1W_LORA
#define HAS_TCXO
#define RADIO_VCC_PIN 21 #define RADIO_VCC_PIN 21
#define RADIO_SCLK_PIN 12 #define RADIO_SCLK_PIN 12
#define RADIO_MISO_PIN 13 #define RADIO_MISO_PIN 13
@@ -4,6 +4,9 @@ board_build.mcu = esp32s3
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
${common.usb_flags} ${common.usb_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX127X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D LIGHTGATEWAY_PLUS_1_0 -D LIGHTGATEWAY_PLUS_1_0
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
+3
View File
@@ -2,6 +2,9 @@
board = esp32dev board = esp32dev
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX126X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D TROY_LoRa_APRS -D TROY_LoRa_APRS
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -2,6 +2,9 @@
board = wemos_d1_uno32 board = wemos_d1_uno32
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX126X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D WEMOS_D1_R32_RA02 -D WEMOS_D1_R32_RA02
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -2,6 +2,9 @@
board = lolin32 board = lolin32
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX126X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D WEMOS_LOLIN32_OLED_DIY_LoRa -D WEMOS_LOLIN32_OLED_DIY_LoRa
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -2,6 +2,9 @@
board = lolin_s2_mini board = lolin_s2_mini
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX126X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D WEMOS_S2_MINI_DIY_LoRa -D WEMOS_S2_MINI_DIY_LoRa
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -21,6 +21,7 @@
// LoRa Radio // LoRa Radio
#define HAS_SX1262 #define HAS_SX1262
#define HAS_TCXO
#define RADIO_SCLK_PIN 7 #define RADIO_SCLK_PIN 7
#define RADIO_MISO_PIN 8 #define RADIO_MISO_PIN 8
#define RADIO_MOSI_PIN 9 #define RADIO_MOSI_PIN 9
@@ -3,6 +3,9 @@ board = seeed_xiao_esp32s3
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
${common.usb_flags} ${common.usb_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX127X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D XIAO_ESP32S3_LORA -D XIAO_ESP32S3_LORA
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -22,6 +22,7 @@
// LoRa Radio // LoRa Radio
#define HAS_SX1268 #define HAS_SX1268
#define HAS_1W_LORA #define HAS_1W_LORA
#define HAS_TCXO
#define RADIO_SCLK_PIN 8 #define RADIO_SCLK_PIN 8
#define RADIO_MISO_PIN 9 #define RADIO_MISO_PIN 9
#define RADIO_MOSI_PIN 10 #define RADIO_MOSI_PIN 10
@@ -4,6 +4,9 @@ board_build.mcu = esp32c3
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
${common.usb_flags} ${common.usb_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX127X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D ESP32C3_DIY_1W_LoRa -D ESP32C3_DIY_1W_LoRa
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -22,6 +22,7 @@
// LoRa Radio // LoRa Radio
#define HAS_SX1262 #define HAS_SX1262
#define HAS_1W_LORA #define HAS_1W_LORA
#define HAS_TCXO
#define RADIO_SCLK_PIN 8 #define RADIO_SCLK_PIN 8
#define RADIO_MISO_PIN 9 #define RADIO_MISO_PIN 9
#define RADIO_MOSI_PIN 10 #define RADIO_MOSI_PIN 10
@@ -4,6 +4,9 @@ board_build.mcu = esp32c3
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
${common.usb_flags} ${common.usb_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX127X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D ESP32C3_DIY_1W_LoRa_915 -D ESP32C3_DIY_1W_LoRa_915
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
+3
View File
@@ -2,6 +2,9 @@
board = ttgo-lora32-v21 board = ttgo-lora32-v21
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX126X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D HELTEC_V2 -D HELTEC_V2
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
+1
View File
@@ -21,6 +21,7 @@
// LoRa Radio // LoRa Radio
#define HAS_SX1262 #define HAS_SX1262
#define HAS_TCXO
#define RADIO_SCLK_PIN 10 #define RADIO_SCLK_PIN 10
#define RADIO_MISO_PIN 6 #define RADIO_MISO_PIN 6
#define RADIO_MOSI_PIN 7 #define RADIO_MOSI_PIN 7
+3
View File
@@ -3,6 +3,9 @@ board = esp32-c3-devkitm-1
board_build.mcu = esp32c3 board_build.mcu = esp32c3
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX127X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D HELTEC_HTCT62 -D HELTEC_HTCT62
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -21,6 +21,7 @@
// LoRa Radio // LoRa Radio
#define HAS_SX1262 #define HAS_SX1262
#define HAS_TCXO
#define RADIO_SCLK_PIN 9 #define RADIO_SCLK_PIN 9
#define RADIO_MISO_PIN 11 #define RADIO_MISO_PIN 11
#define RADIO_MOSI_PIN 10 #define RADIO_MOSI_PIN 10
@@ -3,6 +3,9 @@ board = heltec_wifi_lora_32_V3
board_build.mcu = esp32s3 board_build.mcu = esp32s3
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX127X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D HELTEC_V3 -D HELTEC_V3
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -21,6 +21,7 @@
// LoRa Radio // LoRa Radio
#define HAS_SX1262 #define HAS_SX1262
#define HAS_TCXO
#define RADIO_SCLK_PIN 9 #define RADIO_SCLK_PIN 9
#define RADIO_MISO_PIN 11 #define RADIO_MISO_PIN 11
#define RADIO_MOSI_PIN 10 #define RADIO_MOSI_PIN 10
@@ -3,6 +3,9 @@ board = heltec_wifi_lora_32_V3
board_build.mcu = esp32s3 board_build.mcu = esp32s3
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX127X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D HELTEC_V3_2 -D HELTEC_V3_2
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -2,6 +2,9 @@
board = esp32dev board = esp32dev
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX126X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D HELTEC_WIRELESS_BRIDGE -D HELTEC_WIRELESS_BRIDGE
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -21,6 +21,7 @@
// LoRa Radio // LoRa Radio
#define HAS_SX1262 #define HAS_SX1262
#define HAS_TCXO
#define RADIO_SCLK_PIN 9 #define RADIO_SCLK_PIN 9
#define RADIO_MISO_PIN 11 #define RADIO_MISO_PIN 11
#define RADIO_MOSI_PIN 10 #define RADIO_MOSI_PIN 10
@@ -3,6 +3,9 @@ board = esp32-s3-devkitc-1
board_build.mcu = esp32s3 board_build.mcu = esp32s3
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX127X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D HELTEC_WP_V1 -D HELTEC_WP_V1
-D WIRELESS_PAPER -D WIRELESS_PAPER
lib_deps = lib_deps =
@@ -21,6 +21,7 @@
// LoRa Radio // LoRa Radio
#define HAS_SX1262 #define HAS_SX1262
#define HAS_TCXO
#define RADIO_SCLK_PIN 9 #define RADIO_SCLK_PIN 9
#define RADIO_MISO_PIN 11 #define RADIO_MISO_PIN 11
#define RADIO_MOSI_PIN 10 #define RADIO_MOSI_PIN 10
@@ -3,6 +3,9 @@ board = esp32-s3-devkitc-1
board_build.mcu = esp32s3 board_build.mcu = esp32s3
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX127X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D HELTEC_WS -D HELTEC_WS
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -21,6 +21,7 @@
// LoRa Radio // LoRa Radio
#define HAS_SX1262 #define HAS_SX1262
#define HAS_TCXO
#define RADIO_SCLK_PIN 9 #define RADIO_SCLK_PIN 9
#define RADIO_MISO_PIN 11 #define RADIO_MISO_PIN 11
#define RADIO_MOSI_PIN 10 #define RADIO_MOSI_PIN 10
@@ -3,6 +3,9 @@ board = esp32-s3-devkitc-1
board_build.mcu = esp32s3 board_build.mcu = esp32s3
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX127X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D HELTEC_WSL_V3 -D HELTEC_WSL_V3
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -21,6 +21,7 @@
// LoRa Radio // LoRa Radio
#define HAS_SX1262 #define HAS_SX1262
#define HAS_TCXO
#define RADIO_SCLK_PIN 9 #define RADIO_SCLK_PIN 9
#define RADIO_MISO_PIN 11 #define RADIO_MISO_PIN 11
#define RADIO_MOSI_PIN 10 #define RADIO_MOSI_PIN 10
@@ -3,6 +3,9 @@ board = esp32-s3-devkitc-1
board_build.mcu = esp32s3 board_build.mcu = esp32s3
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX127X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D HELTEC_WSL_V3_DISPLAY -D HELTEC_WSL_V3_DISPLAY
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -21,6 +21,7 @@
// LoRa Radio // LoRa Radio
#define HAS_SX1262 #define HAS_SX1262
#define HAS_TCXO
#define RADIO_SCLK_PIN 9 // SX1262 SCK #define RADIO_SCLK_PIN 9 // SX1262 SCK
#define RADIO_MISO_PIN 11 // SX1262 MISO #define RADIO_MISO_PIN 11 // SX1262 MISO
#define RADIO_MOSI_PIN 10 // SX1262 MOSI #define RADIO_MOSI_PIN 10 // SX1262 MOSI
@@ -27,6 +27,9 @@ build_flags =
-D LOAD_FONT8 -D LOAD_FONT8
-D SPI_FREQUENCY=27000000 -D SPI_FREQUENCY=27000000
-D USE_HSPI_PORT -D USE_HSPI_PORT
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX127X=1
-D RADIOLIB_EXCLUDE_SX128X=1
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
bodmer/TFT_eSPI @ 2.5.43 bodmer/TFT_eSPI @ 2.5.43
+3
View File
@@ -2,6 +2,9 @@
board = ttgo-lora32-v21 board = ttgo-lora32-v21
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX126X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D TTGO_LORA32_V2_1 -D TTGO_LORA32_V2_1
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -2,6 +2,9 @@
board = ttgo-lora32-v21 board = ttgo-lora32-v21
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX126X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D TTGO_LORA32_V2_1_915 -D TTGO_LORA32_V2_1_915
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
+3
View File
@@ -2,6 +2,9 @@
board = ttgo-t-beam board = ttgo-t-beam
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX126X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D TTGO_T_BEAM_V1_0 -D TTGO_T_BEAM_V1_0
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
+3
View File
@@ -2,6 +2,9 @@
board = ttgo-t-beam board = ttgo-t-beam
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX126X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D TTGO_T_BEAM_V1_2 -D TTGO_T_BEAM_V1_2
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -2,6 +2,9 @@
board = ttgo-t-beam board = ttgo-t-beam
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX126X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D TTGO_T_BEAM_V1_2_915 -D TTGO_T_BEAM_V1_2_915
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -21,6 +21,7 @@
// LoRa Radio // LoRa Radio
#define HAS_SX1262 #define HAS_SX1262
#define HAS_TCXO
#define RADIO_SCLK_PIN 5 #define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 19 #define RADIO_MISO_PIN 19
#define RADIO_MOSI_PIN 27 #define RADIO_MOSI_PIN 27
@@ -2,6 +2,9 @@
board = ttgo-t-beam board = ttgo-t-beam
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX127X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D TTGO_T_BEAM_V1_2_SX1262 -D TTGO_T_BEAM_V1_2_SX1262
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -2,6 +2,9 @@
board = ttgo-t-beam board = ttgo-t-beam
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX126X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D TTGO_T_BEAM_V1_0_915 -D TTGO_T_BEAM_V1_0_915
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -2,6 +2,9 @@
board = ttgo-t-beam board = ttgo-t-beam
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX127X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D TTGO_T_BEAM_V1_0_SX1268 -D TTGO_T_BEAM_V1_0_SX1268
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -21,6 +21,7 @@
// LoRa Radio // LoRa Radio
#define HAS_SX1262 #define HAS_SX1262
#define HAS_TCXO
#define RADIO_SCLK_PIN 5 #define RADIO_SCLK_PIN 5
#define RADIO_MISO_PIN 3 #define RADIO_MISO_PIN 3
#define RADIO_MOSI_PIN 6 #define RADIO_MOSI_PIN 6
@@ -5,6 +5,9 @@ board_upload.flash_size = 4MB
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
${common.usb_flags} ${common.usb_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX127X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D TTGO_LORA32_T3S3_V1_2 -D TTGO_LORA32_T3S3_V1_2
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
@@ -21,6 +21,7 @@
// LoRa Radio // LoRa Radio
#define HAS_SX1262 #define HAS_SX1262
#define HAS_TCXO
#define RADIO_SCLK_PIN 12 #define RADIO_SCLK_PIN 12
#define RADIO_MISO_PIN 13 #define RADIO_MISO_PIN 13
#define RADIO_MOSI_PIN 11 #define RADIO_MOSI_PIN 11
@@ -4,6 +4,9 @@ board_build.mcu = esp32s3
build_flags = build_flags =
${common.build_flags} ${common.build_flags}
${common.usb_flags} ${common.usb_flags}
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX127X=1
-D RADIOLIB_EXCLUDE_SX128X=1
-D TTGO_T_Beam_S3_SUPREME_V3 -D TTGO_T_Beam_S3_SUPREME_V3
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
+1
View File
@@ -21,6 +21,7 @@
// LoRa Radio // LoRa Radio
#define HAS_SX1262 #define HAS_SX1262
#define HAS_TCXO
#define RADIO_SCLK_PIN 40 #define RADIO_SCLK_PIN 40
#define RADIO_MISO_PIN 38 #define RADIO_MISO_PIN 38
#define RADIO_MOSI_PIN 41 #define RADIO_MOSI_PIN 41
+3
View File
@@ -44,6 +44,9 @@ build_flags =
-D LOAD_FONT8 -D LOAD_FONT8
-D SPI_FREQUENCY=40000000 -D SPI_FREQUENCY=40000000
-D SPI_READ_FREQUENCY=16000000 -D SPI_READ_FREQUENCY=16000000
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX127X=1
-D RADIOLIB_EXCLUDE_SX128X=1
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
bodmer/TFT_eSPI @ 2.5.43 bodmer/TFT_eSPI @ 2.5.43
+1
View File
@@ -21,6 +21,7 @@
// LoRa Radio // LoRa Radio
#define HAS_SX1262 #define HAS_SX1262
#define HAS_TCXO
#define RADIO_SCLK_PIN 40 #define RADIO_SCLK_PIN 40
#define RADIO_MISO_PIN 38 #define RADIO_MISO_PIN 38
#define RADIO_MOSI_PIN 41 #define RADIO_MOSI_PIN 41
+3
View File
@@ -44,6 +44,9 @@ build_flags =
-D LOAD_FONT8 -D LOAD_FONT8
-D SPI_FREQUENCY=40000000 -D SPI_FREQUENCY=40000000
-D SPI_READ_FREQUENCY=16000000 -D SPI_READ_FREQUENCY=16000000
-D RADIOLIB_EXCLUDE_LR11X0=1
-D RADIOLIB_EXCLUDE_SX127X=1
-D RADIOLIB_EXCLUDE_SX128X=1
lib_deps = lib_deps =
${common.lib_deps} ${common.lib_deps}
bodmer/TFT_eSPI @ 2.5.43 bodmer/TFT_eSPI @ 2.5.43