1.3
This commit is contained in:
parent
d84d26f4b2
commit
8125eb9d02
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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();
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue