Send azimuth + configurable bearing correction

From this change on, the client adds its azimuth measurement
to the get paramters, so the server can do the correction.

Also the response parameter for locally correcting bearing
according to azimuth measurements is respected.

Some comments from copy paste stuff were deleted.
This commit is contained in:
Tim Staat 2025-09-04 17:28:36 +02:00
parent f37bae70e9
commit 488ad08e38

View File

@ -17,8 +17,11 @@ QMC5883LCompass compass;
#define GPS_BAUD 9600 #define GPS_BAUD 9600
String webserviceAddress = "https://festival-finder.noe-danke.de/updateGPS"; String webserviceAddress = "https://festival-finder.noe-danke.de/updateGPS";
String serverAvailableAddress = "https://festival-finder.noe-danke.de/";
bool connected = false; bool connected = false;
bool use_bearing_correction = true;
HardwareSerial gpsSerial(2); HardwareSerial gpsSerial(2);
TinyGPSMinus gps; TinyGPSMinus gps;
@ -81,30 +84,21 @@ void drawTriangles(byte i, char *time, char *distanceString) {
delay(2000); delay(2000);
} }
bool doHttpRequest(char *payload, char *latitude, char *longitude, char *gpsTime) { bool doHttpRequest(char *payload, char *latitude, char *longitude, char *gpsTime, char *az) {
HTTPClient http; HTTPClient http;
// Change space to 0 // Change space to 0
if(*(latitude + 6) == ' ')
if(*(latitude + 6) < '0' || *(latitude + 6) > '9')
*(latitude + 6) = '0'; *(latitude + 6) = '0';
String serverPath = webserviceAddress + "?long=" + longitude + "&lat=" + latitude + "&id=" + OWN_ID + "&req_id=" + REQ_ID + "&gpsDateTime=" + gpsTime + "&passkey=" + SERVER_PASSKEY; String serverPath = webserviceAddress + "?long=" + longitude + "&lat=" + latitude + "&id=" + OWN_ID + "&req_id=" + REQ_ID + "&gpsDateTime=" + gpsTime + "&passkey=" + SERVER_PASSKEY + "&az=" + az;
Serial.println(serverPath); Serial.println(serverPath);
// Your Domain name with URL path or IP address with path
http.begin(serverPath.c_str()); http.begin(serverPath.c_str());
// If you need Node-RED/server authentication, insert user and password below
//http.setAuthorization("REPLACE_WITH_SERVER_USERNAME", "REPLACE_WITH_SERVER_PASSWORD");
// Send HTTP GET request
int httpResponseCode = http.GET(); int httpResponseCode = http.GET();
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
if (httpResponseCode == 200 ) { if (httpResponseCode == 200 ) {
const char* cpayload = http.getString().c_str(); const char* cpayload = http.getString().c_str();
strcpy(payload, cpayload); strcpy(payload, cpayload);
@ -117,13 +111,35 @@ bool doHttpRequest(char *payload, char *latitude, char *longitude, char *gpsTime
} }
} }
void checkWifiConnection() {
HTTPClient http;
http.begin(serverAvailableAddress);
int httpResponseCode = http.GET();
Serial.print("Server availablity test response code: ");
Serial.println(httpResponseCode);
if (httpResponseCode == 200) {
digitalWrite(LED_PIN, HIGH);
} else {
digitalWrite(LED_PIN, LOW);
}
}
byte calculateBearing(float bearing) { byte calculateBearing(float bearing) {
if(!use_bearing_correction) {
int iBearing = bearing;
return compass.getBearing(iBearing);
}
compass.read(); compass.read();
int relativeAngle = (int)(bearing - compass.getAzimuth()); int relativeAngle = (int)(bearing - compass.getAzimuth());
relativeAngle += 360; relativeAngle += 360;
relativeAngle %= 360; relativeAngle %= 360;
return (compass.getBearing(relativeAngle) + BEARING_CORRECTION + 16) % 16; return (compass.getBearing(relativeAngle) + BEARING_CORRECTION + 16) % 16;
} }
void setDistanceBearingString(char *time, char *distance, byte *bearing, const char *payload) { void setDistanceBearingString(char *time, char *distance, byte *bearing, const char *payload) {
StaticJsonDocument<200> doc; StaticJsonDocument<200> doc;
@ -137,21 +153,18 @@ void setDistanceBearingString(char *time, char *distance, byte *bearing, const c
const char* dist2 = doc["distance"]; const char* dist2 = doc["distance"];
const char* time2 = doc["lastUpdateTZ"]; const char* time2 = doc["lastUpdateTZ"];
use_bearing_correction = doc["bear_correction"];
strcpy(distance, dist2); strcpy(distance, dist2);
strcpy(time, time2); strcpy(time, time2);
*bearing = calculateBearing(String(doc["bearing"]).toFloat()); *bearing = calculateBearing(String(doc["azimuth"]).toFloat());
} }
void loop(void) { void loop(void) {
if(connected) { checkWifiConnection();
digitalWrite(LED_PIN, HIGH);
}
else {
digitalWrite(LED_PIN, LOW);
}
while (gpsSerial.available() > 0) { while (gpsSerial.available() > 0) {
// get the byte data from the GPS // get the byte data from the GPS
char gpsData = gpsSerial.read(); char gpsData = gpsSerial.read();
@ -171,9 +184,9 @@ void loop(void) {
Serial.println(latitude); Serial.println(latitude);
Serial.println(longitude); Serial.println(longitude);
char myPayloadResponse[80]; char myPayloadResponse[128];
char timeString[10], dateString[10], dateTimeString[24]; char timeString[10], dateString[10], dateTimeString[24], azString[11];
ltoa(time, timeString, 10); ltoa(time, timeString, 10);
ltoa(date, dateString, 10); ltoa(date, dateString, 10);
// for (int i = 0; i < 18; i++) { // for (int i = 0; i < 18; i++) {
@ -187,6 +200,7 @@ void loop(void) {
strcpy(dateTimeString, dateString); strcpy(dateTimeString, dateString);
strcat(dateTimeString, timeString); strcat(dateTimeString, timeString);
byte triangleIndex = 0; byte triangleIndex = 0;
char distanceArray[] = { 'N', 'o', ' ', 'S', 'e', 'r', 'v', 'e', 'r', '\0' }; char distanceArray[] = { 'N', 'o', ' ', 'S', 'e', 'r', 'v', 'e', 'r', '\0' };
char distanceString[16]; char distanceString[16];
@ -195,14 +209,18 @@ void loop(void) {
char remoteTimeString[16]; char remoteTimeString[16];
strcpy(remoteTimeString, timeString); strcpy(remoteTimeString, timeString);
if (doHttpRequest(myPayloadResponse, latitude, longitude, dateTimeString)) compass.read();
int az = compass.getAzimuth();
sprintf(azString, "%ld", az);
if (doHttpRequest(myPayloadResponse, latitude, longitude, dateTimeString, azString))
setDistanceBearingString(remoteTimeString, distanceString, &triangleIndex, myPayloadResponse); setDistanceBearingString(remoteTimeString, distanceString, &triangleIndex, myPayloadResponse);
drawTriangles(triangleIndex, remoteTimeString, distanceString); drawTriangles(triangleIndex, remoteTimeString, distanceString);
Serial.println("-------------------------------"); Serial.println("-------------------------------");
delay(3000); delay(1000);
} }