mirror of
https://github.com/richonguzman/LoRa_APRS_iGate.git
synced 2026-03-28 16:52:33 +01:00
Compare commits
14 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5cda9a2285 | ||
|
|
194ae94a43 | ||
|
|
9baf066386 | ||
|
|
7595da21cd | ||
|
|
6be28b47ce | ||
|
|
3ea1a19a06 | ||
|
|
35cafac601 | ||
|
|
b59153d8df | ||
|
|
79b967034f | ||
|
|
a40502344f | ||
|
|
af1b623f7f | ||
|
|
0c7d13cf7d | ||
|
|
10798d2c9a | ||
|
|
3cc8fed15f |
@@ -54,6 +54,7 @@ ____________________________________________________
|
||||
|
||||
## Timeline (Versions):
|
||||
|
||||
- 2025-04-20000000
|
||||
- 2025.03.20 Manager List added to enable/disable DigiEcoMode and Tx Control. Thanks LB5JJ.
|
||||
- 2025.03.03 T-Beam Supreme board added and more BlackList rules added.
|
||||
- 2025.02.28 Heltec Wireless Paper with Epaper working. Thanks SzymonPriv for pointing to the right library.
|
||||
|
||||
@@ -8,10 +8,10 @@ namespace APRS_IS_Utils {
|
||||
|
||||
void upload(const String& line);
|
||||
void connect();
|
||||
|
||||
|
||||
void checkStatus();
|
||||
String checkForStartingBytes(const String& packet);
|
||||
|
||||
|
||||
String buildPacketToUpload(const String& packet);
|
||||
bool processReceivedLoRaMessage(const String& sender, const String& packet, bool thirdParty);
|
||||
void processLoRaPacket(const String& packet);
|
||||
|
||||
@@ -8,7 +8,7 @@ namespace BATTERY_Utils {
|
||||
|
||||
void adcCalibration();
|
||||
void adcCalibrationCheck();
|
||||
|
||||
|
||||
void setup();
|
||||
float checkInternalVoltage();
|
||||
float checkExternalVoltage();
|
||||
|
||||
@@ -152,7 +152,7 @@ public:
|
||||
WEBADMIN webadmin;
|
||||
NTP ntp;
|
||||
REMOTE_MANAGEMENT remoteManagement;
|
||||
|
||||
|
||||
void init();
|
||||
void writeFile();
|
||||
Configuration();
|
||||
|
||||
@@ -13,7 +13,6 @@ namespace LoRa_Utils {
|
||||
void changeFreqTx();
|
||||
void changeFreqRx();
|
||||
void wakeRadio();
|
||||
//void startReceive();
|
||||
void sleepRadio();
|
||||
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ namespace SLEEP_Utils {
|
||||
void setup();
|
||||
void checkWakeUpFlag();
|
||||
void startSleeping();
|
||||
void checkSerial();
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ namespace TNC_Utils {
|
||||
|
||||
void setup();
|
||||
void loop();
|
||||
|
||||
|
||||
void sendToClients(const String& packet);
|
||||
void sendToSerial(const String& packet);
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ namespace WIFI_Utils {
|
||||
void startWiFi();
|
||||
void checkAutoAPTimeout();
|
||||
void setup();
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -129,7 +129,7 @@
|
||||
delayATMessage = 0;
|
||||
} else if (ATMessage.indexOf(Config.callsign) >= 3 && !modemLoggedToAPRSIS && response.indexOf("OK") >= 0 && !stationBeacon) { // login info
|
||||
validAT = true;
|
||||
delayATMessage = 0;
|
||||
delayATMessage = 0;
|
||||
} else if (ATMessage.indexOf(Config.callsign) == 0 && !beaconSended && response.indexOf("OK") >= 0 && !stationBeacon) { // self beacon or querys
|
||||
validAT = true;
|
||||
i = 1;
|
||||
@@ -203,4 +203,5 @@
|
||||
delay(1);
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -48,7 +48,7 @@ ___________________________________________________________________*/
|
||||
#endif
|
||||
|
||||
|
||||
String versionDate = "2025-04-25";
|
||||
String versionDate = "2025-05-18";
|
||||
Configuration Config;
|
||||
WiFiClient espClient;
|
||||
#ifdef HAS_GPS
|
||||
@@ -105,6 +105,7 @@ void setup() {
|
||||
#endif
|
||||
Utils::checkRebootMode();
|
||||
APRS_IS_Utils::firstConnection();
|
||||
SLEEP_Utils::checkSerial();
|
||||
}
|
||||
|
||||
void loop() {
|
||||
|
||||
@@ -28,7 +28,7 @@ uint32_t lastRxTime = millis();
|
||||
bool passcodeValid = false;
|
||||
|
||||
#ifdef HAS_A7670
|
||||
extern bool stationBeacon;
|
||||
extern bool stationBeacon;
|
||||
#endif
|
||||
|
||||
|
||||
@@ -60,7 +60,7 @@ namespace APRS_IS_Utils {
|
||||
aprsAuth += Config.callsign;
|
||||
aprsAuth += " pass ";
|
||||
aprsAuth += Config.aprs_is.passcode;
|
||||
aprsAuth += " vers CA2RXU_iGate 2.3 filter ";
|
||||
aprsAuth += " vers CA2RXU_iGate 3.0 filter ";
|
||||
aprsAuth += Config.aprs_is.filter;
|
||||
upload(aprsAuth);
|
||||
}
|
||||
@@ -75,7 +75,7 @@ namespace APRS_IS_Utils {
|
||||
wifiState = "--";
|
||||
} else {
|
||||
wifiState = "AP";
|
||||
}
|
||||
}
|
||||
if (!Config.display.alwaysOn && Config.display.timeout != 0) {
|
||||
displayToggle(true);
|
||||
}
|
||||
@@ -136,7 +136,7 @@ namespace APRS_IS_Utils {
|
||||
ackMessage.concat(packet.substring(packet.indexOf("{") + 1));
|
||||
ackMessage.trim();
|
||||
//Serial.println(ackMessage);
|
||||
|
||||
|
||||
String addToBuffer = Config.callsign;
|
||||
addToBuffer += ">APLRG1";
|
||||
if (!thirdParty) addToBuffer += ",RFONLY";
|
||||
|
||||
@@ -157,7 +157,12 @@ namespace BATTERY_Utils {
|
||||
return (2 * (sampleSum/100) * adcReadingTransformation) + voltageDividerCorrection; // raw voltage without mapping
|
||||
}
|
||||
#else
|
||||
return (2 * (sampleSum/100) * adcReadingTransformation) + voltageDividerCorrection; // raw voltage without mapping
|
||||
#ifdef LIGHTGATEWAY_PLUS_1_0
|
||||
double inputDivider = (1.0 / (560.0 + 100.0)) * 100.0; // The voltage divider is a 560k + 100k resistor in series, 100k on the low side.
|
||||
return (((sampleSum/100) * adcReadingTransformation) / inputDivider) + 0.41;
|
||||
#else
|
||||
return (2 * (sampleSum/100) * adcReadingTransformation) + voltageDividerCorrection; // raw voltage without mapping
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
// return mapVoltage(voltage, 3.34, 4.71, 3.0, 4.2); // mapped voltage
|
||||
@@ -246,9 +251,7 @@ namespace BATTERY_Utils {
|
||||
String telemetry = "|";
|
||||
telemetry += generateEncodedTelemetryBytes(telemetryCounter, true, 0);
|
||||
telemetryCounter++;
|
||||
if (telemetryCounter == 1000) {
|
||||
telemetryCounter = 0;
|
||||
}
|
||||
if (telemetryCounter == 1000) telemetryCounter = 0;
|
||||
if (Config.battery.sendInternalVoltage) telemetry += generateEncodedTelemetryBytes(checkInternalVoltage(), false, 0);
|
||||
if (Config.battery.sendExternalVoltage) telemetry += generateEncodedTelemetryBytes(checkExternalVoltage(), false, 1);
|
||||
telemetry += "|";
|
||||
|
||||
@@ -116,7 +116,7 @@ namespace DIGI_Utils {
|
||||
}
|
||||
}
|
||||
|
||||
void processLoRaPacket(const String& packet) {
|
||||
void processLoRaPacket(const String& packet) {
|
||||
if (packet.indexOf("NOGATE") == -1) {
|
||||
bool thirdPartyPacket = false;
|
||||
String temp, Sender;
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
extern Configuration Config;
|
||||
|
||||
bool displayFound = false;
|
||||
|
||||
@@ -101,7 +101,7 @@ namespace GPS_Utils {
|
||||
}
|
||||
generateBeaconFirstPart();
|
||||
String encodedGPS = encodeGPS(Config.beacon.latitude, Config.beacon.longitude, Config.beacon.overlay, Config.beacon.symbol);
|
||||
iGateBeaconPacket += encodedGPS;
|
||||
iGateBeaconPacket += encodedGPS;
|
||||
iGateLoRaBeaconPacket += encodedGPS;
|
||||
}
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ bool transmitFlag = true;
|
||||
SX1262 radio = new Module(RADIO_CS_PIN, RADIO_DIO1_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN);
|
||||
#endif
|
||||
#ifdef HAS_SX1268
|
||||
#if defined(LIGHTGATEWAY_1_0)
|
||||
#if defined(LIGHTGATEWAY_1_0) || defined(LIGHTGATEWAY_PLUS_1_0)
|
||||
SPIClass loraSPI(FSPI);
|
||||
SX1268 radio = new Module(RADIO_CS_PIN, RADIO_DIO1_PIN, RADIO_RST_PIN, RADIO_BUSY_PIN, loraSPI);
|
||||
#else
|
||||
@@ -50,7 +50,7 @@ namespace LoRa_Utils {
|
||||
}
|
||||
|
||||
void setup() {
|
||||
#ifdef LIGHTGATEWAY_1_0
|
||||
#if defined (LIGHTGATEWAY_1_0) || defined(LIGHTGATEWAY_PLUS_1_0)
|
||||
pinMode(RADIO_VCC_PIN,OUTPUT);
|
||||
digitalWrite(RADIO_VCC_PIN,HIGH);
|
||||
loraSPI.begin(RADIO_SCLK_PIN, RADIO_MISO_PIN, RADIO_MOSI_PIN, RADIO_CS_PIN);
|
||||
@@ -69,11 +69,7 @@ namespace LoRa_Utils {
|
||||
while (true);
|
||||
}
|
||||
#if defined(HAS_SX1262) || defined(HAS_SX1268) || defined(HAS_LLCC68)
|
||||
//if (!Config.lowPowerMode) {
|
||||
radio.setDio1Action(setFlag);
|
||||
/*} else {
|
||||
radio.setDIOMapping(1, RADIOLIB_SX126X_IRQ_RX_DONE);
|
||||
}*/
|
||||
#endif
|
||||
#if defined(HAS_SX1278) || defined(HAS_SX1276)
|
||||
radio.setDio0Action(setFlag, RISING);
|
||||
@@ -84,7 +80,7 @@ namespace LoRa_Utils {
|
||||
radio.setCodingRate(Config.loramodule.codingRate4);
|
||||
radio.setCRC(true);
|
||||
|
||||
#if (defined(RADIO_RXEN) && defined(RADIO_TXEN)) || defined(LIGHTGATEWAY_1_0) // QRP Labs LightGateway has 400M22S (SX1268)
|
||||
#if (defined(RADIO_RXEN) && defined(RADIO_TXEN)) // QRP Labs LightGateway has 400M22S (SX1268)
|
||||
radio.setRfSwitchPins(RADIO_RXEN, RADIO_TXEN);
|
||||
#endif
|
||||
|
||||
@@ -203,7 +199,7 @@ namespace LoRa_Utils {
|
||||
}
|
||||
} else {
|
||||
packet = "";
|
||||
}
|
||||
}
|
||||
lastRxTime = millis();
|
||||
return packet;
|
||||
}
|
||||
|
||||
@@ -14,14 +14,14 @@ unsigned long ota_progress_millis = 0;
|
||||
|
||||
|
||||
namespace OTA_Utils {
|
||||
|
||||
|
||||
void setup(AsyncWebServer *server) {
|
||||
if (Config.ota.username != "" && Config.ota.password != "") {
|
||||
ElegantOTA.begin(server, Config.ota.username.c_str(), Config.ota.password.c_str());
|
||||
} else {
|
||||
ElegantOTA.begin(server);
|
||||
}
|
||||
|
||||
|
||||
ElegantOTA.setAutoReboot(true);
|
||||
ElegantOTA.onStart(onOTAStart);
|
||||
ElegantOTA.onProgress(onOTAProgress);
|
||||
@@ -55,8 +55,8 @@ namespace OTA_Utils {
|
||||
|
||||
Serial.println(success ? "OTA update finished successfully!" : "There was an error during OTA update!");
|
||||
displayShow("", "", statusMessage, "", rebootMessage, "", "", 4000);
|
||||
|
||||
|
||||
isUpdatingOTA = false;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -216,6 +216,7 @@ namespace POWER_Utils {
|
||||
|
||||
#ifdef INTERNAL_LED_PIN
|
||||
pinMode(INTERNAL_LED_PIN, OUTPUT);
|
||||
digitalWrite(INTERNAL_LED_PIN, LOW);
|
||||
#endif
|
||||
|
||||
if (Config.battery.sendExternalVoltage || Config.battery.monitorExternalVoltage) {
|
||||
@@ -223,30 +224,34 @@ namespace POWER_Utils {
|
||||
}
|
||||
|
||||
#ifdef VEXT_CTRL
|
||||
if (Config.digi.ecoMode != 1) {
|
||||
pinMode(VEXT_CTRL,OUTPUT); // GPS + TFT on HELTEC Wireless_Tracker and only for Oled in HELTEC V3
|
||||
#if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3)
|
||||
digitalWrite(VEXT_CTRL, HIGH);
|
||||
#endif
|
||||
#if defined(HELTEC_WP) || defined(HELTEC_WS) || defined(HELTEC_V3_2)
|
||||
digitalWrite(VEXT_CTRL, LOW);
|
||||
#endif
|
||||
}
|
||||
pinMode(VEXT_CTRL,OUTPUT); // GPS + TFT on HELTEC Wireless_Tracker and only for Oled in HELTEC V3
|
||||
#if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3)
|
||||
digitalWrite(VEXT_CTRL, Config.digi.ecoMode == 1 ? LOW : HIGH);
|
||||
#endif
|
||||
#if defined(HELTEC_WP) || defined(HELTEC_WS) || defined(HELTEC_V3_2) || defined(HELTEC_WSL_V3)
|
||||
digitalWrite(VEXT_CTRL, Config.digi.ecoMode == 1 ? HIGH : LOW);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef HAS_GPS
|
||||
if (Config.beacon.gpsActive && Config.digi.ecoMode != 1) activateGPS();
|
||||
#endif
|
||||
|
||||
#ifdef ADC_CTRL
|
||||
pinMode(ADC_CTRL, OUTPUT);
|
||||
#if defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V3_2)
|
||||
digitalWrite(ADC_CTRL, LOW);
|
||||
#endif
|
||||
#if defined(HELTEC_V3) || defined(HELTEC_V2) || defined(HELTEC_WSL_V3) || defined(HELTEC_WP)
|
||||
digitalWrite(ADC_CTRL, HIGH);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(HELTEC_WIRELESS_TRACKER)
|
||||
Wire.begin(BOARD_I2C_SDA, BOARD_I2C_SCL);
|
||||
#endif
|
||||
|
||||
#if defined(HELTEC_V3) || defined(HELTEC_V3_2) || defined(HELTEC_WS) || defined(LIGHTGATEWAY_1_0) || defined(TTGO_LORA32_T3S3_V1_2) || defined(HELTEC_V2)
|
||||
#if defined(HELTEC_V3) || defined(HELTEC_V3_2) || defined(HELTEC_WS) || defined(LIGHTGATEWAY_1_0) || defined(LIGHTGATEWAY_PLUS_1_0) || defined(TTGO_LORA32_T3S3_V1_2) || defined(HELTEC_V2)
|
||||
Wire.begin(OLED_SDA, OLED_SCL);
|
||||
#endif
|
||||
|
||||
@@ -269,7 +274,7 @@ namespace POWER_Utils {
|
||||
delay(500);
|
||||
Wire.begin(BOARD_I2C_SDA, BOARD_I2C_SCL);
|
||||
#endif
|
||||
|
||||
|
||||
delay(1000);
|
||||
BATTERY_Utils::setup();
|
||||
BATTERY_Utils::startupBatteryHealth();
|
||||
|
||||
@@ -24,7 +24,7 @@ namespace QUERY_Utils {
|
||||
if (queryQuestion == "?APRS?" || queryQuestion == "H" || queryQuestion == "HELP" || queryQuestion=="?") {
|
||||
answer.concat("?APRSV ?APRSP ?APRSL ?APRSSSR ?EM=? ?TX=? "); // ?APRSH ?WHERE callsign
|
||||
} else if (queryQuestion == "?APRSV") {
|
||||
answer.concat("CA2RXU_LoRa_iGate 2.3 v");
|
||||
answer.concat("CA2RXU_LoRa_iGate 3.0 v");
|
||||
answer.concat(versionDate);
|
||||
} else if (queryQuestion == "?APRSP") {
|
||||
answer.concat("iGate QTH: ");
|
||||
@@ -113,7 +113,7 @@ namespace QUERY_Utils {
|
||||
Config.writeFile();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (answer == "") return "";
|
||||
|
||||
String queryAnswer = Config.callsign;
|
||||
|
||||
@@ -27,13 +27,12 @@ namespace SLEEP_Utils {
|
||||
wakeUpFlag = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void setup() {
|
||||
if (Config.digi.ecoMode == 1) {
|
||||
pinMode(RADIO_WAKEUP_PIN, INPUT);
|
||||
attachInterrupt(digitalPinToInterrupt(RADIO_WAKEUP_PIN), wakeUpLoRaPacketReceived, RISING);
|
||||
LoRa_Utils::wakeRadio();
|
||||
#if defined(TTGO_LORA32_V2_1) || defined(TTGO_LORA32_V2_1_915) || defined(TTGO_LORA32_T3S3_V1_2) || defined(TTGO_T_BEAM_V1_0) || defined(TTGO_T_BEAM_V1_0_915) || defined(TTGO_T_BEAM_V1_0_SX1268) || defined(TTGO_T_BEAM_V1_2) || defined(TTGO_T_BEAM_V1_2_915) || defined(TTGO_T_BEAM_V1_2_SX1262) || defined(TTGO_T_DECK_PLUS) || defined(TTGO_T_DECK_GPS) || defined(TTGO_T_Beam_S3_SUPREME_V3) || defined(HELTEC_V3) || defined(HELTEC_V3_2) || defined(HELTEC_WP) || defined(HELTEC_WS) || defined(HELTEC_WSL_V3) || defined(HELTEC_WSL_V3_DISPLAY) || defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V2) || defined(XIAO_ESP32S3_LORA) || defined(LIGHTGATEWAY_1_0) || defined(TROY_LoRa_APRS) || defined(OE5HWN_MeshCom) || defined(ESP32_DIY_LoRa) || defined(ESP32_DIY_LoRa_915) || defined(ESP32_DIY_1W_LoRa) || defined(ESP32_DIY_1W_LoRa_915) || defined(ESP32_DIY_1W_LoRa_LLCC68) || defined(ESP32_DIY_1W_LoRa_Mesh_V1_2) || defined(WEMOS_S2_MINI_DIY_LoRa) || defined(WEMOS_D1_R32_RA02) || defined(WEMOS_LOLIN32_OLED_DIY_LoRa)
|
||||
#if defined(TTGO_LORA32_V2_1) || defined(TTGO_LORA32_V2_1_915) || defined(TTGO_LORA32_T3S3_V1_2) || defined(TTGO_T_BEAM_V1_0) || defined(TTGO_T_BEAM_V1_0_915) || defined(TTGO_T_BEAM_V1_0_SX1268) || defined(TTGO_T_BEAM_V1_2) || defined(TTGO_T_BEAM_V1_2_915) || defined(TTGO_T_BEAM_V1_2_SX1262) || defined(TTGO_T_DECK_PLUS) || defined(TTGO_T_DECK_GPS) || defined(TTGO_T_Beam_S3_SUPREME_V3) || defined(HELTEC_V3) || defined(HELTEC_V3_2) || defined(HELTEC_WP) || defined(HELTEC_WS) || defined(HELTEC_WSL_V3) || defined(HELTEC_WSL_V3_DISPLAY) || defined(HELTEC_WIRELESS_TRACKER) || defined(HELTEC_V2) || defined(XIAO_ESP32S3_LORA) || defined(LIGHTGATEWAY_1_0) || defined(LIGHTGATEWAY_PLUS_1_0) || defined(TROY_LoRa_APRS) || defined(OE5HWN_MeshCom) || defined(ESP32_DIY_LoRa) || defined(ESP32_DIY_LoRa_915) || defined(ESP32_DIY_1W_LoRa) || defined(ESP32_DIY_1W_LoRa_915) || defined(ESP32_DIY_1W_LoRa_LLCC68) || defined(ESP32_DIY_1W_LoRa_Mesh_V1_2) || defined(WEMOS_S2_MINI_DIY_LoRa) || defined(WEMOS_D1_R32_RA02) || defined(WEMOS_LOLIN32_OLED_DIY_LoRa)
|
||||
esp_sleep_enable_ext1_wakeup(GPIO_WAKEUP_PIN, ESP_EXT1_WAKEUP_ANY_HIGH);
|
||||
#endif
|
||||
#if defined(HELTEC_HTCT62) || defined(ESP32C3_DIY_1W_LoRa) || defined(ESP32C3_DIY_1W_LoRa_915) || defined(ESP32_C3_OctopusLab_LoRa)
|
||||
@@ -57,7 +56,10 @@ namespace SLEEP_Utils {
|
||||
LoRa_Utils::wakeRadio();
|
||||
esp_light_sleep_start();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void checkSerial() {
|
||||
if (Config.digi.ecoMode == 1) Serial.end();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -58,10 +58,10 @@ namespace STATION_Utils {
|
||||
if (callsign.startsWith(wildcard)) return true;
|
||||
} else {
|
||||
if (list[i] == callsign) return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool isBlacklisted(const String& callsign) {
|
||||
return checkCallsignList(blacklist, callsign);
|
||||
@@ -94,7 +94,7 @@ namespace STATION_Utils {
|
||||
lastHeardObjects.emplace_back(LastHeardStation{millis(), object}); // Add new object and Tx
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void deleteNotHeard() {
|
||||
std::vector<LastHeardStation> lastHeardStation_temp;
|
||||
for (int i = 0; i < lastHeardStations.size(); i++) {
|
||||
@@ -149,13 +149,13 @@ namespace STATION_Utils {
|
||||
return true;
|
||||
}
|
||||
|
||||
void processOutputPacketBufferUltraEcoMode() {
|
||||
void processOutputPacketBufferUltraEcoMode() {
|
||||
size_t currentIndex = 0;
|
||||
while (currentIndex < outputPacketBuffer.size()) { // this sends all packets from output buffer
|
||||
delay(3000); // and cleans buffer to avoid sending packets with time offset
|
||||
LoRa_Utils::sendNewPacket(outputPacketBuffer[currentIndex]); // next time it wakes up
|
||||
currentIndex++;
|
||||
}
|
||||
}
|
||||
outputPacketBuffer.clear();
|
||||
//
|
||||
if (saveNewDigiEcoModeConfig) {
|
||||
|
||||
@@ -16,8 +16,8 @@ namespace SYSLOG_Utils {
|
||||
if (Config.syslog.active && WiFi.status() == WL_CONNECTED) {
|
||||
String syslogPacket = "<165>1 - ";
|
||||
syslogPacket.concat(Config.callsign);
|
||||
syslogPacket.concat(" CA2RXU_LoRa_iGate_1.3 - - - "); //RFC5424 The Syslog Protocol
|
||||
|
||||
syslogPacket.concat(" CA2RXU_LoRa_iGate_3.0 - - - "); //RFC5424 The Syslog Protocol
|
||||
|
||||
char signalData[35];
|
||||
snprintf(signalData, sizeof(signalData), " / %ddBm / %.2fdB / %dHz", rssi, snr, freqError);
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@ namespace TNC_Utils {
|
||||
void handleInputData(char character, int bufferIndex) {
|
||||
String* data = (bufferIndex == -1) ? &inputSerialBuffer : &inputServerBuffer[bufferIndex];
|
||||
if (data->length() == 0 && character != (char)FEND) return;
|
||||
|
||||
|
||||
data->concat(character);
|
||||
|
||||
if (character == (char)FEND && data->length() > 3) {
|
||||
|
||||
@@ -189,7 +189,7 @@ namespace Utils {
|
||||
void checkBeaconInterval() {
|
||||
uint32_t lastTx = millis() - lastBeaconTx;
|
||||
if (lastBeaconTx == 0 || lastTx >= Config.beacon.interval * 60 * 1000) {
|
||||
beaconUpdate = true;
|
||||
beaconUpdate = true;
|
||||
}
|
||||
|
||||
#ifdef HAS_GPS
|
||||
@@ -229,7 +229,7 @@ namespace Utils {
|
||||
#endif
|
||||
|
||||
if (Config.wxsensor.active) {
|
||||
const char* sensorData = (wxModuleType == 0) ? ".../...g...t..." : WX_Utils::readDataSensor().c_str();
|
||||
String sensorData = (wxModuleType == 0) ? ".../...g...t..." : WX_Utils::readDataSensor();
|
||||
beaconPacket += sensorData;
|
||||
secondaryBeaconPacket += sensorData;
|
||||
}
|
||||
|
||||
@@ -115,7 +115,7 @@ namespace WEB_Utils {
|
||||
|
||||
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();
|
||||
@@ -175,7 +175,7 @@ namespace WEB_Utils {
|
||||
Config.battery.externalSleepVoltage = request->getParam("battery.externalSleepVoltage", true)->value().toFloat();
|
||||
|
||||
Config.battery.sendVoltageAsTelemetry = request->hasParam("battery.sendVoltageAsTelemetry", true);
|
||||
|
||||
|
||||
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();
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
#include <TinyGPS++.h>
|
||||
#ifdef LIGHTGATEWAY_PLUS_1_0
|
||||
#include "Adafruit_SHTC3.h"
|
||||
#endif
|
||||
#include "configuration.h"
|
||||
#include "board_pinout.h"
|
||||
#include "wx_utils.h"
|
||||
@@ -23,11 +26,14 @@ float newHum, newTemp, newPress, newGas;
|
||||
Adafruit_BME280 bme280;
|
||||
#if defined(HELTEC_V3) || defined(HELTEC_V3_2)
|
||||
Adafruit_BMP280 bmp280(&Wire1);
|
||||
Adafruit_Si7021 sensor = Adafruit_Si7021();
|
||||
Adafruit_Si7021 sensor = Adafruit_Si7021();
|
||||
#else
|
||||
Adafruit_BMP280 bmp280;
|
||||
Adafruit_BME680 bme680;
|
||||
Adafruit_Si7021 sensor = Adafruit_Si7021();
|
||||
Adafruit_Si7021 si7021 = Adafruit_Si7021();
|
||||
#endif
|
||||
#ifdef LIGHTGATEWAY_PLUS_1_0
|
||||
Adafruit_SHTC3 shtc3 = Adafruit_SHTC3();
|
||||
#endif
|
||||
|
||||
|
||||
@@ -41,16 +47,23 @@ namespace WX_Utils {
|
||||
err = Wire1.endTransmission();
|
||||
#else
|
||||
Wire.beginTransmission(addr);
|
||||
#ifdef LIGHTGATEWAY_PLUS_1_0
|
||||
Wire.write(0x35);
|
||||
Wire.write(0x17);
|
||||
#endif
|
||||
err = Wire.endTransmission();
|
||||
#endif
|
||||
if (err == 0) {
|
||||
//Serial.println(addr); this shows any connected board to I2C
|
||||
if (addr == 0x76 || addr == 0x77) { // BME/BMP
|
||||
//Serial.println(addr); //this shows any connected board to I2C
|
||||
if (addr == 0x76 || addr == 0x77) { // BME or BMP
|
||||
wxModuleAddress = addr;
|
||||
return;
|
||||
} else if (addr == 0x40) { // Si7011
|
||||
wxModuleAddress = addr;
|
||||
return;
|
||||
} else if (addr == 0x70) { // SHTC3
|
||||
wxModuleAddress = addr;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -65,40 +78,49 @@ namespace WX_Utils {
|
||||
#if defined(HELTEC_V3) || defined(HELTEC_V3_2) || defined(HELTEC_WSL_V3) || defined(HELTEC_WSL_V3_DISPLAY)
|
||||
if (bme280.begin(wxModuleAddress, &Wire1)) {
|
||||
Serial.println("BME280 sensor found");
|
||||
wxModuleType = 1;
|
||||
wxModuleFound = true;
|
||||
wxModuleType = 1;
|
||||
wxModuleFound = true;
|
||||
}
|
||||
#else
|
||||
if (bme280.begin(wxModuleAddress)) {
|
||||
Serial.println("BME280 sensor found");
|
||||
wxModuleType = 1;
|
||||
wxModuleFound = true;
|
||||
wxModuleType = 1;
|
||||
wxModuleFound = true;
|
||||
}
|
||||
if (!wxModuleFound) {
|
||||
if (bme680.begin(wxModuleAddress)) {
|
||||
Serial.println("BME680 sensor found");
|
||||
wxModuleType = 3;
|
||||
wxModuleFound = true;
|
||||
wxModuleType = 3;
|
||||
wxModuleFound = true;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (!wxModuleFound) {
|
||||
if (bmp280.begin(wxModuleAddress)) {
|
||||
Serial.println("BMP280 sensor found");
|
||||
wxModuleType = 2;
|
||||
wxModuleFound = true;
|
||||
wxModuleType = 2;
|
||||
wxModuleFound = true;
|
||||
}
|
||||
}
|
||||
} else if (wxModuleAddress == 0x40) {
|
||||
if(sensor.begin()) {
|
||||
if(si7021.begin()) {
|
||||
Serial.println("Si7021 sensor found");
|
||||
wxModuleType = 4;
|
||||
wxModuleFound = true;
|
||||
wxModuleType = 4;
|
||||
wxModuleFound = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
#ifdef LIGHTGATEWAY_PLUS_1_0
|
||||
else if (wxModuleAddress == 0x70) {
|
||||
if (shtc3.begin()) {
|
||||
Serial.println("SHTC3 sensor found");
|
||||
wxModuleType = 5;
|
||||
wxModuleFound = true;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (!wxModuleFound) {
|
||||
displayShow("ERROR", "", "BME/BMP/Si7021 sensor active", "but no sensor found...", 2000);
|
||||
Serial.println("BME/BMP/Si7021 sensor Active in config but not found! Check Wiring");
|
||||
displayShow("ERROR", "", "BME/BMP/Si7021/SHTC3 sensor active", "but no sensor found...", 2000);
|
||||
Serial.println("BME/BMP/Si7021/SHTC3 sensor Active in config but not found! Check Wiring");
|
||||
} else {
|
||||
switch (wxModuleType) {
|
||||
case 1:
|
||||
@@ -211,9 +233,18 @@ namespace WX_Utils {
|
||||
#endif
|
||||
break;
|
||||
case 4: // Si7021
|
||||
newTemp = sensor.readTemperature();
|
||||
newTemp = si7021.readTemperature();
|
||||
newHum = si7021.readHumidity();
|
||||
newPress = 0;
|
||||
newHum = sensor.readHumidity();
|
||||
break;
|
||||
case 5: // SHTC3
|
||||
#ifdef LIGHTGATEWAY_PLUS_1_0
|
||||
sensors_event_t humidity, temp;
|
||||
shtc3.getEvent(&humidity, &temp);
|
||||
newTemp = temp.temperature;
|
||||
newHum = humidity.relative_humidity;
|
||||
newPress = 0;
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -225,20 +256,20 @@ namespace WX_Utils {
|
||||
String tempStr = generateTempString(((newTemp + Config.wxsensor.temperatureCorrection) * 1.8) + 32);
|
||||
|
||||
String humStr;
|
||||
if (wxModuleType == 1 || wxModuleType == 3 || wxModuleType == 4) {
|
||||
if (wxModuleType == 1 || wxModuleType == 3 || wxModuleType == 4 || wxModuleType == 5) {
|
||||
humStr = generateHumString(newHum);
|
||||
} else if (wxModuleType == 2) {
|
||||
humStr = "..";
|
||||
}
|
||||
|
||||
String presStr = (wxModuleAddress == 4)
|
||||
String presStr = (wxModuleType == 4 || wxModuleType == 5)
|
||||
? "....."
|
||||
#ifdef HAS_GPS
|
||||
: generatePresString(newPress + (gps.altitude.meters() / CORRECTION_FACTOR));
|
||||
#else
|
||||
: generatePresString(newPress + (Config.wxsensor.heightCorrection / CORRECTION_FACTOR));
|
||||
#endif
|
||||
|
||||
|
||||
fifthLine = "BME-> ";
|
||||
fifthLine += String(int(newTemp + Config.wxsensor.temperatureCorrection));
|
||||
fifthLine += "C ";
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
#define RADIO_RST_PIN -1
|
||||
#define RADIO_BUSY_PIN 8
|
||||
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
|
||||
#define GPIO_WAKEUP_PIN RADIO_DIO1_PIN
|
||||
#define GPIO_WAKEUP_PIN GPIO_NUM_3
|
||||
|
||||
// Display
|
||||
#define HAS_DISPLAY
|
||||
|
||||
36
variants/QRPLabs_LightGateway_Plus_1_0/board_pinout.h
Normal file
36
variants/QRPLabs_LightGateway_Plus_1_0/board_pinout.h
Normal file
@@ -0,0 +1,36 @@
|
||||
#ifndef BOARD_PINOUT_H_
|
||||
#define BOARD_PINOUT_H_
|
||||
|
||||
// LoRa Radio
|
||||
#define HAS_SX1268
|
||||
#define HAS_1W_LORA
|
||||
#define RADIO_VCC_PIN 21
|
||||
#define RADIO_SCLK_PIN 12
|
||||
#define RADIO_MISO_PIN 13
|
||||
#define RADIO_MOSI_PIN 11
|
||||
#define RADIO_CS_PIN 10
|
||||
#define RADIO_RST_PIN 9
|
||||
#define RADIO_DIO1_PIN 5
|
||||
#define RADIO_BUSY_PIN 6
|
||||
#define RADIO_RXEN 42
|
||||
#define RADIO_TXEN 14
|
||||
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
|
||||
#define GPIO_WAKEUP_PIN GPIO_SEL_5
|
||||
|
||||
// Display
|
||||
#define HAS_DISPLAY
|
||||
|
||||
#undef OLED_SDA
|
||||
#undef OLED_SCL
|
||||
#undef OLED_RST
|
||||
|
||||
#define OLED_SDA 3
|
||||
#define OLED_SCL 4
|
||||
#define OLED_RST -1 // Reset pin # (or -1 if sharing Arduino reset pin)
|
||||
|
||||
// Aditional Config
|
||||
#define INTERNAL_LED_PIN 16
|
||||
#define BATTERY_PIN 1
|
||||
#define BUTTON_PIN 0
|
||||
|
||||
#endif
|
||||
11
variants/QRPLabs_LightGateway_Plus_1_0/platformio.ini
Normal file
11
variants/QRPLabs_LightGateway_Plus_1_0/platformio.ini
Normal file
@@ -0,0 +1,11 @@
|
||||
[env:QRPLabs_LightGateway_Plus_1_0]
|
||||
board = esp32-s3-devkitc-1
|
||||
board_build.mcu = esp32s3
|
||||
build_flags =
|
||||
${common.build_flags}
|
||||
${common.usb_flags}
|
||||
-D LIGHTGATEWAY_PLUS_1_0
|
||||
lib_deps =
|
||||
${common.lib_deps}
|
||||
${common.display_libs}
|
||||
adafruit/Adafruit SHTC3 Library @ 1.0.1
|
||||
@@ -14,6 +14,6 @@
|
||||
#define RADIO_RXEN 6
|
||||
#define RADIO_TXEN 7
|
||||
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
|
||||
#define GPIO_WAKEUP_PIN RADIO_DIO1_PIN
|
||||
#define GPIO_WAKEUP_PIN GPIO_NUM_2
|
||||
|
||||
#endif
|
||||
@@ -14,6 +14,6 @@
|
||||
#define RADIO_RXEN 6
|
||||
#define RADIO_TXEN 7
|
||||
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
|
||||
#define GPIO_WAKEUP_PIN RADIO_DIO1_PIN
|
||||
#define GPIO_WAKEUP_PIN GPIO_NUM_2
|
||||
|
||||
#endif
|
||||
@@ -11,7 +11,7 @@
|
||||
#define RADIO_DIO1_PIN 3
|
||||
#define RADIO_BUSY_PIN 4
|
||||
#define RADIO_WAKEUP_PIN RADIO_DIO1_PIN
|
||||
#define GPIO_WAKEUP_PIN RADIO_DIO1_PIN
|
||||
#define GPIO_WAKEUP_PIN GPIO_NUM_3
|
||||
|
||||
// Aditional Config
|
||||
#define BATTERY_PIN 1
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
[env:heltec_ht-ct62]
|
||||
board = heltec_wireless_stick_lite
|
||||
board = esp32-c3-devkitm-1
|
||||
board_build.mcu = esp32c3
|
||||
build_flags =
|
||||
${common.build_flags}
|
||||
|
||||
Reference in New Issue
Block a user