Da bau ich doch eine Waage!

Bei meinen Tests bleibt ja immer auch die Unsicherheit, ob denn die Erde wirklich so feucht ist, wie der jeweilige Sensor anzeigt oder ob die Pflanze schon kurz vor dem vertrocknen ist, weil der Sensor spinnt.

Kam ich doch auf die Idee, einfach das Gewicht des Topfes zu ermitteln: Beim gießen schüttet man ja so ca. 150-200ml Wasser drauf, das sind also etwa 150-200g Gewichtszunahme des Topfes. Das Wasser wird einerseits von der Pflanze aufgenommen, weiterhin verdunstet ein Teil.

Natürlich entsteht neue Pflanzenmasse durch Wachstum, diesen Teil des Gewichtszuwaches kann zunächst vernachlässigen. Eine Kompensation diese Zuwachses ist geplant.

Herkömmliche Haushaltswaagen haben (mindestens) 3 entscheidende Nachteile:

  • keine Dauermessung möglich (Abschaltung nach 2-4 Minuten)
  • nach dem Wiedereinschalten wird durch die Kalibrierung „0“ angezeigt…
  • keine Aufzeichnung im HomeLan möglich (schon gar nicht per WLAN oder Bluetooth)

Ich habe mich für eine eigene Umsetzung entschieden:

