Construisez un lecteur de volume de réservoir pour moins de 30 $en utilisant ESP32

L'Internet des objets a démocratisé l'accès à des applications autrefois complexes, notamment pour les brasseurs et vignerons artisanaux. Les capteurs de niveau sont utilisés depuis des décennies dans les grandes raffineries, les stations d'épuration et les usines chimiques. Grâce à la baisse des prix, il est désormais possible pour les industriels comme pour les particuliers de contrôler le volume de n'importe quelle cuve, fût ou bidon.

Les capteurs disponibles sur le marché peuvent détecter presque tout et sont classés en conséquence. Le capteur utilisé pour mesurer l'humidité est appelé capteur d'humidité, celui utilisé pour mesurer la pression le capteur de distance, capteur de position, etc. De même, le capteur utilisé pour mesurer le niveau d'un liquide est appelé capteur de niveau .

Les capteurs de niveau servent à mesurer le niveau des substances fluides . Ces substances comprennent des liquides comme l'eau, l'huile, les boues, etc., ainsi que des solides sous forme granulaire ou pulvérulente (solides qui peuvent s'écouler). Ces substances ont tendance à se déposer dans les réservoirs sous l'effet de la gravité et à maintenir un niveau stable à l'état de repos.

Ce guide vous apprendra à fabriquer votre propre capteur de niveau, de température et . Vous y trouverez également des instructions pour utiliser les données collectées via Ubidots , une plateforme d'applications.

Exigences

Câblage et boîtier

Le capteur HC-SR04 (capteur ultrasonique) fonctionne en 5 V. Veuillez vous référer au tableau et au schéma ci-dessous pour effectuer les connexions correctes entre l'ESP32 et le capteur ultrasonique :

Veuillez suivre le tableau ci-dessous pour effectuer les connexions correctes entre l'ESP32 et le DHT11 (capteur de température et d'humidité) :

J'ai construit un petit prototype avec un réservoir à l'échelle pour montrer les fonctions du capteur, mais le prototype final avec son boîtier devrait ressembler à ceci :

Comme vous pouvez le constater, le capteur ultrasonique doit être placé en haut du réservoir ; grâce à lui, nous allons pouvoir mesurer la distance entre la partie supérieure du réservoir et le point d'arrivée de la substance :

Placez les capteurs de température et d'humidité pour surveiller l'environnement.

Pour programmer votre appareil connecté, connectez-vous à l'IDE Arduino.

Avant de commencer avec l'ESP32, configurez votre carte avec l'IDE Arduino. Si vous n'êtes pas familiarisé avec la configuration d'une carte, veuillez consulter l'article ci-dessous et suivre les étapes une à une jusqu'à la compilation de la carte :

Une fois votre carte compilée, installez les bibliothèques nécessaires au fonctionnement des capteurs : « PubSubClient » et « DHT »

  1. Allez dans Sketch/Programme -> Inclure une bibliothèque -> Gestionnaire de bibliothèques et installez la PubSubClient . Pour trouver facilement la bibliothèque, saisissez « PubSubClient » dans la barre de recherche.
  2. Rendez-vous sur le dépôt de la bibliothèque pour télécharger la bibliothèque DHT . Pour ce faire, cliquez sur le bouton vert « Cloner ou télécharger » et sélectionnez « Télécharger le fichier ZIP ».
  3. De retour dans l'IDE Arduino, cliquez sur Croquis -> Inclure une bibliothèque -> Ajouter une bibliothèque .ZIP
  4. Sélectionnez le fichier .ZIP du DHT , puis cliquez sur « Accepter » ou « Choisir ».

Fermez l'IDE Arduino et rouvrez-le. Le redémarrage est nécessaire ; veuillez ne pas ignorer cette étape.

Il est temps de commencer à coder 🙂

Copiez le code ci-dessous et collez-le dans l'IDE Arduino.

Ensuite, indiquez les paramètres : nom et mot de passe du Wi-Fi, ainsi que votre jeton Ubidots unique. Si vous ne savez pas où trouver votre jeton Ubidots , veuillez consulter l’article ci-dessous.

