NEWS
Widerstands-Tankgeber auslesen
-
So sieht es doch gleich aufgeräumter aus. Ich bin mit der Masse des Konverters an GND vom ESP gegangen. Das sollte gehen, oder gibt es bedenken? Vielen Dank für die Hilfe. Als nächstes werde ich die Schaltung ausprobieren und einen Sketch schreiben, der die ausgegebene Spannung des Messwiderstandes anzeigt. BG
-
Hallo zusammen,
ich dachte, ich probiere einfach mal den GPIO34 vom ESP32 Wroom 32 aus, bevor der neue Tankgeber kommt. Ich habe den ESP32 mit Tasmota geflasht (tasmota32-DE.factory.bin von der Tasmota Webseite). Das funktionierte soweit alles gut. Den ESP konnte ich einrichten und hat sich ordnungsgemäß beim IOBroker angemeldet. Er ließ sich auch gut über die vergebene IP aufrufen.
Dann hatte ich einen Sketch über ArduinoIDE auf den ESP übertragen und dann wurde es komisch. Der serielle Monitor von Arduino zeigte die Spannung kontinuierlich an, im IOBroker blieb der Datenpunkt im Objektordner aber leer. Nun konnte ich den ESP über die IP Adresse auch nicht mehr erreichen. Dann hatte ich den Sketch über Arduino gelöscht. Ich musste den ESP neu flashen, anders war er nicht mehr erreichbar. Danach war alles wieder in Ordnung. Also ein neuer Versuch mit einem einfacheren Sketch, aber nun ist der ESP völlig weg, auch ein Flash ist nicht mehr möglich. Hat jemand eine Idee was da passiert ist? BG -
Macht doch absolut Sinn.
Entweder läuft auf dem Ding Tasmota (Firmware) oder irgend etwas anderes. Wenn du statt Tasmota irgendein Sketch über die Arduino IDE flashst, dann ist da nix mehr mit Tasmota auf dem Esp und dann logischerweise auch nicht im iobroker... -
Die Schaltung mit dem Spannungsteiler führt zu einem nichtlinearen Zusammenhang Weg(ADC-Wert)
Wenn man direkt die 24 Volt für die Speisung des Widerstandes nimmt, ist die Nichtlinearität geringer.Weiterhin sollte man schauen, was passiert, wenn der Schleifer des Messgebers "kratzt".
Wenn dann deutlich über 190 Ohm anliegen, könnte das den ADC beschädigen. -
Habe jetzt mal eben ein wenig gerechnet ...
Der ADC hat soweit ich weiß eine maximale Eingangsspannung von 1 Volt - um diese mit 3,3 V auszureizen, müsste man einen Vorwiderstand von 437 Ohm benutzen.
Mit 470 Ohm ist man nahe genug daran ...
Wenn man die Schaltung mit 24 Volt speist, müsste der Vorwiderstand 4370 Ohm betragen, also 4,7 kOhm. Die Nichtlinearität wäre da deutlich geringer ...
gnuplot
gnuplot> set xrange [0:190] gnuplot> set yrange [-0.1:1.0] gnuplot> plot [0:190] 3.3*x/(470+x), x/190, 24*x/(4700+x) gnuplot>Ist aber eigentlich eine akademische Diskussion, da ja auch die Behältergeometrie eingeht ...
Wenn man der Mathematik ausweichen will, ggfs einfach eine Lookup-Table verwenden ...
-
Habe jetzt mal eben ein wenig gerechnet ...
Der ADC hat soweit ich weiß eine maximale Eingangsspannung von 1 Volt - um diese mit 3,3 V auszureizen, müsste man einen Vorwiderstand von 437 Ohm benutzen.
Mit 470 Ohm ist man nahe genug daran ...
Wenn man die Schaltung mit 24 Volt speist, müsste der Vorwiderstand 4370 Ohm betragen, also 4,7 kOhm. Die Nichtlinearität wäre da deutlich geringer ...
gnuplot
gnuplot> set xrange [0:190] gnuplot> set yrange [-0.1:1.0] gnuplot> plot [0:190] 3.3*x/(470+x), x/190, 24*x/(4700+x) gnuplot>Ist aber eigentlich eine akademische Diskussion, da ja auch die Behältergeometrie eingeht ...
Wenn man der Mathematik ausweichen will, ggfs einfach eine Lookup-Table verwenden ...
@MartinP
Schöne Berechnungen.
Aber ob es "linear" ist oder nicht, macht doch nichts aus.
Er kennt ja seine Konfig und kann aus der Spannung am ADC den Widerstand vom Geber berechnen.
Und von da an ist es dann wieder linear (natürlich Tankformabhängig)Speisung via 3.3V hat meiner Meinung nach mehrere Vorteile:
-
Weniger "Verlustleistung"
-
Gleiche Source für ADC und Geber (Falls z:B die 24V varieren, variert auch der ADC Ausgang obwohl am Geber nichts ändert
-
Beim "Kratzen" steigt die Spannung sicher nie über 3.3V
-
Sehr kleinlich, aber bei tiefen Füllständen hast du mit 3.3V (gemäss deinem Plot) die bessere Auflösung ;-)
-
-
Vielen Dank für die rege Unterstützung und euer Interesse. Auf dem ESP32 hatte ich Tasmota Firmware geflasht. Ich bin davon ausgegangen, dass die Sketche von Arduino mit Tasmota kompatibel sind und deshalb einen Fehler vermutet. Nun ja, war es auch. Im nachhinein hatte ich noch gelesen, dass der Speicherplatz auf dem ESP für mein Vorhaben zu klein ist. Ich habe mich also nach einer Alternative umgeschaut. Nun versuche ich ein Javascript auszuprobieren. Übrigens der Tankgeber war tatsächlich defekt. Gestern kam Ersatz, den habe ich gleich mal getestet und siehe da, ich konnte entsprechende Werte auf meinem Spannungsmesser ablesen.
Die Tankgrößen sind mir bekannt. Somit kann ich die gemessenen Werte an den Tankinhalt anpassen. Es kommt mir dabei nicht so sehr auf den Liter an, es ei denn die Abweichungen sind gravierend. Ich möchte nur verhindern, dass ich nicht "leerlaufe".
Vielen Dank auch für die Berechnungen und der Grafik. So kann ich mir ein genaueres Bild machen. BG -
Hallo zusammen, ich hätte nicht gedacht, dass mein Vorhaben so kompliziert wird, auch wenn es Spaß macht.
Also ich habe jetzt meinen Tankgeber auf einem Breadboard nachgestellt. Funktioniert alles sehr gut, aber der simulierte Widerstand des Tankgebers bei 190 Ohm erfordert einen Vorwiderstand des Spannungsteilers von 1295 Ohm um einen Wert von 3,12 Volt zu bekommen. Das wäre erst einmal ein guter Anfang. Mein ESP32 zeigt mir auch diesen Wert auf der Tasmota Software an.
Ich konnte den ESP32 auch im IOBroker einbinden. Der ESP32 ist unter dem Ordner: sonoff.0.ESP32_Wroom_1 angelegt mit einigen Unterordnern und States. Unter den Unterordnern Results/States ist der Datenpunkt für den GPIO34 zu finden."sonoff.0.ESP32_Wroom_1.RESULT.GPIO.34" und auch hier "javascript.0.esp32.gpio34_voltage"
Beide zeigen keinen Wert, außer 0 bzw. 0V, an und das ist mein Problem. ich bekomme die Werte von Tasmota nicht in den IOBroker eingelesen. Ich habe verschiedene Sachen ausprobiert, aber keine Lösung gefunden. Vielleich kann mir jemand einen Schubs in die richtige Richtung geben? Das wäre sehr nett. Das hier ist mein letzter Versuch.
var dp = 'sonoff.0.ESP32_Wroom_1.RESULT.GPIO.34'; var voltageDP = 'javascript.0.esp32.gpio34_voltage'; createState(voltageDP, 0, { name: 'GPIO34 Spannung', unit: 'V', type: 'number', role: 'value.voltage' }); // Alle 1 Sekunde den Datenpunkt abfragen setInterval(function() { getState(dp, function(state) { if (state && state.val !== null) { var voltage = parseFloat(state.val); if (!isNaN(voltage)) { setState(voltageDP, voltage, true); log('Spannung GPIO34: ' + voltage + ' V'); } } }); }, 1000); // Intervall in MillisekundenBeste Grüße
