This commit is contained in:
richonguzman 2023-03-27 00:32:27 -03:00
parent d84d26f4b2
commit 8125eb9d02
6 changed files with 92 additions and 132 deletions

View File

@ -20,7 +20,7 @@
"aprs_is": { "aprs_is": {
"active": true, "active": true,
"passcode": "23201", "passcode": "23201",
"server": "radioaficion.pro", "server": "soam.aprs2.net",
"port": 14580, "port": 14580,
"software_name" : "ESP32_LoRa_iGate", "software_name" : "ESP32_LoRa_iGate",
"software_version" : "0.0.9", "software_version" : "0.0.9",

View File

@ -9,7 +9,6 @@
#include "pins_config.h" #include "pins_config.h"
#include "igate_config.h" #include "igate_config.h"
#include "display.h" #include "display.h"
#include "iGate_config_OLD.h"
WiFiClient espClient; WiFiClient espClient;
String ConfigurationFilePath = "/igate_conf.json"; String ConfigurationFilePath = "/igate_conf.json";
@ -20,7 +19,6 @@ uint32_t lastTxTime = 0;
static bool beacon_update = true; static bool beacon_update = true;
unsigned long previousWiFiMillis = 0; unsigned long previousWiFiMillis = 0;
static uint32_t lastRxTxTime = millis(); static uint32_t lastRxTxTime = millis();
//static bool displayEcoMode = true;
static int myWiFiAPIndex = 1; static int myWiFiAPIndex = 1;
int myWiFiAPSize = Config.wifiAPs.size(); int myWiFiAPSize = Config.wifiAPs.size();
@ -30,14 +28,28 @@ String firstLine, secondLine, thirdLine, fourthLine;
void setup_wifi() { void setup_wifi() {
int status = WL_IDLE_STATUS; 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.mode(WIFI_STA);
WiFi.disconnect(); WiFi.disconnect();
delay(100); delay(100);
unsigned long start = millis();
WiFi.begin(currentWiFi->ssid.c_str(), currentWiFi->password.c_str()); WiFi.begin(currentWiFi->ssid.c_str(), currentWiFi->password.c_str());
while (WiFi.status() != WL_CONNECTED) { while (WiFi.status() != WL_CONNECTED) {
Serial.print('.'); Serial.print('.');
delay(1000); 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.print("Connected as ");
Serial.println(WiFi.localIP()); Serial.println(WiFi.localIP());
@ -88,7 +100,7 @@ String createAPRSPacket(String unprocessedPacket) {
int two_dots_position = unprocessedPacket.indexOf(':'); int two_dots_position = unprocessedPacket.indexOf(':');
callsign_and_path_tracker = unprocessedPacket.substring(3, two_dots_position); callsign_and_path_tracker = unprocessedPacket.substring(3, two_dots_position);
payload_tracker = unprocessedPacket.substring(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; return processedPacket;
} }
@ -102,11 +114,11 @@ void validate_and_upload(String packet) {
espClient.write(aprsPacket.c_str()); espClient.write(aprsPacket.c_str());
Serial.print("Message uploaded : "); Serial.println(aprsPacket); Serial.print("Message uploaded : "); Serial.println(aprsPacket);
if (aprsPacket.indexOf("::") >= 10) { 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) { } 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 { } 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 { } else {
@ -123,35 +135,63 @@ String process_aprsisPacket(String aprsisMessage) {
return newLoraPacket; return newLoraPacket;
} }
/*void showConfig() { String double2string(double n, int ndec) {
Serial.println(myWiFiAPSize); String r = "";
Serial.println(myWiFiAPIndex); int v = n;
if(myWiFiAPIndex >= (myWiFiAPSize-1)) { r += v;
myWiFiAPIndex = 0; r += '.';
int i;
for (i=0;i<ndec;i++) {
n -= v;
n = 10 * abs(n);
v = n;
r += v;
}
return r;
}
String create_lat_aprs(double lat) {
String degrees = double2string(lat,6);
String north_south, latitude, convDeg3;
float convDeg, convDeg2;
if (degrees.indexOf("-") == 0) {
north_south = "S";
latitude = degrees.substring(1,degrees.indexOf("."));
} else { } else {
myWiFiAPIndex++; north_south = "N";
latitude = degrees.substring(0,degrees.indexOf("."));
} }
Serial.println(myWiFiAPIndex); convDeg = abs(degrees.toFloat()) - abs(int(degrees.toFloat()));
currentWiFi = &Config.wifiAPs[myWiFiAPIndex]; convDeg2 = (convDeg * 60)/100;
Serial.println(currentWiFi->ssid); convDeg3 = String(convDeg2,6);
Serial.println(currentWiFi->password); latitude += convDeg3.substring(convDeg3.indexOf(".")+1,convDeg3.indexOf(".")+3) + "." + convDeg3.substring(convDeg3.indexOf(".")+3,convDeg3.indexOf(".")+5);
Serial.println(currentWiFi->latitude); latitude += north_south;
Serial.println(currentWiFi->longitude); return latitude;
Serial.println(Config.callsign); }
Serial.println(Config.comment);
Serial.println(Config.aprs_is.active); String create_lng_aprs(double lng) {
Serial.println(Config.aprs_is.passcode); String degrees = double2string(lng,6);
Serial.println(Config.aprs_is.server); String east_west, longitude, convDeg3;
Serial.println(Config.aprs_is.port); float convDeg, convDeg2;
Serial.println(Config.loramodule.frequency);
Serial.println(Config.loramodule.spreading_factor); if (abs(degrees.toFloat()) < 100) {
Serial.println(Config.loramodule.signal_bandwidth); longitude += "0";
Serial.println(Config.loramodule.coding_rate4); }
Serial.println(Config.loramodule.power); if (degrees.indexOf("-") == 0) {
Serial.println(Config.display.always_on); east_west = "W";
Serial.println(Config.display.timeout); longitude += degrees.substring(1,degrees.indexOf("."));
Serial.println(" "); } 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() { void setup() {
Serial.begin(115200); Serial.begin(115200);
@ -163,35 +203,34 @@ void setup() {
} }
void loop() { void loop() {
//showConfig(); String wifiState, aprsisState, iGateLatitude, iGateLongitude;
//delay(2000);
String wifiState, aprsisState;
firstLine = "LoRa iGate: " + Config.callsign; firstLine = "LoRa iGate: " + Config.callsign;
secondLine = " "; secondLine = " ";
thirdLine = " "; thirdLine = " ";
fourthLine = " "; fourthLine = " ";
unsigned long currentWiFiMillis = millis(); 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.print(millis());
Serial.println("Reconnecting to WiFi..."); Serial.println("Reconnecting to WiFi...");
WiFi.disconnect(); WiFi.disconnect();
WiFi.reconnect(); WiFi.reconnect();
previousWiFiMillis = currentWiFiMillis; previousWiFiMillis = currentWiFiMillis;
} }
if (!espClient.connected()) { if (!espClient.connected()) {
APRS_IS_connect(); APRS_IS_connect();
} }
if (WiFi.status() == WL_CONNECTED) wifiState = "OK"; else wifiState = "--"; display_toggle(true); lastRxTxTime = millis(); 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(); if (espClient.connected()) aprsisState = "OK"; else aprsisState = "--"; display_toggle(true); lastRxTxTime = millis();
secondLine = "WiFi: " + wifiState + "/ APRS-IS: " + aprsisState; secondLine = "WiFi: " + wifiState + "/ APRS-IS: " + aprsisState;
show_display(firstLine, secondLine, thirdLine, fourthLine, 0); show_display(firstLine, secondLine, thirdLine, fourthLine, 0);
while (espClient.connected()) { while (espClient.connected()) {
uint32_t lastRxTx = millis() - lastRxTxTime; uint32_t lastRxTx = millis() - lastRxTxTime;
if (Config.display.always_on) { if (!Config.display.always_on) {
if (lastRxTx >= Config.display.timeout*1000) { if (lastRxTx >= Config.display.timeout*1000) {
display_toggle(false); display_toggle(false);
} }
@ -207,8 +246,9 @@ void loop() {
if (beacon_update) { if (beacon_update) {
display_toggle(true); display_toggle(true);
Serial.println("---- Sending iGate Beacon ----"); Serial.println("---- Sending iGate Beacon ----");
//String iGateBeaconPacket = Config.callsign + ">APRS,TCPIP*,qAC,CHILE:=" + currentWiFi->latitude + "L" + currentWiFi->longitude + "&" + Config.comment; iGateLatitude = create_lat_aprs(currentWiFi->latitude);
String iGateBeaconPacket = Config.callsign + ">APRS,TCPIP*,qAC,CHILE:=" + Latitude + "L" + Longitude + "&" + Config.comment + "\n"; iGateLongitude = create_lng_aprs(currentWiFi->longitude);
String iGateBeaconPacket = Config.callsign + ">APRS,TCPIP*,qAO:=" + iGateLatitude + "L" + iGateLongitude + "&" + Config.comment + "\n";
//Serial.println(iGateBeaconPacket); //Serial.println(iGateBeaconPacket);
espClient.write(iGateBeaconPacket.c_str()); espClient.write(iGateBeaconPacket.c_str());
lastTxTime = millis(); lastTxTime = millis();

View File

@ -18,12 +18,17 @@ void setup_display() {
display.clearDisplay(); display.clearDisplay();
display.setTextColor(WHITE); display.setTextColor(WHITE);
display.setTextSize(0); display.setTextSize(1);
display.setCursor(0, 0); 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(SSD1306_SETCONTRAST);
display.ssd1306_command(1); display.ssd1306_command(1);
display.display(); display.display();
delay(4000);
} }
void display_toggle(bool toggle) { void display_toggle(bool toggle) {

View File

@ -1,12 +0,0 @@
#ifndef IGATE_CONFIG_H_
#define IGATE_CONFIG_H_
#include <Arduino.h>
#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

View File

@ -1,72 +0,0 @@
#include "igate_config.h"
/*#include "Arduino.h"
#include <SPIFFS.h>
#include <FS.h>
#include <ArduinoJson.h>
#include <vector>
/*class WiFi_AP {
public:
String ssid;
String password;
double latitude;
double longitude;
};
class Configuration {
public:
//std::vector<WiFi_AP> 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<String>();
wifi.password = WiFiArray[i]["wifi"]["AP"]["Password"].as<String>();
wifi.latitude = WiFiArray[i]["wifi"]["AP"]["Latitude"].as<double>();
wifi.longitude = WiFiArray[i]["wifi"]["AP"]["Longitude"].as<double>();
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();
}
}*/

View File

@ -14,7 +14,7 @@
#define OLED_SCL 22 #define OLED_SCL 22
/* (Same pins for LILYGO LoRa32 and ESP32 Wroom Dev ) /* (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 GND GND
DIO1 - DIO1 -
DIO2 - DIO2 -
@ -26,6 +26,5 @@ SCLK 5
NSS 18 NSS 18
DIO0 26 DIO0 26
REST 14 REST 14
GND - GND - */
*/
#endif #endif