From 8125eb9d02809615ff6dc1043dd1a82ef58b2338 Mon Sep 17 00:00:00 2001 From: richonguzman Date: Mon, 27 Mar 2023 00:32:27 -0300 Subject: [PATCH] 1.3 --- data/igate_conf.json | 2 +- src/LoRa_APRS_iGate.cpp | 124 ++++++++++++++++++++++++++-------------- src/display.cpp | 9 ++- src/iGate_config_OLD.h | 12 ---- src/igate_config.cpp | 72 ----------------------- src/pins_config.h | 5 +- 6 files changed, 92 insertions(+), 132 deletions(-) delete mode 100644 src/iGate_config_OLD.h delete mode 100644 src/igate_config.cpp diff --git a/data/igate_conf.json b/data/igate_conf.json index 87f161a..b350d8b 100644 --- a/data/igate_conf.json +++ b/data/igate_conf.json @@ -20,7 +20,7 @@ "aprs_is": { "active": true, "passcode": "23201", - "server": "radioaficion.pro", + "server": "soam.aprs2.net", "port": 14580, "software_name" : "ESP32_LoRa_iGate", "software_version" : "0.0.9", diff --git a/src/LoRa_APRS_iGate.cpp b/src/LoRa_APRS_iGate.cpp index 0e04b32..6a14e23 100644 --- a/src/LoRa_APRS_iGate.cpp +++ b/src/LoRa_APRS_iGate.cpp @@ -9,7 +9,6 @@ #include "pins_config.h" #include "igate_config.h" #include "display.h" -#include "iGate_config_OLD.h" WiFiClient espClient; String ConfigurationFilePath = "/igate_conf.json"; @@ -20,7 +19,6 @@ uint32_t lastTxTime = 0; static bool beacon_update = true; unsigned long previousWiFiMillis = 0; static uint32_t lastRxTxTime = millis(); -//static bool displayEcoMode = true; static int myWiFiAPIndex = 1; int myWiFiAPSize = Config.wifiAPs.size(); @@ -30,14 +28,28 @@ String firstLine, secondLine, thirdLine, fourthLine; void setup_wifi() { int status = WL_IDLE_STATUS; - Serial.print("\nConnecting to '"); Serial.print(currentWiFi->ssid); Serial.println("' WiFi ..."); + Serial.print("\nConnect to WiFi '"); Serial.print(currentWiFi->ssid); Serial.println("' ..."); + show_display(" ", "Connect to Wifi:", currentWiFi->ssid + " ...", 0); WiFi.mode(WIFI_STA); WiFi.disconnect(); delay(100); + unsigned long start = millis(); WiFi.begin(currentWiFi->ssid.c_str(), currentWiFi->password.c_str()); while (WiFi.status() != WL_CONNECTED) { Serial.print('.'); delay(1000); + if ((millis() - start) > 15000){ + if(myWiFiAPIndex >= (myWiFiAPSize-1)) { + myWiFiAPIndex = 0; + } else { + myWiFiAPIndex++; + } + currentWiFi = &Config.wifiAPs[myWiFiAPIndex]; + start = millis(); + Serial.print("\nConnect to WiFi '"); Serial.print(currentWiFi->ssid); Serial.println("' ..."); + show_display(" ", "Connect to Wifi:", currentWiFi->ssid + " ...", 0); + WiFi.begin(currentWiFi->ssid.c_str(), currentWiFi->password.c_str()); + } } Serial.print("Connected as "); Serial.println(WiFi.localIP()); @@ -88,7 +100,7 @@ String createAPRSPacket(String unprocessedPacket) { int two_dots_position = unprocessedPacket.indexOf(':'); callsign_and_path_tracker = unprocessedPacket.substring(3, two_dots_position); payload_tracker = unprocessedPacket.substring(two_dots_position); - processedPacket = callsign_and_path_tracker + ",qAO," + Config.callsign + payload_tracker + "\n"; + processedPacket = callsign_and_path_tracker + ",qAC," + Config.callsign + payload_tracker + "\n"; return processedPacket; } @@ -102,11 +114,11 @@ void validate_and_upload(String packet) { espClient.write(aprsPacket.c_str()); Serial.print("Message uploaded : "); Serial.println(aprsPacket); if (aprsPacket.indexOf("::") >= 10) { - show_display("LoRa iGate: " + Config.callsign, secondLine, String(aprsPacket.substring(0,aprsPacket.indexOf(">"))) + " MESSAGE", 1000); + show_display("LoRa iGate: " + Config.callsign, secondLine, "Callsign = " + String(aprsPacket.substring(0,aprsPacket.indexOf(">"))), "Type --> MESSAGE", 1000); } else if (aprsPacket.indexOf(":>") >= 10) { - show_display("LoRa iGate: " + Config.callsign, secondLine, String(aprsPacket.substring(0,aprsPacket.indexOf(">"))) + " NEW STATUS", 1000); + show_display("LoRa iGate: " + Config.callsign, secondLine, "Callsign = " + String(aprsPacket.substring(0,aprsPacket.indexOf(">"))), "Type --> NEW STATUS", 1000); } else { - show_display("LoRa iGate: " + Config.callsign, secondLine, String(aprsPacket.substring(0,aprsPacket.indexOf(">"))) + " GPS BEACON", 1000); + show_display("LoRa iGate: " + Config.callsign, secondLine, "Callsign = " + String(aprsPacket.substring(0,aprsPacket.indexOf(">"))), "Type --> GPS BEACON", 1000); } } else { @@ -123,35 +135,63 @@ String process_aprsisPacket(String aprsisMessage) { return newLoraPacket; } -/*void showConfig() { - Serial.println(myWiFiAPSize); - Serial.println(myWiFiAPIndex); - if(myWiFiAPIndex >= (myWiFiAPSize-1)) { - myWiFiAPIndex = 0; +String double2string(double n, int ndec) { + String r = ""; + int v = n; + r += v; + r += '.'; + int i; + for (i=0;issid); - Serial.println(currentWiFi->password); - Serial.println(currentWiFi->latitude); - Serial.println(currentWiFi->longitude); - Serial.println(Config.callsign); - Serial.println(Config.comment); - Serial.println(Config.aprs_is.active); - Serial.println(Config.aprs_is.passcode); - Serial.println(Config.aprs_is.server); - Serial.println(Config.aprs_is.port); - Serial.println(Config.loramodule.frequency); - Serial.println(Config.loramodule.spreading_factor); - Serial.println(Config.loramodule.signal_bandwidth); - Serial.println(Config.loramodule.coding_rate4); - Serial.println(Config.loramodule.power); - Serial.println(Config.display.always_on); - Serial.println(Config.display.timeout); - Serial.println(" "); -}*/ + convDeg = abs(degrees.toFloat()) - abs(int(degrees.toFloat())); + convDeg2 = (convDeg * 60)/100; + convDeg3 = String(convDeg2,6); + latitude += convDeg3.substring(convDeg3.indexOf(".")+1,convDeg3.indexOf(".")+3) + "." + convDeg3.substring(convDeg3.indexOf(".")+3,convDeg3.indexOf(".")+5); + latitude += north_south; + return latitude; +} + +String create_lng_aprs(double lng) { + String degrees = double2string(lng,6); + String east_west, longitude, convDeg3; + float convDeg, convDeg2; + + if (abs(degrees.toFloat()) < 100) { + longitude += "0"; + } + if (degrees.indexOf("-") == 0) { + east_west = "W"; + longitude += degrees.substring(1,degrees.indexOf(".")); + } else { + east_west = "E"; + longitude += degrees.substring(0,degrees.indexOf(".")); + } + convDeg = abs(degrees.toFloat()) - abs(int(degrees.toFloat())); + convDeg2 = (convDeg * 60)/100; + convDeg3 = String(convDeg2,6); + longitude += convDeg3.substring(convDeg3.indexOf(".")+1,convDeg3.indexOf(".")+3) + "." + convDeg3.substring(convDeg3.indexOf(".")+3,convDeg3.indexOf(".")+5); + longitude += east_west; + return longitude; +} void setup() { Serial.begin(115200); @@ -163,35 +203,34 @@ void setup() { } void loop() { - //showConfig(); - //delay(2000); - String wifiState, aprsisState; + String wifiState, aprsisState, iGateLatitude, iGateLongitude; firstLine = "LoRa iGate: " + Config.callsign; secondLine = " "; thirdLine = " "; fourthLine = " "; unsigned long currentWiFiMillis = millis(); - if ((WiFi.status() != WL_CONNECTED) && (currentWiFiMillis - previousWiFiMillis >= WifiCheckInterval)) { // if WiFi is down, try reconnecting + if ((WiFi.status() != WL_CONNECTED) && (currentWiFiMillis - previousWiFiMillis >= 30000)) { Serial.print(millis()); Serial.println("Reconnecting to WiFi..."); WiFi.disconnect(); WiFi.reconnect(); previousWiFiMillis = currentWiFiMillis; } + if (!espClient.connected()) { APRS_IS_connect(); } + if (WiFi.status() == WL_CONNECTED) wifiState = "OK"; else wifiState = "--"; display_toggle(true); lastRxTxTime = millis(); if (espClient.connected()) aprsisState = "OK"; else aprsisState = "--"; display_toggle(true); lastRxTxTime = millis(); - secondLine = "WiFi: " + wifiState + "/ APRS-IS: " + aprsisState; show_display(firstLine, secondLine, thirdLine, fourthLine, 0); while (espClient.connected()) { uint32_t lastRxTx = millis() - lastRxTxTime; - if (Config.display.always_on) { + if (!Config.display.always_on) { if (lastRxTx >= Config.display.timeout*1000) { display_toggle(false); } @@ -207,8 +246,9 @@ void loop() { if (beacon_update) { display_toggle(true); Serial.println("---- Sending iGate Beacon ----"); - //String iGateBeaconPacket = Config.callsign + ">APRS,TCPIP*,qAC,CHILE:=" + currentWiFi->latitude + "L" + currentWiFi->longitude + "&" + Config.comment; - String iGateBeaconPacket = Config.callsign + ">APRS,TCPIP*,qAC,CHILE:=" + Latitude + "L" + Longitude + "&" + Config.comment + "\n"; + iGateLatitude = create_lat_aprs(currentWiFi->latitude); + iGateLongitude = create_lng_aprs(currentWiFi->longitude); + String iGateBeaconPacket = Config.callsign + ">APRS,TCPIP*,qAO:=" + iGateLatitude + "L" + iGateLongitude + "&" + Config.comment + "\n"; //Serial.println(iGateBeaconPacket); espClient.write(iGateBeaconPacket.c_str()); lastTxTime = millis(); diff --git a/src/display.cpp b/src/display.cpp index 15cadde..4118d25 100644 --- a/src/display.cpp +++ b/src/display.cpp @@ -18,12 +18,17 @@ void setup_display() { display.clearDisplay(); display.setTextColor(WHITE); - display.setTextSize(0); + display.setTextSize(1); display.setCursor(0, 0); - display.print("LORA iGate by CD2RXU"); + display.print(" LoRa APRS iGate"); + display.setCursor(0, 8); + display.print(" ( CD2RXU )"); + display.setCursor(0, 16); + display.print(" by Richonguzman"); display.ssd1306_command(SSD1306_SETCONTRAST); display.ssd1306_command(1); display.display(); + delay(4000); } void display_toggle(bool toggle) { diff --git a/src/iGate_config_OLD.h b/src/iGate_config_OLD.h deleted file mode 100644 index ac1d206..0000000 --- a/src/iGate_config_OLD.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef IGATE_CONFIG_H_ -#define IGATE_CONFIG_H_ - -#include - -#define WifiCheckInterval 60000 // wificheck after one minute -const String Latitude = "3302.02S"; // write your own iGate latitude and longitude -const String Longitude = "07134.42W"; - -//#define BeaconInterval 900000 // 15 minutes = 900000 seg - -#endif \ No newline at end of file diff --git a/src/igate_config.cpp b/src/igate_config.cpp deleted file mode 100644 index 5734167..0000000 --- a/src/igate_config.cpp +++ /dev/null @@ -1,72 +0,0 @@ -#include "igate_config.h" -/*#include "Arduino.h" -#include -#include -#include -#include - -/*class WiFi_AP { -public: - String ssid; - String password; - double latitude; - double longitude; -}; - -class Configuration { -public: - //std::vector wifiAPs; - - Configuration(String &filePath) { - _filePath = filePath; - if (!SPIFFS.begin(false)) { - Serial.println("SPIFFS Mount Failed"); - return; - } - readFile(SPIFFS, _filePath.c_str()); - } - -private: - String _filePath; - - void readFile(fs::FS &fs, const char *fileName) { - StaticJsonDocument<1024> data; - File configFile = fs.open(fileName, "r"); - DeserializationError error = deserializeJson(data, configFile); - if (error) { - Serial.println("Failed to read file, using default configuration"); - } - - Configuration conf; - - conf.callsign = data["callsign"]; - conf.comment = data["comment"]; - - JsonArray WiFiArray = doc["wifi"]["AP"]; - for (int i = 0; i < WiFiArray.size(); i++) { - WiFi_AP wifi; - wifi.ssid = WiFiArray[i]["wifi"]["AP"]["SSID"].as(); - wifi.password = WiFiArray[i]["wifi"]["AP"]["Password"].as(); - wifi.latitude = WiFiArray[i]["wifi"]["AP"]["Latitude"].as(); - wifi.longitude = WiFiArray[i]["wifi"]["AP"]["Longitude"].as(); - - conf.wifiAPs.push_back(wifi); - } - - conf.aprs_is.active = data["aprs_is"]["active"]; - conf.aprs_is.passcode = data["aprs_is"]["passcode"]; - conf.aprs_is.server = data["aprs_is"]["server"]; - conf.aprs_is.port = data["aprs_is"]["port"]; - - conf.lora.port = data["lora"]["frequency"]; - conf.lora.port = data["lora"]["spreading_factor"]; - conf.lora.port = data["lora"]["signal_bandwidth"]; - conf.lora.port = data["lora"]["coding_rate4"]; - conf.lora.port = data["lora"]["power"]; - - conf.display.always_on = data["display"]["always_on"]; - conf.display.timeout = data["display"]["timeout"]; - - configFile.close(); - } -}*/ \ No newline at end of file diff --git a/src/pins_config.h b/src/pins_config.h index 77d9c12..a27f6ba 100644 --- a/src/pins_config.h +++ b/src/pins_config.h @@ -14,7 +14,7 @@ #define OLED_SCL 22 /* (Same pins for LILYGO LoRa32 and ESP32 Wroom Dev ) -SX1278-------------------> ESP32 TTGO LILYGO 2.1 or 1.6.1 +SX1278-------------------> ESP32 ttgo-lora32-v21 and ESP32 WROOM Dev GND GND DIO1 - DIO2 - @@ -26,6 +26,5 @@ SCLK 5 NSS 18 DIO0 26 REST 14 -GND - -*/ +GND - */ #endif