Tach zusammen,
da hat es doch mal wieder länger gedauert als erwartet 
Mich hat es nach wie vor gewurmt, dass man keinen Bezug zu den dargestellten Werten hat.
Die einzig korrekte Lösung war es, alles auf Grad (-90.0 bis +90.0) umzustellen und dann den Darstellungsbereich festzulegen.
Das hat auch lediglich dazu geführt, alles komplett umzuschreiben :o
Nachdem das geschafft war, musste die Kalibrierung einem neuen Ansatz weichen:
Die Adafruit_ADXL345_U-Library liefert float-Werte. Man kann aber auch einfach per getX() auf die integer Werte zugreifen.
Die Wertebereiche wurden festgelegt, in dem ich einfach auf -90 & +90 Grad gelevelt habe.
Das waren in meinem Fall X: -432 bis 109 Y: -287 bis 247.
Entspricht einem Wertebereich von 541 / 533. Geteilt durch zwei, erhalten wir den Bereich für 90°.
Passt nicht 100%ig, aber sollte für die Genauigkeit ausreichen.
Zu guter Letzt muss noch auf Null gelevelt werden, in dem man den rohen Wert in Waage speichert und vom Wertebereich abzieht (bzw. drauf rechnet).
In Code gesprochen:
int calibrationX = -150;
int calibrationY = -25;
int valuationX = 271;
int valuationY = 267;
void getLevel() {
int x = accel.getX();
int y = accel.getY();
int z = accel.getZ();
//-90 -> +90
//-432 -> 109 / -287 -> 247
//541 / 533
//Divide by 2
//Zero
//-150 / -25
levelX = map(x, (valuationX - calibrationX) * -1, (valuationX + calibrationX), -900, 900);
levelY = map(y, (valuationY - calibrationY) * -1, (valuationY + calibrationY), -900, 900);
}
Die "900" werden dann im JavaScript noch durch 10 geteilt, um die passende Genauigkeit zu erhalten.
Das Ergebnis ist okay! Muss nochmal im Wohnwagen selbst ausprobiert werden, aber mein 12V Stecker ist noch nicht angekommen.
Der Rest ist dann noch Feinjustierung.
Im Prinzip ist alles an HTML und JavaScript nur "für Schön". Die Kernfunktion ist einfach einen WebRequest abzusetzen und entsprechend Werte zu übermitteln oder das Ergebnis zu verarbeiten.
Im Falle der Festlegung für die Wertebereiche sähe das dann so aus:
function Valuation(){
var oRequest = new XMLHttpRequest();
var sURL = '/valuation?x=';
sURL += document.getElementById("ValutationX").value;
sURL += '&y=';
sURL += document.getElementById("ValutationY").value;
oRequest.open("GET",sURL,true);
oRequest.onerror = function (e) {SetOutput("Valuation failed!", true);};
oRequest.send(null);
}
Und das Gegenstück:
webServer.on("/valuation", handle_valuation);
void handle_valuation() {
// /valuation?x=270&y=267
Serial.println(F("Handle Valuation"));
if (webServer.args() == 2) {
Serial.println(String(F(" ")) + webServer.argName(0) + F(": ") + webServer.arg(0));
Serial.println(String(F(" ")) + webServer.argName(1) + F(": ") + webServer.arg(1));
valuationX = webServer.arg(0).toInt();
valuationY = webServer.arg(1).toInt();
StoreLevelValuation();
String txt = "OK (";
txt.concat(String(valuationX));
txt.concat("/");
txt.concat(String(valuationY));
txt.concat(")");
webServer.send(200, "text/plain", txt);
return;
}
webServer.send(400, "text/plain", F("Parameter missing or out of Range!"));
}
Den Sketch, HTML, JS & CSS Dateien, samt 3D Druck, Bebilderung und kurzer Anleitung (auf Englisch) habe ich aufgrund der Größe und des Umfangs auf GitHub geschoben:
GitHub / Caravan Leveler
Sofern Ihr das selbst ausprobieren möchte, bedenkt bitte dass auf dem PC ausgeführt, der WebRequest auf den ESP als CrossSiteScripting Attacke gewertet wird.
Entweder übergebt (so wie ich) im onerror Dummy-Werte oder testet direkt auf dem ESP.