From 488ad08e38e3163060f7b767c14fd849df8a594f Mon Sep 17 00:00:00 2001 From: Tim Staat Date: Thu, 4 Sep 2025 17:28:36 +0200 Subject: [PATCH] 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. --- .../20250815_basic_finder.ino.ino | 66 ++++++++++++------- 1 file changed, 42 insertions(+), 24 deletions(-) diff --git a/20250815_basic_finder.ino/20250815_basic_finder.ino.ino b/20250815_basic_finder.ino/20250815_basic_finder.ino.ino index f86859e..4efe57f 100644 --- a/20250815_basic_finder.ino/20250815_basic_finder.ino.ino +++ b/20250815_basic_finder.ino/20250815_basic_finder.ino.ino @@ -17,8 +17,11 @@ QMC5883LCompass compass; #define GPS_BAUD 9600 String webserviceAddress = "https://festival-finder.noe-danke.de/updateGPS"; +String serverAvailableAddress = "https://festival-finder.noe-danke.de/"; bool connected = false; +bool use_bearing_correction = true; + HardwareSerial gpsSerial(2); TinyGPSMinus gps; @@ -81,30 +84,21 @@ void drawTriangles(byte i, char *time, char *distanceString) { 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; + // Change space to 0 - - - if(*(latitude + 6) < '0' || *(latitude + 6) > '9') + if(*(latitude + 6) == ' ') *(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); - // Your Domain name with URL path or IP address with path 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(); - Serial.print("HTTP Response code: "); - Serial.println(httpResponseCode); - if (httpResponseCode == 200 ) { const char* cpayload = http.getString().c_str(); 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) { + if(!use_bearing_correction) { + int iBearing = bearing; + return compass.getBearing(iBearing); + } + compass.read(); int relativeAngle = (int)(bearing - compass.getAzimuth()); relativeAngle += 360; relativeAngle %= 360; return (compass.getBearing(relativeAngle) + BEARING_CORRECTION + 16) % 16; } + + void setDistanceBearingString(char *time, char *distance, byte *bearing, const char *payload) { StaticJsonDocument<200> doc; @@ -137,21 +153,18 @@ void setDistanceBearingString(char *time, char *distance, byte *bearing, const c const char* dist2 = doc["distance"]; const char* time2 = doc["lastUpdateTZ"]; + use_bearing_correction = doc["bear_correction"]; + strcpy(distance, dist2); strcpy(time, time2); - *bearing = calculateBearing(String(doc["bearing"]).toFloat()); + *bearing = calculateBearing(String(doc["azimuth"]).toFloat()); } void loop(void) { - if(connected) { - digitalWrite(LED_PIN, HIGH); - } - else { - digitalWrite(LED_PIN, LOW); - } + checkWifiConnection(); while (gpsSerial.available() > 0) { // get the byte data from the GPS char gpsData = gpsSerial.read(); @@ -171,9 +184,9 @@ void loop(void) { Serial.println(latitude); 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(date, dateString, 10); // for (int i = 0; i < 18; i++) { @@ -187,6 +200,7 @@ void loop(void) { strcpy(dateTimeString, dateString); strcat(dateTimeString, timeString); + byte triangleIndex = 0; char distanceArray[] = { 'N', 'o', ' ', 'S', 'e', 'r', 'v', 'e', 'r', '\0' }; char distanceString[16]; @@ -195,14 +209,18 @@ void loop(void) { char remoteTimeString[16]; 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); drawTriangles(triangleIndex, remoteTimeString, distanceString); Serial.println("-------------------------------"); - delay(3000); + delay(1000); }