niveau_cuve.ino

Arduino Nicla Vision · Fichier : niveau_cuve.ino · Langage : Arduino · Usage : Convertir la distance ToF en niveau de cuve

Le capteur ToF monté au-dessus d’une cuve transforme la distance en pourcentage de remplissage : hauteur constante, soustraction, seuil d’alerte sur la LED verte. La mesure de niveau sans contact, sans flotteur ni mise en contact du liquide.

Matériel requis

Une Arduino Nicla Vision (STM32H7 double cœur M7+M4, 23×23 mm) avec caméra GC2145 2 MP, IMU LSM6DSOX, micro PDM, capteur ToF (famille VL53Lx), module sans fil ESP32 (Wi-Fi/BLE) et LED RGB (LEDR=23, LEDG=24, LEDB=25). La carte fixée au couvercle, fenêtre ToF vers le bas ; cuve de hauteur connue (ici 600 mm). Attention aux liquides très clairs ou moussants qui piègent l’infrarouge.

Câblage

Aucun câblage pour le ToF embarqué. Alimenter la carte de façon stable (USB ou 3,3 V) et éviter le soleil direct sur la fenêtre du capteur.

Fonctionnement

La mesure continue donne la distance capteur/surface en mm ; le remplissage = 100 − (vide × 100 / hauteur). Les bornes 20-1000 mm rejettent les mesures hors plage du ToF.

Exécution

Programmation via Arduino IDE (core ArduinoCore-mbed, target NICLA_VISION) sur le port USB-C ; bibliothèques Camera, PDM, Arduino_LSM6DSOX, WiFiNINA et ArduinoBLE fournies.

Variantes

Calibrer la hauteur en initialisant avec la cuve vide, moyenner sur 10 mesures pour les liquides agités, ou télé-relever le niveau en BLE/Wi-Fi vers un tableau de bord.

niveau_cuve.ino

// Niveau de cuve par ToF : distance capteur → surface = vide.
// Cuve de HAUTEUR constante : remplissage = 100 - vide%.

#include <Wire.h>
#include <VL53L1X.h>

VL53L1X tof;
#define HAUTEUR_CUVE_MM 600   // 60 cm de fond à capteur

void setup() {
  Serial.begin(115200);
  Wire.begin();
  tof.setTimeout(500);
  if (!tof.init()) {
    Serial.println("ToF absent");
    while (1) { ; }
  }
  tof.startContinuous();
}

void loop() {
  uint16_t mm = tof.readRangeContinuousMillimeters();

  if (!tof.timeoutOccurred() && mm > 20 && mm < 1000) {
    int remplissage = 100 - (mm * 100 / HAUTEUR_CUVE_MM);
    if (remplissage < 0) remplissage = 0;
    if (remplissage > 100) remplissage = 100;

    Serial.print("vide="); Serial.print(mm);
    Serial.print(" mm -> niveau ");
    Serial.print(remplissage);
    Serial.println(" %");

    if (remplissage < 15) {
      digitalWrite(LEDG, HIGH);   // alerte niveau bas (LEDG = 24)
    } else {
      digitalWrite(LEDG, LOW);
    }
  }
  delay(500);
}

← Retour à la fiche