Bauen Sie einen Tankvolumenmesser für unter 30 $mit einem ESP32

María Hernández
· Lesezeit: 7 Minuten
Per E-Mail versenden

Das Internet der Dinge hat viele ehemals komplexe Geräteanwendungen in die Haushalte vieler Hobbybrauer und Winzer gebracht. Anwendungen mit Füllstandssensoren werden seit Jahrzehnten in großen Raffinerien, Wasseraufbereitungsanlagen und Chemieanlagen eingesetzt. Dank sinkender Sensorpreise können nun sowohl Industriebetriebe als auch Heimwerker das Volumen von Tanks, Fässern oder Kanistern überwachen.

Die im Handel erhältlichen Sensoren können nahezu alles erfassen und werden entsprechend klassifiziert. Der Sensor zur Messung der Luftfeuchtigkeit heißt Feuchtigkeitssensor, der zur Messung des Drucks Drucksensor , der zur Messung von Entfernungen Positionssensor usw. Analog dazu wird der Sensor zur Messung von Flüssigkeitsständen als Füllstandssensor .

Die Füllstandssensoren dienen der Messung des Füllstands von frei fließenden Substanzen . Zu diesen Substanzen zählen Flüssigkeiten wie Wasser, Öl, Schlämme usw. sowie Feststoffe in Granulat- oder Pulverform (die rieselfähig sind). Diese Substanzen setzen sich aufgrund der Schwerkraft in den Behältern ab und halten ihren Füllstand im Ruhezustand konstant.

In dieser Anleitung erfahren Sie, wie Sie einen eigenen Füllstand, Temperatur und Luftfeuchtigkeit Ubidots , eine Plattform zur Anwendungsentwicklung, nutzen können

Anforderungen

Verkabelung und Gehäuse

Der Sensor HC-SR04 (Ultraschallsensor) arbeitet mit 5V-Logik. Bitte beachten Sie die untenstehende Tabelle und das Diagramm, um die korrekten Verbindungen zwischen dem ESP32 und dem Ultraschallsensor herzustellen:

Bitte beachten Sie die untenstehende Tabelle, um die korrekten Verbindungen zwischen dem ESP32 und dem DHT11 -Sensor (Temperatur- und Feuchtigkeitssensor) herzustellen:

Ich habe einen kleinen Prototyp mit einem maßstabsgetreuen Panzer gebaut, um die Funktionen des Sensors zu demonstrieren, aber ein endgültiger Prototyp mit Gehäuse sollte folgendermaßen aussehen:

Wie Sie sehen können, sollte sich der Ultraschallsensor oben im Tank befinden. Mit ihm können wir den Abstand zwischen dem oberen Teil des Tanks und dem Endpunkt der Substanz messen:

Platzieren Sie die Temperatur- und Feuchtigkeitssensoren zur Überwachung einer Umgebung.

Um Ihr angeschlossenes Gerät zu programmieren, verbinden Sie sich mit der Arduino IDE.

Bevor Sie mit dem ESP32 beginnen, richten Sie Ihr Board mit der Arduino IDE ein. Falls Sie mit der Einrichtung eines Boards nicht vertraut sind, lesen Sie bitte den folgenden Artikel und folgen Sie den Anweisungen Schritt für Schritt, bis Sie das Board kompiliert haben:

Sobald Ihr Board kompiliert ist, installieren Sie die zum Ausführen der Sensoren erforderlichen Bibliotheken: „ PubSubClient “ und „ DHT

  1. Gehen Sie zu Sketch/Programme → Bibliothek einbinden → Bibliotheksverwaltung und installieren Sie die PubSubClient- Bibliothek. Um die richtige Bibliothek zu finden, suchen Sie einfach in der Suchleiste nach „PubSubClient“
  2. Gehen Sie zum Bibliotheks-Repository, um die DHT-Bibliothek . Klicken Sie dazu auf die grüne Schaltfläche „ Klonen oder herunterladen “ und wählen Sie „ ZIP herunterladen “.
  3. Klicken Sie nun in der Arduino IDE auf Sketch -> Bibliothek einbinden -> .ZIP-Bibliothek hinzufügen.
  4. Wählen Sie die .ZIP-Datei von DHT und klicken Sie dann auf „ Akzeptieren “ oder „ Auswählen “.

Schließen Sie die Arduino IDE und öffnen Sie sie erneut. Ein Neustart ist erforderlich; bitte überspringen Sie diesen Schritt nicht.