/**************************************************************************************************** * Cet exemple envoie des données codées en dur à Ubidots à l'aide d'un ESP32. Le code envoie une valeur de distance * entre un appareil et son point d'extrémité opposé à Ubidots, puis cette valeur sera traitée par * Ubidots pour calculer le volume d'un réservoir en fonction de ses caractéristiques. * * Cet exemple est fourni TEL QUEL, sans aucune garantie. * * Créé par María Carlina Hernandez. *************************************************************************************************/ /******************************************* * Bibliothèques incluses ****************************************/ #include<WiFi.h> #inclure<PubSubClient.h> #inclure<DHT.h> /**************************************** * Définition des constantes ****************************************/ namespace { const char * WIFISSID = "Assign_your_wifi_SSID_here"; // Indiquez votre SSID Wi-Fi ici const char * PASSWORD = "Assign_your_wifi_SSID_here"; // Indiquez votre mot de passe Wi-Fi ici const char * TOKEN = "Ubidots"; // Indiquez votre jeton Ubidotsconst char * MQTT_CLIENT_NAME = "Assign_MQTT_client_here"; // Nom du client MQTT, veuillez saisir une chaîne alphanumérique ASCII de 8 à 12 caractères; const char * VARIABLE_LABEL_1 = "distance"; // Attribution de l'étiquette de la variable const char * VARIABLE_LABEL_2 = "humidity"; // Attribution de l'étiquette de la variable const char * VARIABLE_LABEL_3 = "temperature"; // Attribution de l'étiquette de la variable const char * DEVICE_LABEL = "esp32"; // Attribution de l'étiquette du périphérique const char * MQTT_BROKER = "ubidots"; const int DHTPIN = 33; // Broche de connexion du DHT11 const int DHTTYPE = DHT11; // Type de DHT const int trigPin = 16; // Broche de déclenchement du HC-SR04 const int echoPin = 17; // Broche d'écho du HC-SR04 } /* Déclarations des capteurs */ long duration; float distance; /* Espace pour stocker la requête */ char payload[300]; char topic[150]; /* Espace pour stocker les valeurs à envoyer */ char str_sensor[10]; char str_TempSensor[10]; char str_HumSensor[10]; /**************************************** * Fonctions auxiliaires ****************************************/ 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() { // Boucle jusqu'à la reconnexion while (!client.connected()) { Serial.println("Tentative de connexion MQTT..."); // Tentative de connexion if (client.connect(MQTT_CLIENT_NAME, TOKEN, "")) { Serial.println("Connecté"); } else { Serial.print("Échec, rc="); Serial.print(client.state()); Serial.println(" Réessayer dans 2 secondes"); // Attendre 2 secondes avant de réessayer delay(2000); } } } /**************************************** * Fonctions du capteur ****************************************/ float readDistance() { digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); duration = (pulseIn(echoPin, HIGH)); distance = float(duration/29/2); return distance; } /**************************************** * Fonctions principales ****************************************/ void setup() { Serial.begin(115200); WiFi.begin(WIFISSID, PASSWORD); /* Initialisation du DHT11 */ dht.begin(); /* Configuration des broches en entrée/sortie */ pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); Serial.println(); Serial.print("Attente du Wi-Fi..."); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.println(""); Serial.println("Wi-Fi connecté"); Serial.println("Adresse IP : "); Serial.println(WiFi.localIP()); client.setServer(MQTT_BROKER, 1883); client.setCallback(callback); } void loop() { if (!client.connected()) { reconnect(); } /* Lecture de la température et de l'humidité */ float humidity = dht.readHumidity(); float temperature = dht.readTemperature(); /* Appel de la fonction readDistance() */ distance = readDistance(); /* 4 est la largeur minimale, 2 est la précision ; la valeur flottante est copiée dans str_sensor */ dtostrf(distance, 4, 2, str_sensor); dtostrf(humidity, 4, 2, str_HumSensor); dtostrf(temperature, 4, 2, str_TempSensor); /* Construction de la requête Ubidots */ sprintf(topic, "%s%s", "/v1.6/devices/", DEVICE_LABEL); sprintf(payload, "%s", ""); // Nettoyage de la charge utile sprintf(payload, "{"%s": %s,", VARIABLE_LABEL_1, str_sensor); // Ajout de l'étiquette de la variable sprintf(payload, "%s"%s": %s,", payload, VARIABLE_LABEL_2, str_HumSensor); // Ajoute l'étiquette de variable sprintf(payload, "%s"%s": %s}", payload, VARIABLE_LABEL_3, str_TempSensor); // Ajoute l'étiquette de variable //sprintf(payload, "%s {"value": %s}}", payload, str_sensor); /* Affiche la lecture du capteur dans le moniteur série */ Serial.println("Publication des valeurs sur le cloud Ubidots "); Serial.print("Distance = "); Serial.println(distance); Serial.print("Humidité = "); Serial.println(humidity); Serial.print("Température = "); Serial.println(temperature); /* Publie la requête sur Ubidots */ client.publish(topic, payload); client.loop(); delay(1000); }

Une fois votre code collé et le réseau Wi-Fi approprié configuré, vérifiez-le dans l'IDE Arduino. Pour ce faire, cliquez sur l'icône en forme de coche (ou coche) en haut à gauche de l'IDE Arduino afin de valider votre code.

Une fois la vérification effectuée, vous recevrez un message « Compilation terminée » dans l'IDE Arduino.

Ensuite, téléversez le code dans votre ESP32. Choisissez l'icône flèche vers la droite à côté de l'icône coche pour téléverser.

Une fois le téléchargement terminé, vous recevrez un message « Téléchargement terminé » dans l'IDE Arduino.

Le capteur envoie désormais les données au Cloud Ubidots !

Gestion des données dans Ubidots

Si votre appareil est correctement connecté, un nouvel appareil apparaîtra dans la section « Appareils » de votre Ubidots . Cet appareil s’appellera « esp32 » et affichera les variables distance, humidité et température.

Si vous souhaitez modifier les noms de votre appareil et de vos variables pour les rendre plus conviviaux, veuillez consulter cet article :

Ensuite, pour calculer le volume des substances s'écoulant librement dans le réservoir, nous devons créer une variable dérivée pour calculer une valeur de volume.

La variable dérivée nous permet de construire des opérations à l'aide des variables par défaut. Dans ce cas, nous allons appliquer la du volume avec la caractéristique d'un réservoir cylindrique où :

  • Pi = Le rapport entre la circonférence d'un cercle et son diamètre (constante)
  • r = Le rayon du réservoir
  • h = La hauteur du réservoir

Cliquez sur « Ajouter une variable » et sélectionnez « Synthétique » :

Comme vous pouvez le constater dans la nouvelle fenêtre, vous devez saisir la formule dans le champ suivant :

Une fois que vous avez associé la formule aux caractéristiques de votre réservoir, sélectionnez la variable « distance »

Une fois votre formule saisie, votre volume commencera à être lu dans votre application Ubidots .

Résultats

Votre capteur est maintenant prêt à fonctionner ! Vous pouvez observer ci-dessous le fonctionnement du capteur de niveau à différents volumes :

Pour en savoir plus sur Ubidots , consultez ces tutoriels vidéo .

Bon piratage 🙂