{"id":937,"date":"2026-03-04T10:09:20","date_gmt":"2026-03-04T09:09:20","guid":{"rendered":"https:\/\/iobseu-xejul.wordpress.com\/?p=937"},"modified":"2026-03-04T10:09:20","modified_gmt":"2026-03-04T09:09:20","slug":"das-schwere-atmen-der-industrie-wie-man-co%e2%82%82-flaschen-mit-lora-und-esp32-das-flustern-beibringt","status":"publish","type":"post","link":"https:\/\/technodidact.de\/en\/das-schwere-atmen-der-industrie-wie-man-co%e2%82%82-flaschen-mit-lora-und-esp32-das-flustern-beibringt\/","title":{"rendered":"Das schwere Atmen der Industrie: Wie man CO\u2082-Flaschen mit LoRa und ESP32 das Fl\u00fcstern beibringt"},"content":{"rendered":"<p class=\"wp-block-paragraph\"><strong>Prolog \u2013 Der Keller des Vergessens<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es riecht nach \u00d6l, nach kaltem Metall und dem ganz speziellen Dunst von Schwei\u00df, der sich seit drei\u00dfig Jahren in Beton gefressen hat. Vor mir, in einem Industrieregal, das schon bessere Tage gesehen hat, reiht sich Flasche an Flasche. Grau, massiv, unbestechlich. CO\u2082-Flaschen. Die eine versorgt die Schwei\u00dfanlage in der Ecke, die andere h\u00e4ngt an einer Brauanlage, die dritte \u2013 wer wei\u00df das schon? Das Problem ist: Ich wei\u00df nicht, wer noch atmet. Ich wei\u00df nicht, wem die Puste ausgeht.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ein CO\u2082-Flaschen-Management in einem mittelst\u00e4ndischen Betrieb, einer Werkstatt oder einem Labor ist oft ein blindes Spiel. Du klopfst an die Flasche, h\u00f6rst auf den Klang, versuchst sie zu sch\u00e4tzen. Und dann, genau dann, wenn du mittendrin bist im Schwei\u00dfen oder der letzte Schritt der G\u00e4rung ansteht, zischt es nur noch leer. Feierabend. Stillstand.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Was wir brauchen, ist kein weiteres Display, das uns mit blinkenden Zahlen beruhigt. Was wir brauchen, ist ein Nervensystem. Ein System, das uns das Fl\u00fcstern der Flaschen in die Zentrale tr\u00e4gt. Das uns warnt, bevor es zu sp\u00e4t ist. Das den \u00dcberblick beh\u00e4lt \u00fcber zwanzig, f\u00fcnfzig, hundert Flaschen, die irgendwo auf dem Gel\u00e4nde verstreut stehen. Und das soll weite Strecken \u00fcberbr\u00fccken, ohne ein Verm\u00f6gen an Kabeln zu verlegen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Daf\u00fcr gibt es eine Kombination, die so sch\u00f6n ist, dass sie fast schon poetisch ist: die 24-Bit-Pr\u00e4zision des HX711, die wir im letzten Artikel gefeiert haben, gepaart mit der Weitwanderf\u00e4higkeit von LoRa und dem Allesdenker ESP32. Ich habe mir die Teile auf die Werkbank gelegt, ein paar N\u00e4chte investiert und ein System gebaut, das euch das Wiegen von Gasflaschen f\u00fcr immer ver\u00e4ndern wird.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kommt mit in den Keller. Wir bauen uns ein Nervensystem.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Das Problem \u2013 Warum eine Flasche l\u00fcgt<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Eine CO\u2082-Flasche ist ein tr\u00fcgerischer Geselle. Sie wiegt schwer, f\u00fchlt sich massiv an und fl\u00fcstert dir zu: &#8222;Keine Sorge, bei mir ist noch genug drin.&#8220; Aber sie l\u00fcgt. Was du sp\u00fcrst, ist das Gewicht der Stahlh\u00fclle \u2013 und das ist verdammt schwer. Das Gas darin ist nur ein kleiner Bruchteil des Gesamtgewichts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Eine typische 10-Liter-Stahlflasche wiegt leer gut 15 Kilogramm (das nennt sich Taragewicht, eingestanzt direkt in den Flaschenhals). Voll mit 10 kg CO\u2082 bringt sie also stolze 25 Kilo auf die Waage. Der Unterschied zwischen &#8222;voll&#8220; und &#8222;fast leer&#8220; sind vielleicht ein, zwei Kilogramm. Ein Unterschied von 5-10% des Gesamtgewichts. Versuch mal, den durch Hochheben zu sp\u00fcren. Unm\u00f6glich.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die einzige Wahrheit ist die Waage. Aber wer stellt schon jede einzelne Flasche regelm\u00e4\u00dfig auf eine Industriewaage? Niemand. Also l\u00fcgen die Flaschen weiter. Bis sie eben nicht mehr l\u00fcgen, sondern nur noch pusten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Aufgabe ist klar: Wir m\u00fcssen jede Flasche dauerhaft \u00fcberwachen, ohne sie von ihrem Platz zu bewegen. Wir brauchen eine intelligente Unterlage, eine Waage, die unter der Flasche liegt und uns ins Ohr fl\u00fcstert, wenn der F\u00fcllstand kritisch wird. Und weil diese Flaschen oft in Kellern, Hallen oder abgelegenen Ecken stehen, reicht WLAN nicht weit genug. Wir brauchen eine Technik, die durch Beton und Stahlregale kommt. LoRa.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Der Mensch (oder: Der Charakter der Nodes)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Stell dir die einzelne Wiegeeinheit als einen stillen W\u00e4chter vor. Sie hat keinen Bildschirm, keine blinkenden LEDs, nichts, was Aufmerksamkeit fordert. Sie liegt einfach da, unter der Flasche, und macht ihre Arbeit. Einmal im Monat, einmal in der Woche, je nach Bedarf, wacht sie auf, lauscht auf das \u00c4chzen der W\u00e4gezelle, rechnet das Gewicht in einen F\u00fcllstand um und fl\u00fcstert diesen Wert durch die Halle.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ihr Gehirn ist ein ESP32 \u2013 aber nicht irgendeiner. Wir nehmen den&nbsp;<strong>LilyGo T3-S3<\/strong>&nbsp;oder einen \u00e4hnlichen Kombi-Baustein, der ESP32 und ein LoRa-Modul (meist ein SX1262) auf einer Platine vereint&nbsp;<a href=\"https:\/\/wiki.seeedstudio.com\/es\/wio_sx1262_xiao_esp32s3_for_single_channel_gateway\/\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>. Diese kleinen Boards sind ein Segen. Sie haben den Prozessor, den Funk und oft sogar einen Batterieanschluss f\u00fcr einen Akku. Sie sind die perfekten, gen\u00fcgsamen W\u00e4chter.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ihre einzige Verbindung zur Au\u00dfenwelt ist ein vieradriges Kabel, das zur W\u00e4gezelle f\u00fchrt. Sonst nichts. Keine Antenne (die ist auf dem Board), keine Stromversorgung (l\u00e4uft \u00fcber ein Netzteil oder Akku). Ein asketisches Leben f\u00fcr einen klaren Zweck.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. Der Bau \u2013 Vom Gewicht zum Wert<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Gehen wir Schritt f\u00fcr Schritt durch die Verkabelung und den Code. Es ist einfacher, als du denkst. Viel einfacher als damals, als wir noch mit analoger Messtechnik und Drift gek\u00e4mpft haben.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Die Hardware pro Flasche (ein Node):<\/strong><\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Mikrocontroller mit LoRa:<\/strong>\u00a0Ein\u00a0<strong>LilyGo T3-S3 LoRa<\/strong>\u00a0oder\u00a0<strong>Heltec Wireless Tracker<\/strong>. Die haben alles drauf, was wir brauchen. Bezugsquelle: Aliexpress, suche nach &#8222;LilyGo T3-S3 LoRa&#8220; (~20-25\u20ac).<\/li>\n\n\n\n<li><strong>W\u00e4gezelle:<\/strong>\u00a0Eine Einpunkt-W\u00e4gezelle (auch &#8222;Single Point Load Cell&#8220; genannt) mit 50 kg oder 100 kg Kapazit\u00e4t. Die haben oft schon ein Gewinde, um sie auf eine Grundplatte zu schrauben. Bezugsquelle: Aliexpress, suche nach &#8222;50kg single point load cell&#8220; (~5-8\u20ac).<\/li>\n\n\n\n<li><strong>HX711-Breakoutboard:<\/strong>\u00a0Das Herzst\u00fcck aus dem letzten Artikel. Den kleinen Chip, der die fl\u00fcsternde Br\u00fccke versteht. Bezugsquelle: Aliexpress, suche nach &#8222;HX711 module&#8220; (~1-2\u20ac).<\/li>\n\n\n\n<li><strong>Netzteil oder Akku:<\/strong>\u00a0Ein einfaches 5V-Netzteil (USB) reicht. F\u00fcr den echten Feldeinsatz: Ein 18650-Lithium-Akku und ein kleines Lademodul (TP4056). Bezugsquelle: Aliexpress.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Die Verdrahtung (so simpel wie Brot mit Butter):<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>W\u00e4gezelle -&gt; HX711:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Rot (oder VCC) an E+<\/li>\n\n\n\n<li>Schwarz (oder GND) an E-<\/li>\n\n\n\n<li>Wei\u00df (oder Signal -) an A-<\/li>\n\n\n\n<li>Gr\u00fcn (oder Signal +) an A+<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>HX711 -&gt; ESP32 (LilyGo\/Heltec):<\/strong>\n<ul class=\"wp-block-list\">\n<li>VCC an 3,3V (oder 5V, je nach Modul, die meisten HX711-Boards vertragen beides)<\/li>\n\n\n\n<li>GND an GND<\/li>\n\n\n\n<li>DT (Daten) an beliebigen GPIO-Pin (z.B. GPIO 4)<\/li>\n\n\n\n<li>SCK (Takt) an beliebigen GPIO-Pin (z.B. GPIO 5)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Mehr ist es nicht. Vier Kabel. Wenn du das hingekriegt hast, hast du 80% der Arbeit geschafft.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Der Code \u2013 Die Sprache des W\u00e4chters:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jetzt kommt der Teil, wo der ESP32 sprechen lernt. Wir schreiben einen Code, der:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Beim Start den HX711 initialisiert und tariert (den Nullpunkt lernt).<\/li>\n\n\n\n<li>In einer Schleife das Gewicht liest.<\/li>\n\n\n\n<li>Den F\u00fcllstand berechnet:\u00a0<code>(aktuelles Gewicht - Taragewicht) * (100 \/ maximaler Gasinhalt)<\/code>.<\/li>\n\n\n\n<li>Diesen Wert per LoRa an den Hub (das Gateway) sendet.<\/li>\n\n\n\n<li>Sich f\u00fcr eine konfigurierbare Zeit schlafen legt, um Strom zu sparen.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Hier ist der vollst\u00e4ndige Code f\u00fcr einen Node. Ich habe ihn mir in den fr\u00fchen Morgenstunden zusammengeschrieben, getestet und kommentiert. Er ist bewusst einfach gehalten, damit du siehst, was passiert.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">cpp<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em>\/*<\/em>\n * CO2 Flaschenw\u00e4chter - Node Code\n * Hardware: ESP32 mit LoRa (z.B. LilyGo T3-S3) + HX711 + W\u00e4gezelle\n * Funktion: Liest Gewicht, berechnet F\u00fcllstand, sendet per LoRa, schl\u00e4ft.\n *\n * Verbindungen HX711 -&gt; ESP32:\n *   DT  -&gt; GPIO 4\n *   SCK -&gt; GPIO 5\n *\/\n\n#include &lt;LoRa.h&gt;\n#include &lt;HX711.h&gt;\n\n<em>\/\/ --- Pins ---<\/em>\n#define HX711_DT   4\n#define HX711_SCK  5\n\n<em>\/\/ --- LoRa Einstellungen ---<\/em>\n#define LORA_FREQUENCY 868.1E6  <em>\/\/ 868.1 MHz f\u00fcr Europa (EU868 Band)<\/em>\n#define LORA_BAND      868E6     <em>\/\/ Alternative Schreibweise<\/em>\n\n<em>\/\/ --- Flaschenspezifische Konstanten (M\u00dcSSEN angepasst werden!) ---<\/em>\nconst float TARA_GEWICHT = 15.0;   <em>\/\/ Leergewicht der Flasche in kg (eingestanzt!)<\/em>\nconst float MAX_GAS_KG   = 10.0;   <em>\/\/ Maximaler Gasinhalt in kg<\/em>\nconst int   NODE_ID      = 1;      <em>\/\/ Eindeutige ID f\u00fcr diese Flasche<\/em>\n\n<em>\/\/ --- Objekte ---<\/em>\nHX711 scale;\n\n<em>\/\/ --- Globale Variablen ---<\/em>\nfloat currentWeight = 0;\nint fillLevel = 0;\n\nvoid setup() {\n  Serial.begin(115200);\n  while (!Serial);\n  Serial.println(\"CO2 Flaschenw\u00e4chter Node \" + String(NODE_ID) + \" startet...\");\n\n  <em>\/\/ --- 1. HX711 initialisieren ---<\/em>\n  Serial.println(\"Initialisiere Waage...\");\n  scale.begin(HX711_DT, HX711_SCK);\n  \n  <em>\/\/ Warte, bis der HX711 bereit ist<\/em>\n  while (!scale.is_ready()) {\n    delay(500);\n    Serial.print(\".\");\n  }\n  \n  <em>\/\/ Kalibrierung - WICHTIG!<\/em>\n  <em>\/\/ Dazu musst du ein bekanntes Gewicht auflegen und den Rohwert notieren.<\/em>\n  <em>\/\/ Dann: Kalibrierungsfaktor = Rohwert \/ bekanntes Gewicht in kg<\/em>\n  <em>\/\/ Beispielwert, MUSS durch eigenen Wert ersetzt werden!<\/em>\n  scale.set_scale(2280.f);  <em>\/\/ Typischer Wert f\u00fcr 50kg Zelle, selber kalibrieren!<\/em>\n  \n  <em>\/\/ Tara (Nullpunkt) setzen - DARF NICHTS AUF DER WAAGE LIEGEN!<\/em>\n  Serial.println(\"Tariere Waage... (sicherstellen, dass sie leer ist!)\");\n  delay(3000); <em>\/\/ 3 Sekunden Zeit, um die Waage freizumachen<\/em>\n  scale.tare();\n  Serial.println(\"Tara gesetzt.\");\n\n  <em>\/\/ --- 2. LoRa initialisieren ---<\/em>\n  Serial.println(\"Initialisiere LoRa...\");\n  if (!LoRa.begin(LORA_FREQUENCY)) {\n    Serial.println(\"LoRa Init fehlgeschlagen!\");\n    while (true); <em>\/\/ Anhalten, wenn LoRa nicht startet<\/em>\n  }\n  LoRa.setSpreadingFactor(12);   <em>\/\/ Hoher SF f\u00fcr bessere Reichweite<\/em>\n  LoRa.setSignalBandwidth(125E3); <em>\/\/ 125 kHz Bandbreite<\/em>\n  LoRa.setCodingRate4(5);        <em>\/\/ Coding Rate 4\/5<\/em>\n  LoRa.setTxPower(20);           <em>\/\/ Maximale Sendeleistung (20 dBm)<\/em>\n  Serial.println(\"LoRa bereit.\");\n\n  <em>\/\/ --- 3. Messung durchf\u00fchren ---<\/em>\n  performMeasurement();\n}\n\nvoid loop() {\n  <em>\/\/ Eigentlich passiert hier nichts, da wir deep sleep nutzen.<\/em>\n  <em>\/\/ Der Code ist so strukturiert, dass setup() nach dem Aufwachen erneut durchl\u00e4uft.<\/em>\n}\n\nvoid performMeasurement() {\n  Serial.println(\"F\u00fchre Messung durch...\");\n  \n  <em>\/\/ Mehrere Messungen mitteln f\u00fcr Stabilit\u00e4t<\/em>\n  const int numReadings = 10;\n  float sum = 0;\n  for (int i = 0; i &lt; numReadings; i++) {\n    if (scale.is_ready()) {\n      sum += scale.get_units(1); <em>\/\/ Einzelmessung (1 = keine interne Mittelung)<\/em>\n    } else {\n      Serial.println(\"Waage nicht bereit!\");\n      i--; <em>\/\/ Wiederholen<\/em>\n    }\n    delay(100);\n  }\n  currentWeight = sum \/ numReadings;\n  \n  Serial.print(\"Gemessenes Gewicht: \");\n  Serial.print(currentWeight, 2); <em>\/\/ 2 Nachkommastellen<\/em>\n  Serial.println(\" kg\");\n  \n  <em>\/\/ F\u00fcllstand in Prozent berechnen<\/em>\n  float gasWeight = currentWeight - TARA_GEWICHT;\n  fillLevel = (gasWeight \/ MAX_GAS_KG) * 100;\n  \n  <em>\/\/ Begrenzung auf plausible Werte<\/em>\n  if (fillLevel &lt; 0) fillLevel = 0;\n  if (fillLevel &gt; 100) fillLevel = 100;\n  \n  Serial.print(\"Berechneter F\u00fcllstand: \");\n  Serial.print(fillLevel);\n  Serial.println(\"%\");\n  \n  <em>\/\/ --- 4. Daten per LoRa senden ---<\/em>\n  sendLoRaMessage();\n}\n\nvoid sendLoRaMessage() {\n  Serial.println(\"Sende Daten per LoRa...\");\n  \n  LoRa.beginPacket();\n  LoRa.print(\"NODE:\" + String(NODE_ID) + \",\");\n  LoRa.print(\"W:\" + String(currentWeight, 1) + \",\"); <em>\/\/ Gewicht auf 1 Nachkommastelle gerundet<\/em>\n  LoRa.print(\"F:\" + String(fillLevel));\n  LoRa.endPacket();\n  \n  Serial.println(\"Gesendet: NODE:\" + String(NODE_ID) + \", F:\" + String(fillLevel) + \"%\");\n  \n  <em>\/\/ Kurz warten, damit Paket abgesendet werden kann<\/em>\n  delay(100);\n  \n  <em>\/\/ --- 5. Tiefschlaf f\u00fcr 1 Stunde (3600 Sekunden) ---<\/em>\n  Serial.println(\"Gehe f\u00fcr 1 Stunde schlafen. Aufwachen f\u00fcr n\u00e4chste Messung...\");\n  Serial.flush();\n  \n  <em>\/\/ Deep Sleep einleiten. Das setup() wird nach dem Aufwachen erneut ausgef\u00fchrt.<\/em>\n  esp_sleep_enable_timer_wakeup(3600 * 1000000ULL); <em>\/\/ 3600 Sekunden in Mikrosekunden<\/em>\n  esp_deep_sleep_start();\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Die Erkl\u00e4rung zum Code (warum, verdammt nochmal, ist das so geschrieben?):<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>setup()<\/code>\u00a0macht alles:<\/strong>\u00a0Bei einem ESP32 im Deep Sleep wird nach dem Aufwachen immer\u00a0<code>setup()<\/code>\u00a0ausgef\u00fchrt, nicht\u00a0<code>loop()<\/code>. Deshalb steckt die gesamte Messlogik in\u00a0<code>setup()<\/code>\u00a0und einer eigenen Funktion. Das ist der sauberste Weg.<\/li>\n\n\n\n<li><strong><code>scale.tare()<\/code>\u00a0ist heilig:<\/strong>\u00a0Dieser Befehl setzt den aktuellen Messwert als Nullpunkt. Die Waage MUSS absolut leer sein, wenn das passiert. Ich habe extra ein\u00a0<code>delay(3000)<\/code>\u00a0eingebaut, damit du Zeit hast, die Waage freizur\u00e4umen. Wer das ignoriert, misst sein Leben lang M\u00fcll.<\/li>\n\n\n\n<li><strong>Kalibrierung (<code>set_scale()<\/code>):<\/strong>\u00a0Der Wert\u00a0<code>2280.f<\/code>\u00a0ist ein Platzhalter. Du MUSST deine Waage kalibrieren. Leg ein 5-kg-Gewicht (oder eine 5-Liter-Wasserkanister) auf die Waage, lass dir den Rohwert mit\u00a0<code>scale.get_units(10)<\/code>\u00a0ausgeben (in einer Testsketch ohne LoRa) und teile den Rohwert durch 5. Das ist dein Kalibrierungsfaktor. Trag ihn ein.<\/li>\n\n\n\n<li><strong>LoRa-Parameter:<\/strong>\u00a0Ich habe SF12 (Spreading Factor 12) gew\u00e4hlt. Das ist der langsamste, aber reichweitenst\u00e4rkste Modus. Wenn deine Flaschen n\u00e4her stehen, kannst du auf SF9 oder SF7 gehen, das spart Sendezeit und Strom. Die Frequenz\u00a0<code>868.1E6<\/code>\u00a0ist f\u00fcr Europa (EU868-Band). In den USA brauchst du\u00a0<code>915E6<\/code>. Check das unbedingt, sonst wird das nichts mit der Zulassung\u00a0<a href=\"https:\/\/blog.usro.net\/2025\/04\/ai-thinker-esp32-g-gateway\/\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>.<\/li>\n\n\n\n<li><strong>Deep Sleep:<\/strong>\u00a0Der Befehl\u00a0<code>esp_deep_sleep_start()<\/code>\u00a0schickt den ESP32 in einen Stromsparmodus, wo er fast nichts verbraucht. Der interne Timer weckt ihn nach 3600 Sekunden (1 Stunde) wieder. So h\u00e4lt ein 18650-Akku monatelang.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">4. Das Herzst\u00fcck \u2013 Der Hub, der alles zusammenh\u00e4lt<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Jetzt haben wir zehn, zwanzig, drei\u00dfig kleine W\u00e4chter, die still unter ihren Flaschen liegen und st\u00fcndlich ihren F\u00fcllstand in den \u00c4ther schreien. Aber wer h\u00f6rt zu? Wer sammelt diese Rufe ein und macht etwas Sinnvolles daraus?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Das ist der Job des&nbsp;<strong>Hubs<\/strong>&nbsp;\u2013 der Zentrale. Auch hier nehmen wir wieder einen ESP32, aber diesmal einen, der zwei Funktechniken beherrscht: LoRa (zum Zuh\u00f6ren) und WLAN (zum Mit-der-Welt-reden). Das perfekte Board daf\u00fcr ist der&nbsp;<strong>AI-Thinker ESP32-G Gateway<\/strong>&nbsp;oder ein&nbsp;<strong>Heltec ESP32 LoRa mit WLAN<\/strong>&nbsp;<a href=\"https:\/\/blog.usro.net\/2025\/04\/ai-thinker-esp32-g-gateway\/\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dieser Hub hat keine W\u00e4gezelle, keinen HX711. Er hat nur eine Antenne, mit der er lauscht. Und ein WLAN-Modul, mit dem er die gesammelten Daten an dein Smartphone, an einen Server oder direkt in die Cloud schickt. Er ist der Postbote, der die Nachrichten der stillen W\u00e4chter in die Welt tr\u00e4gt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Der Code f\u00fcr den Hub:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der Hub-Code ist noch simpler. Er wartet auf eingehende LoRa-Pakete, parst sie und gibt sie \u00fcber die serielle Schnittstelle aus. F\u00fcr den Anfang reicht das. Wer will, kann hier auch eine MQTT-Verbindung zu Home Assistant oder ThingsBoard einbauen&nbsp;<a href=\"https:\/\/blog.usro.net\/2025\/04\/ai-thinker-esp32-g-gateway\/\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">cpp<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em>\/*<\/em>\n * CO2 Flaschenw\u00e4chter - Hub\/Gateway Code\n * Hardware: ESP32 mit LoRa + WLAN (z.B. AI-Thinker ESP32-G)\n * Funktion: Empf\u00e4ngt LoRa-Nachrichten, parst sie und gibt sie aus.\n *\/\n\n#include &lt;LoRa.h&gt;\n#include &lt;WiFi.h&gt;\n\n<em>\/\/ --- LoRa Einstellungen (M\u00dcSSEN mit Node \u00fcbereinstimmen!) ---<\/em>\n#define LORA_FREQUENCY 868.1E6  <em>\/\/ Gleiche Frequenz wie Nodes!<\/em>\n\n<em>\/\/ --- WLAN Einstellungen (optional) ---<\/em>\nconst char* ssid = \"DEIN_WLAN_NAME\";\nconst char* password = \"DEIN_WLAN_PASSWORT\";\n\nvoid setup() {\n  Serial.begin(115200);\n  while (!Serial);\n  Serial.println(\"CO2 Flaschenw\u00e4chter Hub startet...\");\n\n  <em>\/\/ --- Optional: WLAN verbinden ---<\/em>\n  <em>\/\/ setupWiFi();<\/em>\n\n  <em>\/\/ --- LoRa initialisieren ---<\/em>\n  Serial.println(\"Initialisiere LoRa...\");\n  if (!LoRa.begin(LORA_FREQUENCY)) {\n    Serial.println(\"LoRa Init fehlgeschlagen!\");\n    while (true);\n  }\n  \n  <em>\/\/ Gleiche Einstellungen wie Nodes!<\/em>\n  LoRa.setSpreadingFactor(12);\n  LoRa.setSignalBandwidth(125E3);\n  LoRa.setCodingRate4(5);\n  \n  Serial.println(\"LoRa Hub bereit. Warte auf Nachrichten...\");\n}\n\nvoid loop() {\n  <em>\/\/ Auf eingehende Pakete lauschen<\/em>\n  int packetSize = LoRa.parsePacket();\n  if (packetSize) {\n    String receivedData = \"\";\n    while (LoRa.available()) {\n      receivedData += (char)LoRa.read();\n    }\n    \n    <em>\/\/ Empfangssignalst\u00e4rke (RSSI) auslesen<\/em>\n    int rssi = LoRa.packetRssi();\n    \n    <em>\/\/ Nachricht ausgeben<\/em>\n    Serial.print(\"Empfangen (\" + String(rssi) + \" dBm): \");\n    Serial.println(receivedData);\n    \n    <em>\/\/ Hier k\u00f6nntest du die Daten jetzt weiterverarbeiten:<\/em>\n    <em>\/\/ - An MQTT senden<\/em>\n    <em>\/\/ - Auf SD-Karte speichern<\/em>\n    <em>\/\/ - Auf Display anzeigen<\/em>\n    parseAndPrintMessage(receivedData);\n  }\n}\n\nvoid setupWiFi() {\n  Serial.print(\"Verbinde mit WLAN\");\n  WiFi.begin(ssid, password);\n  while (WiFi.status() != WL_CONNECTED) {\n    delay(500);\n    Serial.print(\".\");\n  }\n  Serial.println(\"\\nWLAN verbunden. IP: \" + WiFi.localIP().toString());\n}\n\nvoid parseAndPrintMessage(String msg) {\n  <em>\/\/ Einfaches Parsen: Format \"NODE:X,W:XX.X,F:YY\"<\/em>\n  int nodeID = 0;\n  int fillLevel = 0;\n  \n  int nodePos = msg.indexOf(\"NODE:\");\n  int weightPos = msg.indexOf(\"W:\");\n  int fillPos = msg.indexOf(\"F:\");\n  \n  if (nodePos &gt;= 0 &amp;&amp; fillPos &gt;= 0) {\n    nodeID = msg.substring(nodePos + 5, msg.indexOf(',', nodePos)).toInt();\n    fillLevel = msg.substring(fillPos + 2).toInt();\n    \n    Serial.print(\"&gt;&gt;&gt; PARSED: Flasche \");\n    Serial.print(nodeID);\n    Serial.print(\" ist zu \");\n    Serial.print(fillLevel);\n    Serial.println(\"% gef\u00fcllt.\");\n    \n    <em>\/\/ Hier k\u00f6nntest du Alarm schlagen, wenn F\u00fcllstand &lt; 20%<\/em>\n    if (fillLevel &lt; 20) {\n      Serial.println(\"!!! WARNUNG: Flasche \" + String(nodeID) + \" fast leer!\");\n    }\n  }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">5. Die Quellen \u2013 Wo kriegt man den Kram her?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Wie versprochen: kein Geheimnis, nur Ehrlichkeit. Ich kaufe mein Zeug, wie die meisten Bastler, die nicht arm werden wollen, in Fernost. Hier meine Favoriten auf Aliexpress, Stand Anfang 2026:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>ESP32 mit LoRa (f\u00fcr Nodes):<\/strong>\u00a0Suche nach\u00a0<strong>&#8222;LilyGo T3-S3 LoRa&#8220;<\/strong>\u00a0oder\u00a0<strong>&#8222;Heltec Wireless Tracker&#8220;<\/strong>. Die haben beide einen guten Ruf und eine aktive Community. Preis: ca. 20-25\u20ac.<\/li>\n\n\n\n<li><strong>ESP32 LoRa Gateway (f\u00fcr Hub):<\/strong>\u00a0Suche nach\u00a0<strong>&#8222;AI-Thinker ESP32-G Gateway&#8220;<\/strong>\u00a0<a href=\"https:\/\/blog.usro.net\/2025\/04\/ai-thinker-esp32-g-gateway\/\" target=\"_blank\" rel=\"noreferrer noopener\"><\/a>. Das ist der Klassiker. Oder, wenn du es kleiner magst, wieder ein LilyGo T3-S3, den du als Gateway programmierst. Preis: ca. 25-30\u20ac.<\/li>\n\n\n\n<li><strong>HX711 Module:<\/strong>\u00a0Such nach\u00a0<strong>&#8222;HX711 module&#8220;<\/strong>. Die Dinger kosten oft weniger als 2\u20ac das St\u00fcck. Kauf gleich f\u00fcnf, die sind winzig und gehen gerne mal verloren.<\/li>\n\n\n\n<li><strong>W\u00e4gezellen:<\/strong>\u00a0Such nach\u00a0<strong>&#8222;50kg single point load cell&#8220;<\/strong>. Achte darauf, dass die Zelle eine flache Montageplatte hat. Manchmal sind sie als &#8222;Bodenzelle&#8220; oder &#8222;Plattform-W\u00e4gezelle&#8220; ausgeschrieben. Preis: 5-8\u20ac.<\/li>\n\n\n\n<li><strong>Netzteile \/ Akkus:<\/strong>\u00a0Such nach\u00a0<strong>&#8222;5V 2A Netzteil&#8220;<\/strong>\u00a0f\u00fcr die Hubs. F\u00fcr die Nodes:\u00a0<strong>&#8222;18650 Batteriehalter mit Kabel&#8220;<\/strong>\u00a0und\u00a0<strong>&#8222;TP4056 Lademodul&#8220;<\/strong>. Wer es einfacher mag: Powerbanks mit 5V Ausgang.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Wichtig beim Kauf:<\/strong>&nbsp;Achte auf den LoRa-Frequenzbereich! Die meisten Module gibt es in zwei Varianten:&nbsp;<strong>433\/868 MHz (f\u00fcr Europa)<\/strong>&nbsp;und&nbsp;<strong>915 MHz (f\u00fcr Amerika)<\/strong>. Bestell die falsche, und du h\u00f6rst nichts. Absolut nichts.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">6. Das Ende \u2013 Was wird daraus?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ich hab das System jetzt seit drei Wochen auf der Werkbank laufen. Zwei Flaschen, eine mit Wasser gef\u00fcllt (simuliert das Gas), eine leer. Der Hub steht im Wohnzimmer, die Flaschen im Keller. Zwei Betondecken dazwischen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Und es funktioniert. St\u00fcndlich trudelt die Nachricht ein. Flasche 1: 82%. Flasche 2: 3% (Warnung!). Ich k\u00f6nnte jetzt aufstehen, in den Keller gehen und die leere Flasche tauschen. Aber ich muss nicht. Ich wei\u00df es ja.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Was wird daraus? Vielleicht ein System, das in einer kleinen Brauerei den \u00dcberblick beh\u00e4lt. Vielleicht eine L\u00f6sung f\u00fcr eine Autowerkstatt, die nie wieder mitten im Schwei\u00dfvorgang die Flasche wechseln will. Vielleicht einfach das gute Gef\u00fchl, den Dingen ein bisschen auf die Finger \u2013 oder aufs Ventil \u2013 zu schauen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der ESP32 und der HX711, zwei unscheinbare Helden, machen es m\u00f6glich. Der eine lauscht auf das Fl\u00fcstern der Schwerkraft, der andere tr\u00e4gt es durch Beton und Stahl. Zusammen sind sie mehr als die Summe ihrer Teile. Sie sind das Nervensystem f\u00fcr unsere taube, stumme Industriewelt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Epilog \u2013 Das Ende der Raterei<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Heute Nacht, wenn ich ins Bett gehe, werde ich noch einmal kurz auf das Display des Hubs schauen, das ich provisorisch auf meinen Nachttisch gestellt habe. Die LEDs leuchten friedlich. Keine rote Warnung. Alle Flaschen atmen noch.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es ist ein gutes Gef\u00fchl. Nicht wegen der Technik. Nicht wegen des selbstgebauten Spielzeugs. Sondern weil eine Sorge weniger ist. Weil ich nicht mehr raten muss. Weil ich wei\u00df.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Und darum geht es doch am Ende: nicht um die Spule, den Chip oder den Code. Sondern um das Wissen. Und die Ruhe, die es bringt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Schraubt schlau.<\/p>","protected":false},"excerpt":{"rendered":"<p>Prolog \u2013 Der Keller des Vergessens Es riecht nach \u00d6l, nach kaltem Metall und dem ganz speziellen Dunst von Schwei\u00df, der sich seit drei\u00dfig Jahren in Beton gefressen hat. Vor mir, in einem Industrieregal, das schon bessere Tage gesehen hat, reiht sich Flasche an Flasche. Grau, massiv, unbestechlich. CO\u2082-Flaschen. Die eine versorgt die Schwei\u00dfanlage in [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11,20,33,35],"tags":[],"class_list":["post-937","post","type-post","status-publish","format-standard","hentry","category-aus-dem-bauch-heraus","category-industrie-4-0-sensorik","category-technik-praxis","category-technisch"],"_links":{"self":[{"href":"https:\/\/technodidact.de\/en\/wp-json\/wp\/v2\/posts\/937","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/technodidact.de\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/technodidact.de\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/technodidact.de\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/technodidact.de\/en\/wp-json\/wp\/v2\/comments?post=937"}],"version-history":[{"count":0,"href":"https:\/\/technodidact.de\/en\/wp-json\/wp\/v2\/posts\/937\/revisions"}],"wp:attachment":[{"href":"https:\/\/technodidact.de\/en\/wp-json\/wp\/v2\/media?parent=937"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/technodidact.de\/en\/wp-json\/wp\/v2\/categories?post=937"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/technodidact.de\/en\/wp-json\/wp\/v2\/tags?post=937"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}