Jetzt ist es an der Zeit, mit dem Programmieren zu beginnen 🙂

Kopiere den unten stehenden Code und füge ihn in die Arduino IDE ein.

Als Nächstes weisen Sie die Parameter zu: WLAN-Name und -Passwort sowie Ihr eindeutiges Ubidots Token. Falls Sie nicht wissen, wo Sie Ihr Ubidots Token finden, lesen Sie bitte den folgenden Artikel.

/************************************************************************************************* * Dieses Beispiel sendet fest codierte Daten mithilfe eines ESP32 an Ubidots . Der Code sendet einen Entfernungswert * zwischen einem Gerät und seinem gegenüberliegenden Endpunkt an Ubidots. Dieser Wert wird dann in * Ubidots verarbeitet, um das Volumen eines Tanks anhand seiner Eigenschaften zu berechnen. * * Dieses Beispiel wird ohne jegliche Gewährleistung bereitgestellt. * * Erstellt von María Carlina Hernandez. *************************************************************************************************/ /******************************************** * Eingebundene Bibliotheken ****************************************/ #include<WiFi.h> #enthalten<PubSubClient.h> #enthalten<DHT.h> /**************************************** * Konstanten definieren ****************************************/ namespace { const char * WIFISSID = "Ihre_WLAN-SSID_hier_eintragen"; // Hier Ihre WLAN-SSID einfügen const char * PASSWORD = "Ihre_WLAN-SSID_hier_eintragen"; // Hier Ihr WLAN-Passwort einfügen const char * TOKEN = "Ubidots"; // Hier Ihren Ubidots-Token einfügen const char * MQTT_CLIENT_NAME = "MQTT_Client_hier_eintragen"; // MQTT-Clientname, bitte geben Sie eine 8-12 Zeichen lange alphanumerische ASCII-Zeichenkette ein; const char * VARIABLE_LABEL_1 = "Entfernung"; // Variablenbezeichnung zuweisen const char * VARIABLE_LABEL_2 = "Luftfeuchtigkeit"; // Variablenbezeichnung zuweisen const char * VARIABLE_LABEL_3 = "temperature"; // Variablenbezeichnung zuweisen const char * DEVICE_LABEL = "esp32"; // Gerätebezeichnung zuweisen const char * MQTT_BROKER = "ubidots"; const int DHTPIN = 33; // Pin, an dem der DHT11 angeschlossen ist const int DHTTYPE = DHT11; // Typ des DHT const int trigPin = 16; // Trigger-Pin des HC-SR04 const int echoPin = 17; // Echo-Pin des HC-SR04 } /* Sensordeklarationen */ long duration; float distance; /* Speicherplatz für die Anfrage */ char payload[300]; char topic[150]; /* Speicherplatz für die zu sendenden Werte */ char str_sensor[10]; char str_TempSensor[10]; char str_HumSensor[10]; /**************************************** * Hilfsfunktionen ****************************************/ WiFiClient ubidots; PubSubClient client(ubidots); DHT dht(DHTPIN, DHTTYPE); void callback(char* topic, byte* payload, unsigned int length) { char p[length + 1]; memcpy(p, payload, length); p[length] = NULL; String message(p); Serial.write(payload, length); Serial.println(topic); } void reconnect() { // Schleife, bis die Verbindung wiederhergestellt ist while (!client.connected()) { Serial.println("Versuche MQTT-Verbindung..."); // Verbindungsversuch if (client.connect(MQTT_CLIENT_NAME, TOKEN, "")) { Serial.println("Verbunden"); } else { Serial.print("Fehlgeschlagen, rc=""); Serial.print(client.state()); Serial.println(" Versuchen Sie es in 2 Sekunden erneut"); // 2 Sekunden warten, bevor ein erneuter Versuch unternommen wird delay(2000); } } } /**************************************** * Sensorfunktionen ****************************************/ float readDistance() { digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = (pulseIn(echoPin, HIGH)); distance = float(duration/29/2); return distance; } /**************************************** * Hauptfunktionen ****************************************/ void setup() { Serial.begin(115200); WiFi.begin(WIFISSID, PASSWORD); /* Initialisierung des DHT11 */ dht.begin(); /* Zuweisung der PINS als INPUT/OUTPUT */ pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); Serial.println(); Serial.print("Warte auf WLAN..."); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.println(""); Serial.println("WLAN verbunden"); Serial.println("IP-Adresse: "); Serial.println(WiFi.localIP()); client.setServer(MQTT_BROKER, 1883); client.setCallback(callback); } void loop() { if (!client.connected()) { reconnect(); } /* Temperatur und Luftfeuchtigkeit lesen */ float humidity = dht.readHumidity(); float temperature = dht.readTemperature(); /* Funktion readDistance() aufrufen */ distance = readDistance(); /* 4 ist die minimale Breite, 2 die Genauigkeit; der float-Wert wird in str_sensor kopiert */ dtostrf(distance, 4, 2, str_sensor); dtostrf(humidity, 4, 2, str_HumSensor); dtostrf(temperature, 4, 2, str_TempSensor); /* Ubidots -Anfrage erstellen */ sprintf(topic, "%s%s", "/v1.6/devices/", DEVICE_LABEL); sprintf(payload, "%s", ""); // Nutzdaten bereinigen sprintf(payload, "{"%s": %s,", VARIABLE_LABEL_1, str_sensor); // Fügt die Variablenbezeichnung hinzu sprintf(payload, "%s"%s": %s,", payload, VARIABLE_LABEL_2, str_HumSensor); // Fügt die Variablenbezeichnung hinzu sprintf(payload, "%s"%s": %s}", payload, VARIABLE_LABEL_3, str_TempSensor); // Fügt die Variablenbezeichnung hinzu //sprintf(payload, "%s {"value": %s}}", payload, str_sensor); /* Gibt die Sensorwerte im seriellen Monitor aus */ Serial.println("Veröffentliche Werte in der Ubidots Cloud"); Serial.print("Entfernung = "); Serial.println(distance); Serial.print("Luftfeuchtigkeit = "); Serial.println(humidity); Serial.print("Temperatur = "); Serial.println(temperature); /* Sende die Anfrage an Ubidots */ client.publish(topic, payload); client.loop(); delay(1000); }