Man nehme:
  • einen Wäägebalken (entweder aus einer „alten“ elektronischen Küchenwaage oder ein gekaufter mit einem Gewichtsbereich von 2-10kg (aktuell setze ich einen 10kg-Wäägebalken ein, der aber locker auch 700g „aufs Gramm genau“ auflöst.

    Wäägebalken 5kg
    Wäägebalken 5kg
  • einen HX711 als Messverstärker (+ Umsetzer/Interface) für den Mikrocontroller

    Messverstärker HX711
    Messverstärker HX711
  • einen Arduino oder ESP8266-12 / NodeMCU oder einen RaspberryPi … für die Datenabfrage und Auswertung.

    nodemcu_devkit_1-0_blog
    NodeMCU (ein ESP8266 mit externer Beschaltung zum Entwickeln)

Konkret habe ich jetzt eine Node-MCU (ESP8266 + ein paar Bauteile) + ein LCD-Display im Einsatz, da ich das Gewicht direkt am Topf anzeigen lassen will, andererseits aber auch die Daten an meine Messwertdatenbank senden will: Da das ganze stationär betrieben wird, spielt der Stromverbrauch eine untergeordnete Rolle (kein Batteriebetrieb!).

Aufbau

Als Montagehilfe für den Wäägebalken habe ich Restteile einer zerlegten Küchenwaage verwendet. Wichtig ist jedoch lediglich, dass unter den Teil des Wäägebalkens mit den grösseren Löchern etwas untergelegt wird, was den Balken so anhebt, dass das andere Ende des Balkens frei in der Luft schwebt (ca. > 2mm). Dazu genügen auch 2-3 passende Unterlegscheiben..

Bei mir sieht das dann so aus:
waage_ansichtmitbeschreibung

Die Anschlussdrähte des Balkens werden mit dem Messverstärker HX711 verbunden (hier die Farben, welche ich bei meinen Balken vorgefunden und wie verbunden habe:

Schwarz an E+, Rot an E-, Grün an A+, Weiß an A-

Der Anschluss des Messverstärkers geschieht per I2C an den NodeMCU ist etwas gewöhnungsbedürftig, da die ESP8266 – GPIO-Zuordnung und die Platinenbeschriftung nicht wirklich etwas miteinander zu tun haben. In meinem Sketch im Github-Repository ist die Belegung entsprechend dokumentiert.

Datenausgabe/Speicherung

Für die direkte Anzeige vor Ort ist ein kleines LCD Display angeschlossen (ein 2-zeiliges LED-Display tut es aber ebenfalls, braucht nur mehr Anschlussleitungen …).

waagedisplay
TFT-Display im aktiven Betrieb

Das Display zeigt die aktuelle Zeit/Uhrzeit und den Wochentag an, weiterhin natürlich das aktuelle Gewicht (Die Ausgabe soll noch um eine Grafik des Gewichtsveränderung erweitert werden, später 🙂 ).
Zusätzlich lasse ich die IP-Adresse ausgeben, unter welcher die Waage erreichbar ist (dazu später mehr).

Mehr zu Kontrollzwecke erfolgt dann noch die Ausgabe des freien Heap-Speichers und der internen Loop-time (Dauer eines Messzyklus).

Der Sketch

Das Wesentliche an der Waage ist der steuernde Sketch (sonst wäre es eine gewöhnliche Küchenwaage).

Der Sketch befindet sich in aktuell der Beta-Phase (funktioniert aber schon sehr gut und ist im aktiven Einsatz, die Dokumentation ist ebenfalls noch dürftig… )

Dank

Der Sketch verwendet Teile eines Sketches eines guten Freundes (dreamshader aus dem Raspberry-Forum) als Basis für die Displayausgabe.

Weitere Teile und Bibliotheken sind von mir aus der Open-Source Community übernommen, angepasst und sinnvoll kombiniert worden und natürlich ist auch eigener Hirnschmalz eingeflossen 😉

Quelle und Hinweis

Der Sketch ist verfügbar unter  https://github.com/Zentris/weighbridge.

Da ich sporadisch weitere Funktionen (automatischen Kalibrierung, Biomassen-Kompensation usw.)  und natürlich Fehlerkorrekturen machen werde, ist es eine gute Idee, hier ab und zu mal reinzusehen… (RSS Feed verfügbar!) und/oder ein „Watch“ auf das Repositoy zu setzen.

Features
  • Zyklische Messung (ca. 5sec, konfigurierbar) des Gewichts der aufliegenden Masse grammgenau (höhere Genauigkeit möglich).
  • Anzeige des aktuelle Gewichts auf einem Display
  • Ermittlung der aktuellen Zeit/Datum per NTP (aus dem Internet oder von einem lokalen NTP-Server), Anzeige der Zeitinformation.
  • Senden der Gewichtsdaten an einen eigenen, konfigurierbaren Thingspeak-Account (abschaltbar).
  • Bereitstellung einer HTML-Serverschnittstelle (deshalb die IP Ausgabe auf dem Display, da die lokale Adresse per DHCP bezogen wird), welche die Abfrage des Gewichts und weitere Daten gestattet (REST-ähnliches Interface, wird ausgebaut)
  • Halb-Automatische Null-Kalibrierung
Geplante Erweiterungen
  • Speicherung der letzten xxx Messdaten (Anzahl oder Zeitraum, konfigurierbar) in EEPROM des ESP8266, Abfrage per REST-IF möglich
  • Speicherung der Daten auf einen per REST-IF erreichbaren Datenserver zur Langzeitspeicherung/Auswertung
  • Halbautomatische Kompensation Biomasserzuwachs (spezielle Erweiterung für die Erdfeuchtebestimmung über das Topfgewicht)
  • Temperatur/Luftfeuchtefühler (DHT22)

… und es geht weiter 🙂

Edit:

Nachdem ich eine Temperaturdrift des HX711 festgestellt habe, arbeite ich jetzt an einer Lösung, seht dazu auch den Beitrag https://www.n8chteule.de/zentris-blog/sensoren/hx711-temperaturdrift-analysieren/

5 Gedanken zu „Da bau ich doch eine Waage!“

  1. Danke, tolle Arbeit!
    Eine Frage:
    Wie hast du den Wägebalken kalibriert?
    oder wie kommst du auf die Werte von:
    static const float divisor = 100.0;
    static const float factorCalibrate2g = 199.0/428.0;

    static float correkture2null = 82244.8 – 33.5;

    Wäre für mich sehr interessant zu wissen.

    1. Sry für die lange Wartezeit auf die Antwort:

      Als erstes den Wert aus dem Wandler für die unbelastete Waage bestimmen.
      Dann ein definiertes Gewicht (Messbecher mit Wasser auf 1kg mit der Haushaltswaage eingemessen) drauf stellen und wieder ablesen.
      1kg Wert / 0kg Wert ist nun die Steilheit bzw. Empfindlichkeit der Waage.
      Diesen Wert (z.B. 1234) nun auf deine Ausgabegenauigkeit kalibrieren (das ist der Wert „factorCalibrate2g“)

      Der Faktor „correkture2null“ kommt ins Spiel, wenn du eine „Null g Drift“ feststellst: Mein Wandler driftet temperaturabhängig, so dass ich da eine Nullpunktkorrektur habe…

      War das soweit verständlich?

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.