die Reisezeit neigt sich dem Ende zu und die Bastelzeit beginnt wieder ....
Mein Projekt Wohnmobilanzeige läuft mit allen Funktionen zumindest im Test.
Für die Tankanzeige könnte ich einen Rat gebrauchen, wie das Ganze eventuell besser geht, ich bin wieder bei Arrays ....
Die Pegel steigen nicht linear, beim Frischwasser sind es drei verschiedene Anstiege. Ich muss also auslitern.
Die einzelnen Werte (mV) pro Liter werden hinterlegt und dann mit dem aktuellem Wert verglichen. Ist der aktuelle Wert größer als der für eine entsprechende Literzahl hinterlegte Wert sind die entsprechenden Liter im Tank.
So weit so gut ...
Aber es sind 120 und 100 Liter, d.h. die Daten müssen zum Vergleich irgendwie hinterlegt sein. Ich bin da wieder bei Arrays.
Ein weiteres Problem, es müssten eigentlich zwei Arrays sein, da die Werte ja nicht identisch sind.
Meine gegenwärtige Lösung sieht ein Array mit beiden Werten und einen entsprechenden Offset für i in berechnen für die beiden Tanks vor, also so:
void berechnen() {
for (int i = 0 + Offset; i < hoehe+1; i++) {
if (spg_fuell > fuellstand[i]) {
liter = i - Offset;
}
}
Habe ich aber noch nicht getestet.
Mit einem Tank läuft es, void berechnen macht entsprechend des Tankinhaltes viele Durchläufe und vergleicht die Werte:
#include<Wire.h>
// ADS1115 ------------------------------------------------------------------------------
#include<ADS1115_WE.h>
ADS1115_WE adc = ADS1115_WE(0x48);
// ADS1115 Ende -------------------------------------------------------------------------
class Tank {
public:
int hoehe;
int liter;
int spg_fuell;
int fuellstand[12];
Tank()
: hoehe{11},
liter{0},
spg_fuell{0},
fuellstand{117, 266, 403, 507, 610, 748, 875, 990, 1128, 1254, 1381, 1507} {} // Messwert pro Liter Füllstand 0-11L
void messen(ADS1115_WE &adc) {
int mess_1 = 0;
int mess_2 = 0;
int mess_diff = 0;
int mess_ok = 0;
int mess_gesamt = 0;
for (int i = 3; i > 0; i--) {
adc.setCompareChannels(ADS1115_COMP_0_GND);
adc.startSingleMeasurement();
delay(15);
mess_1 = adc.getResult_mV();
delay(500);
adc.startSingleMeasurement();
delay(15);
mess_2 = adc.getResult_mV();
mess_gesamt = mess_gesamt + mess_1 + mess_2;
mess_diff = mess_1 - mess_2;
mess_diff = abs(mess_diff);
if (mess_diff < 10) {
mess_ok = mess_ok + 1;
}
}
if (mess_ok == 3) {
spg_fuell = mess_gesamt / 6;
}
}
void berechnen() {
for (int i = 0; i < hoehe+1; i++) {
if (spg_fuell > fuellstand[i]) {
liter = i;
}
}
}
};
Tank tank;
void setup() {
Serial.begin(115200);
Serial.println("setup");
Wire.begin();
// ADS1115 -----------------------------------------------------------------------------
adc.init();
adc.setVoltageRange_mV(ADS1115_RANGE_4096); // anpassen Messbereich
}
void loop() {
tank.messen(adc);
tank.berechnen();
delay(5000);
}
Gibt es da bessere/elegantere Lösungen?
Die vielen Messungen sollen übrigens durch Bewegung verursachte Messschwankungen eliminieren.
Regel von KIRCHHOFF: Knotenregel
In jedem Verzweigungspunkt eines Stromkreises ist die Summe der hinfließenden Ströme gleich der Summe der abfließenden Ströme.
Nimm einen Durchflußsensor, messe und berechne die entnommene Wassermenge und speichere diese, wie auch immer, ab.
Du verwendest die kapazitive Stabsonde von Votronic, mit der experimentiere ich gerade. Bin ja durch Dich auf die gestoßen.
Habe auch noch einen Drucksensor.
Im Endeffekt kommt hinten eine Spannung raus ....
Eben nicht, das meine ich mit nicht linear, wäre ja zu schön ...
Beim Frischwasser ändert sich das zweimal.
Nicht machbar, um den in den Tankeinlass zu integrieren muss man das halbe Fahrzeug demontieren.
// edit - code getauscht - damit ist der lauffähig
Ich hab hier die Abkürzung genommen über die /3 - das geht auch mit Festwerten.
Zugegeben, ich bin ein Freund von switch/case....
Dann wärst Du an der Auswertung von 20 Alarmen über switch/case begeistert ....
Den Gedanken über drei solche Etappen hatte ich auch schon, der Frischwassertank ist im oberen Drittel aber konisch verjüngend. Bleiben noch zwei Stufen wo es eventuell geht.
Da aber sonst nichts einsehbar ist und die Tankabmessung nicht zu erfahren sind ist das knifflig und lässt sich auch nur mit eben auslitern feststellen.
Da ich das Projekt diesen Winter fertig haben werden soll habe ich mich auf die Variante eingeschossen, die in jedem Fall funktioniert.
Davon abgesehen werde ich mal noch eine Variante mit linearem Anstieg machen, die kann dann eventuell jemand nutzen der entsprechende Tanks hat. Vielleicht geht es ja auch bei meinen wenigstens teilweise.
Zum testen habe ich jetzt mal ein Array mit 222 Werten geklöppelt und die Berechnung mit Offset gemacht, nicht schön, aber funktioniert.
for (int i = 0 + arrayoffset; i < hoehe + arrayoffset + 1; i++) {
if (spg_fuell > fuellstand[i]) {
liter = i - arrayoffset;
}
}
Versteh ich nicht, hier müsste doch das entnommene Wasser gemessen werden?
Wie soll dort nachgetanktes Wasser erfasst werden, das kommt nun mal über den Frischwasseranschluß..
Und Abwasser funktioniert mit der Methode auch nicht, ich kann zwar Frischwasserzu- und abfluß messen, aber nicht den Zufluß ins Abwasser berechnen -> z.B-Außendusche.
Ja und?
Das kannst doch in dem Bereich mit einrechnen?
Hast Du eine Zeichnug von dem Teil, oder sonstwas, wie man an ein paar vernünftige und nicht irgendwelche vagen "vielleicht" und "hätte" Daten kommt?
Dann ist Dir nicht zu helfen.
Sorry, aber was soll das dann?
Ich erwarte keine Antwort - ich glaub nicht, das die irgendwas bringen könnte, tausche aber trotzdem da oben noch den Code aus.
Ich persönlich würde das tatsächlich auslitern, 10 Werte definieren, und dann eine Prozentanzeige machen (also ich mach das so) oder mach halt beim 120 Liter tank 12 fixe werte mit je 10 litern. Dann hast Du beim 100 litertank 10 werte zum vergleichen und beim 120 litertank 12. Die kannst du mit case oder if auswerten und gut ist. gibt dann um die 30 Zeilen code, ohne Ausgabe, aber nur für die Auswertung finde ich das ok. Mein Auslesen der Solaranzeige ist da schon bedeutend umfangreicher
if (eingelesenerWert >=10 and eingelesenerWert<20) messWert=10;
if (eingelesenerWert >=20 and eingelesenerWert<30) messWert=20;
Serial.print("Füllstand: ");Serial.print(messWert); Serial.println(" %");
Ende. Ist allemal genau genug zum wissen, wie lange dein Wasser noch reicht. Das ist ja keine Raketenwissenschaft, das ist einfach nur ein Anhaltspunkt.
Habe ich doch geschrieben, da bekommt man nichts!
Wahrscheinlich Betriebsgeheimnis .
Du siehst zwei schwarze Löcher und vom Frischwassertank etwas ganz oben.
Erklär mal was Du da anders machen würdest bei keinerlei Infos zu irgendwelchen Abmessungen?
@michael_x map, habe schon verstanden was er meint ...
weil du nur weist, was rausgeht. Dann müsstest du jedesmal bis zum überlaufen füllen, und dann die Füllstandsanzeige auf 100% setzen. Ist wie beim Benzinverbrauch im auto. Da wird gemessen was rausgeht, und was zurückkommt....ohne den rücklauf hättest du nie ein sauberes ergebnis