Nachdem Sie Ihren Code eingefügt und das entsprechende WLAN zugewiesen haben, überprüfen Sie ihn in der Arduino IDE. Zur Überprüfung sehen Sie oben links in der Arduino IDE die untenstehenden Symbole. Wählen Sie das Häkchen-Symbol, um den Code zu überprüfen.

Nach erfolgreicher Überprüfung erhalten Sie in der Arduino IDE die Meldung Kompilierung abgeschlossen

Laden Sie als Nächstes den Code auf Ihren ESP32 hoch. Wählen Sie dazu das Pfeilsymbol nach rechts neben dem Häkchensymbol.

Nach dem Hochladen erhalten Sie in der Arduino IDE die Meldung Hochladen abgeschlossen

Damit sendet der Sensor nun die Daten an die Ubidots Cloud!

Datenverwaltung in Ubidots

Ubidots im Gerätebereich ein neues Gerät angezeigt . Der Name des Geräts lautet „ esp32 “. Innerhalb des Geräts werden außerdem die Variablen Entfernung, Luftfeuchtigkeit und Temperatur angezeigt.

Wenn Sie Ihre Geräte- und Variablennamen in benutzerfreundlichere Namen ändern möchten, lesen Sie bitte diesen Artikel:

Um das Volumen der frei fließenden Substanzen im Tank zu berechnen, müssen wir als Nächstes eine abgeleitete Variable erstellen, um einen Volumenwert zu berechnen.

Die abgeleitete Variable ermöglicht es uns, Operationen mit den Standardvariablen zu erstellen. In diesem Fall wenden wir die Volumenformel mit der Charakteristik eines zylindrischen Tanks an, wobei:

  • Pi = Das Verhältnis des Umfangs eines Kreises zu seinem Durchmesser (Konstante)
  • r = Der Radius des Tanks
  • h = Die Höhe des Tanks

Klicken Sie auf „ Variable hinzufügen “ und wählen Sie „ Synthetisch “ aus:

Wie Sie im neuen Fenster sehen können, müssen Sie die Formel im folgenden Feld einfügen:

Sobald Sie die Formel mit den Eigenschaften Ihres Tanks verknüpft haben, wählen Sie die Variable „ Entfernung

Sobald Sie Ihre Formel eingegeben haben, wird das Volumen in Ihrer Ubidots -Anwendung angezeigt.

Ergebnisse

Ihr Sensor ist nun einsatzbereit! Im Folgenden sehen Sie die Funktion des Füllstandssensors bei verschiedenen Lautstärken:

Um mehr über Ubidots Widgets und -Ereignisse zu erfahren, sehen Sie sich diese Video-Tutorials .

Viel Spaß beim Hacken 🙂