C’est toujours utile de savoir quel est le niveau de son puit ou de son réservoir. Et puis, il faut bien bien trouver des choses un peu intéressantes à faire avec les Arduino 😉

On va essayer de mener l’expérience sous la forme d’un mini-projet

Etape 1 : Expression de besoin

  • Mesurer le niveau d’un réservoir ou d’un puits en mètre et en pourçentage.
  • Attention au diamètre du puits peut être variable et même parfois faible (80cm).
  • Le projet doit fournir un capteur qui fonctionne de manière isolée (capteur + affichage), mais qui peut s’interfacer à un système domotique via mySensors (il faut tenir compte de l’existant).
  • La mesure soit être fiable (+/- 10cm) et mesurer un niveau jusqu’à 10 mètres.

Etape 2 : Possibilités techniques

Pour mesurer un niveau nous avons plusieurs possibilités:

Mesure ultra-son

La plus simple et la moins chère à mettre en œuvre. Le problème est que c’est aussi la moins fiable. En fonction de la forme du puits et notamment de son rapport diamètre profondeur la mesure devient rapidement impossible. Autre problème l’humidité ambiante provoque la corrosion rapide du capteur.

Mesure par capteur de niveau

La solution la plus basique. Ici, on prépare un rail et on place des capteurs à bascule à intervalles réguliers. Mis à part le fait que la détection soit purement mécanique il s’agit d’une solution extrêmement fiable (à l’usure des capteurs près). Néanmoins cela reste la solution la moins précise et la plus chère à mettre en œuvre (préparer un rail en inox de la bonne longueur, le percer, fixer les capteurs, tirer des tresses de câbles, selon le nombre de capteurs ajouter un multiplexeur).

Mesure par capteur de pression

Au final, il nous reste la solution la plus simple. immerger un capteur un capteur de pression. Il suffit d’un capteur de pression et d’une longueur de câble. Ici pas de parties mécaniques, pas de montage compliqué, pas composants complexes.

Etape 3 : Composants retenus

Le capteur

On ne va pas réinventer l’eau tiède. Quelqu’un a déjà fait tout le travail ICI. On va utiliser son travail pour la partie capteur et notamment son idée ingénieuse de fixer le capteur sur une bouteille remplie d’huile alimentaire pour ne pas risquer de boucher/altérer le capteur. Ensuite, le capteur sera pour sa part noyé dans de la résine pour assurer son étanchéité.

Composant

Nous allons utiliser un MPX5700AP de chez NXP disponible par exemple sur AliExpress pour moins de 8 euros. Il peut mesurer des pressions entre 15 et 700 kPa (soit 7bar). Ce qui nous permet au passage de réaliser des mesures jusqu’à 60 mètres sous le niveau de l’eau (1bar / 10mètres).

MPX5700AP

Filtrage du bruit

Puisqu’il s’agit d’un capteur analogique, il doit posséder des filtres adéquats pour que la mesure soit la plus précise possible. Le détail est disponible dans la fiche AN1646 sur le site de NXP. Trois solutions sont proposés : le filtrage RC, le filtrage par ampli-op et le filtrage logiciel. Pour la simplicité du montage, nous allons combiner un filtrage RC et un filtrage logiciel (après tout il faut bien que les 16Mhz de l’arduino servent à quelque chose). Le filtrage se fera par échantillonnage (64 échantillons), qui permet d’améliorer la précision à 1mV (pic à pic).

Pressure Sensor Noise filter

Précision de la mesure

Afin d’améliorer encore la précision, il faudra utiliser une alimentation régulée par un 7805 comme indiqué dans la fiche AN1646.

MPX5700-Formula

La mesure est donnée par la formule suivante :

Vout = Vs * (0.0012858 * P +0.04) ± Error
Vs = 5Vdc

Soit

// takes a A/D sample (0 to 1024) based on 5V ref
//  to compute pressure on MPX sensor
float getPressure(int analogValue) {
  // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
  float value = analogValue * (5 / 1023.0);
  // print out the value you read:
  return ((value / 5) - 0.04) / 0.0012858;
}

Le problème est que le capteur mesure une pression entre 0.15 et 7bar. Et c’est justement cette plage qui va servir à la conversion A/D.

Si on considère un puits de 9 mètres maximum, cela correspond à une pression maximale de 2bars sur le capteur. De même, la pression minimale mesurée sera toujours de 1bar (pression atmosphérique ambiante). Cela signifie que notre plage de tension sera entre 0.7 et 1.5V soit une utilisation de seulement 16% de la plage de mesure. Le convertisseur A/D de l’arduino échantillonne sur 10 bits soit (1024 pour 5V), ce qui nous laisse environs 160 valeurs pour mesure une pression située entre 1 et 2 bars (9mètres) soit une précision approximative de 6cm par step.

Si on souhaite améliorer la précision, nous pouvons modifier la valeur de référence du convertisseur de l’arduino (pin Aref) afin de le calibrer sur une valeur plus faible, par exemple 1.5V. Cela permet des mesures jusqu’à 2bars soit 1 mètres. Du coup, notre plage de mesure représente 50% de la plage d’échantillonnage (de 1 à 2 bars), ce qui correspond à 512 valeurs pour 10 mètres soit une précision d’environ 2cm.

Attention, cette customisation n’est pas sans poser problème. A ne faire qu’en connaissance de cause et acceptation du risque :

  • La modification de la référence s’applique à toutes les entrées du convertisseur
  • Le dépassement du seuil de référence lors d’une mesure peut endommager le convertisseur

Une solution moins risquée mais plus complexe à mettre en œuvre pourrait être l’utilisation d’un amplificateur opérationnel qui amplifierai la mesure mais saturerait à la tension maximale, protégeant alors le convertisseur.

L’afficheur

Ici, pas de chichi, un bon vieux LCD1602 en I2C (1.96€ pièce) connecté directement à l’arduino avec la librairie LiquidCrystal_I2C.h.

L’unité de traitement

Pas de contraintes de RAM ni de CPU. N’importe quel Arduino fonctionnant en 5V fera l’affaire (donc exit les arduino pro mini).

J’ai retenu un Arduino Nano 3 à 1.70€ sur AliExpress.

On ajoutera une puce NRF24L01+ (à 6€ pour 10 pièces sur AliExpress) pour l’intégration au réseau mySensors ainsi qu’un régulateur 3.3V séparé pour alimenter correctement la puce NRF.

Le logiciel

Librairies

Nous avons besoin des librairies :

  • mySensors
  • LiquidCrystal_I2C.h

Spécifique

Affichage

On va afficher le niveau du puit en mètres ainsi qu’une évaluation en pourcentage (basé sur la hauteur max du puit. Cerise sur le gateau on éteint le rétro-éclairage au bout de 30 secondes (GreenIT). Pour le rallumer, on appuie sur le bouton prévu à cet effet. Du coup, une petite LED rouge en façade permet d’indiquer que le niveau du puits passe en dessous des 10% sans consulter l’écran.

Mesure

Il faudra quand même une petite fonction pour réaliser une mesure échantillonnée, moyennée et lui appliquer la formule pour obtenir le résultat escompté.

Les plus téméraires pourraient inclure une fonction de calibrage automatique avec un mesure à niveau 0 et une mesure à 2m par exemple. Si on suppose que la relation entre mesure et pression est linéaire, le tour est joué.

Calibrage

Comme le capteur va déjà réagir à la pression ambiante (à la manière d’un baromètre), il convient de le calibrer lors de sa mise en service. Pour faciliter cette étape, je vais ajouter un petit potentiomètre de 100KOhms sur une entrée analogique afin de disposer d’un offset réglable à l’aide d’un tournevis.

MySensors

On intègre la librairie MySensors afin de remonter les mesures au serveur de domotique. Cela permet une consultation à distance ainsi qu’une historisation des valeurs.

Capteur de température

Puisqu’on est en route, pourquoi s’arrêter là. Et si on ajoutait un capteur pour mesurer la température extérieure par la même occasion ? Allez hop, on ajoute un DS18B20 étanche de 5m (3,42€) connecté en OneWire sur l’arduino.

Etape 4 : Réalisation

Schéma

Facilité oblige, j’ai utilisé Fritzing. un logiciel OpenSource bien conçu qui permet de faire les schémas électroniques ainsi que préparer les PCB et le routage des pistes.

Puits_v2_schema

Circuit

En ajustant manuellement les pistes, j’ai préparé le PCB suivant que je n’ai pas imprimé faute de temps (et peut-être de maîtrise technique du procédé). Allez, les plaques de prototypage c’est pas si mal …

Puits_v2_CI.png

Assemblage

La partie capteur est faite comme dans le site de référence :

  • les condensateurs de filtrage sont soudés sur les pattes du MPX
  • les “oreilles” du MPX ont été coupée
  • le MPX a été placé dans un petit tube PVC et noyé dans la résine Epoxy
  • le tube PVC a été collé sur le bouchon d’une bouteille de produit vaisselle remplie d’huile

La partie centrale a été rangée dans une boite de dérivation. Une découpe a été réalisée pour l’écran LCD, la LED et le bouton.

Logiciel

Le logiciel a été réalisé avec ArduinoIDE.

#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <MySensor.h>

#define LED_PIN_ALERT           3           // Pin for Alert LED
#define BIAS_PIN                A7
#define DIMMER_PIN              11           // Pin for led dimmer
#define BTN_PIN                 9                 // Btn to turn backlight on
#define SENSOR_PIN              A0            // Pin for MPX sensor
#define TEMPERATURE_PIN         2       // DS18B20 OneWire Data Pin

#define MAX_ATTACHED_DS18B20    1
#define LEVEL_THRESHOLD_PERCENT 5 // Alert threshold in percent to turn on LED
#define MAX_HEIGHT_WELL_METER   6  // Well height for percentage computing
#define BACKLIGHT_DELAY_SEC     30    // delay before screen backlight off
#define REDRAW_DELAY_SEC        0.5
#define SEND_DATA_DELAY_SEC     900 // Send data to mySensors Gateway every quarter hour
#define SEND_TEMP_DELAY_SEC     15 // Send data to mySensors Gateway every quarter hour

#define MAX_SAMPLES             64           // Number of collected sampled values
#define MEDIAN_SAMPLES          32         // Number of median values used for average

// Dimmer / Shift REgsiter
#define CHILD_ID_LEVEL 1
//#define CHILD_ID_DIMMER 2
#define CHILD_ID_TEMP 3

MySensor gw;
//kublib_dimmer myDimmer(CHILD_ID_DIMMER);
MyMessage msg(CHILD_ID_LEVEL, V_DISTANCE);
MyMessage msgTemp(CHILD_ID_LEVEL, V_TEMP);

int numSensors=0; // Supports multiple sensors connected
boolean metric = true; 
float temp=0; // Global value that stores temperature
OneWire ds(TEMPERATURE_PIN);
DallasTemperature sensors(&ds); // Pass the oneWire reference to Dallas Temperature.

// Set the LCD I2C address
// And the I2C pin mapping
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  
boolean backlightOn = true;
boolean btnLastState = HIGH;
unsigned long timeRefBacklight = 0;
unsigned long timeRefRedraw = 0;
unsigned long timeRefSendData = 0;
unsigned long timeRefSendTemp = 0;
float samples[MAX_SAMPLES];
int sampleIndex = 0;
float waterHeight = 0;
int waterLevel = 0;
int digitalBias = analogRead(BIAS_PIN);
float lastTemperature;  // Stores last measured temperature
  
// the setup routine runs once when you press reset:
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(115200);
  lcd.begin(16,2);               // initialize the lcd 
  // Initialize LED
  pinMode(LED_PIN_ALERT, OUTPUT);
  digitalWrite(LED_PIN_ALERT, HIGH);
  delay(300);
  // Initialize BTN
  pinMode(BTN_PIN, INPUT_PULLUP);
  // Initialize timer
  //timeRefBacklight = millis();
  //timeRefRedraw = millis();
  // Initialize MySensors
  lcd.home ();                   // go home
  lcd.clear();
  lcd.print ("MySensors:");
  lcd.setCursor ( 0, 1 );        // go to the next line
  lcd.print ("Radio init.");


  
  gw.begin(incomingMessage);
  gw.sleep(1000);
  // Send the Sketch Version Information to the Gateway
  gw.sendSketchInfo("Kub Puits", "1.0");
  //myDimmer.initialize(&gw, DIMMER_PIN);
  // Configure Level sensor
  gw.present(CHILD_ID_LEVEL, S_DISTANCE, "Niveau Puits (cm)");

  // Startup up the OneWire library
  sensors.begin();
  // requestTemperatures() will not block current thread
  sensors.setWaitForConversion(false);
  // Fetch the number of attached temperature sensors  
  numSensors = sensors.getDeviceCount();

  // Present all sensors to controller
  char label[14] = "";
  
  for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {   
    sprintf(label, "Temperature %d", i + CHILD_ID_TEMP);
     gw.present(i + CHILD_ID_TEMP, S_TEMP, label);
  }
  
  lcd.setCursor ( 0, 1 );        // go to the next line
  lcd.print ("Intialized !   ");
  gw.sleep(1000);
  checkTemperature();
}

// the loop routine runs over and over again forever:
void loop() {
  gw.process(); 
  
  //myDimmer.check();
  // When MAX SAMPLES is reached
  //  we have enough values to compute a result
  if (sampleIndex >= MAX_SAMPLES) {
    float sum = 0.0;
    // Sort the sampled data
    BubbleSort(samples, MAX_SAMPLES);
    // Use only the median values to compute average
    for (int i =(MAX_SAMPLES-MEDIAN_SAMPLES)/2; i<(MAX_SAMPLES-MEDIAN_SAMPLES)/2 + MEDIAN_SAMPLES; i++)
      sum += samples[i];
    // Compute final values
    waterHeight = sum / MEDIAN_SAMPLES;
    waterHeight = (float)((int)(waterHeight *100) /100.0);
    waterLevel = waterHeight / MAX_HEIGHT_WELL_METER * 100;
    // Reset index
    sampleIndex = 0;
    // Send value
    if ((millis() - timeRefSendData) > (SEND_DATA_DELAY_SEC * 1000)) {
      gw.send(msg.set((int)(waterHeight*100))); // niveau d'eau en cm
      
      timeRefSendData = millis();
    }
    digitalBias = analogRead(BIAS_PIN);
  
  }
  if ((millis() - timeRefSendTemp) >= (SEND_TEMP_DELAY_SEC * 1000)) {
    checkTemperature();
    timeRefSendTemp = millis();
  }
  // Load sensor data to sampling array
  int value = analogRead(SENSOR_PIN);
  samples[sampleIndex] = getWaterHeight(getPressure(value), digitalBias);
  sampleIndex++;
  
  // Turn light off after delay (GreenIT)
  if (((millis() - timeRefBacklight) > (BACKLIGHT_DELAY_SEC * 1000)) && (backlightOn)) {
    Serial.println("Turn Off");
    backlightOn = false;
    lcd.noBacklight();
  }
  
  // Turn light ON on btn press
  if ((digitalRead(BTN_PIN) == LOW) && (btnLastState == HIGH)) {
    Serial.println("Turn On");
    btnLastState = LOW; // Manage simple debounce
    backlightOn = true;
    lcd.backlight();
    timeRefBacklight = millis();
  }

  // Manage simple debounce
  if ((digitalRead(BTN_PIN) == HIGH) && (btnLastState == LOW)){
    btnLastState = HIGH;
  }
  
  // If light on redraw screen according refresh rate
  if (backlightOn && ((millis() - timeRefRedraw) > (REDRAW_DELAY_SEC * 1000))) {
    char strResult[5]="";
    char strTemp[6]="";
    
    //ftoa(strResult,waterHeight, 3);
    dtostrf(waterHeight, 3, 1, strResult);
    dtostrf(lastTemperature, 4, 1, strTemp);
    
    // Show data on LCD Screen
    lcd.home ();                   // go home
    lcd.clear();
    lcd.print ("Puits: ");
    lcd.print (strResult);
    lcd.print ("m ");
    lcd.print (waterLevel);
    lcd.print ("%");
    
    lcd.setCursor ( 0, 1 );        // go to the next line
    lcd.print ("Temp Ext: ");
    lcd.print (strTemp);
    lcd.print ("C");
    timeRefRedraw = millis();
  }

  // Manage led alert
  if (waterLevel < LEVEL_THRESHOLD_PERCENT) {
    digitalWrite(LED_PIN_ALERT, HIGH);
  } else {
    digitalWrite(LED_PIN_ALERT, LOW);
  }

  
}

void incomingMessage(const MyMessage &message) {
  //myDimmer.processMessage(message);
}

// takes a A/D sample (0 to 1024) based on 5V ref
//  to compute pressure on MPX sensor
float getPressure(int analogValue) {
  // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
  float value = analogValue * (5 / 1023.0);
  // print out the value you read:
  return ((value / 5) - 0.04) / 0.0012858;
}

// Compute water level in meters according to pressure (KPa)
float getWaterHeight(float pressureKPa, int digitalBias) {
  // Remove 100KPa for current air pressure (1 bar)
  // And convert from KPa to meters (10 meter of water = 1bar)
  float bias = ((float)(digitalBias)-512.0) / 100.0 / 4;
  return ((pressureKPa - 100) / 10) + bias;
  
}

void BubbleSort(float *num, int numLength)
{
      int i, j, flag = 1;    // set flag to 1 to start first pass
      float temp;             // holding variable
      for(i = 1; (i <= numLength) && flag; i++)
     {
          flag = 0;
          for (j=0; j < (numLength -1); j++)
         {
               if (num[j+1] > num[j])      // ascending order simply changes to <
              { 
                    temp = num[j];             // swap elements
                    num[j] = num[j+1];
                    num[j+1] = temp;
                    flag = 1;               // indicates that a swap occurred.
               }
          }
     }
     return;   //arrays are passed to functions by address; nothing is returned
}


void checkTemperature() {
  //
  // Manage temperature
  //
  // Fetch temperatures from Dallas sensors
  sensors.requestTemperatures();

  // query conversion time and sleep until conversion completed
  int16_t conversionTime = sensors.millisToWaitForConversion(sensors.getResolution());
  // sleep() call can be replaced by wait() call if node need to process incoming messages (or if node is repeater)
  gw.sleep(conversionTime);

  // Read temperatures and send them to controller 
  for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
 
    // Fetch and round temperature to one decimal
    float temperature = static_cast<float>(static_cast<int>((gw.getConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
    Serial.print("Temperature for sensor ");
    Serial.print(i);
    Serial.print(" :");
    Serial.println(temperature);
    // Only send data if temperature has changed and no error
    if (temperature != -127.00 && temperature != 85.00) {
    
      // Send in the new temperature
      gw.send(msgTemp.setSensor(i).set(temperature,1));
      // Save new temperatures for next compare
      lastTemperature=temperature;
    }
  }
}

By Kevin

29 thoughts on “Mesure de niveau pour puit”
    1. Bonjour, en cherchant sur le net, je suis tombé sur ces capteurs “étanches” MS5803-xxBA. Par exemple le MS5803-02BA… qui permettrait d’avoir jusqu’à 10m de colonne… En plus côté montage, ca serai super simple… juste de l’epoxy sur le soudure …. et plouf dans l’eau. Je sais pas si vous connaissez ?

      1. Bonjour,
        Non je ne connaissais pas. Mon capteur fonctionne nickel depuis la date de l’article sans aucun problème.
        Ce capteur a l’air un peu cher mais si il est fiable ça peut valoir le coup.

    2. En fait j’ai recommandé le freescale et j’ai commandé la version 14KPa de ce fameux nouveau capteur. Pourquoi le 14KPa, car on trouve le breakout seulement pour les versions 1KPa, 14KPa et 30KPa. Pour les 2KPa et 5KPa, il faut souder tout sois même. On peut utiliser SOP8 comme carte. J’ai envie aussi de tester ce nouveau capteur qui inclut en plus la température. Plus par curiosité et apprentissage. J’ai l’ai eu à 20 euros sur aliexpress… ca passe encore. surtout si on enlève le prix de la bouteille et des différents accessoires nécessaire pour le freescale. D’autres infos à cette adresse: https://www.umbcrobosub.com/2018/09/01/roll-your-own-depth-sensor/

      In fine, je veux tout intégrer sur mon RASPI qui tourne sur Home Assistant. Côté ESP8266, je vais essayer d’intégrer le freescale et ce MS avec ESPhome,

  1. Merci pour votre première réponse. Oui j’avais bien mis une résistance de 750ohms qui intervient dans le petit circuit RC entre la pin Vout et GND. J’avais testé que je recevais bien une valeur sur mon ESP8266/tasmota sur AC0. Maintenant que tout est coulé… quand je presse sur la bouteille (voir photos)… je n’oibserve pas de variation de pression…. J’ai peur que de l’huile soit rentré et que le capteur soit HS. D’où ma question sur la longueur de la durite … et si une bulle d’air doit être présente au moment de la plongée dans l’huile.





    1. La durite doit bien tremper dans l’huile car c’est huile qui doit rentrer dans le capteur pour exercer la pression. La bulle d’air n’empêche pas le fonctionnement mais risque de fausser la mesure. Ce qui n’est pas, pour l’instant, votre plus gros problème. Personnellement, j’avais scellé le capteur sur le bouchon de la bouteille de manière à ce qu’il n’y ait que l’extrémité de la durite qui dépasse à l’intérieur, et les câble qui dépasse à l’extérieur. Vous êtes sûr de na pas avoir obstrué l’entrée du capteur en le scellant ? L’autre explication serait un faux contact. Quand on branche le multimetre sur le capteur, est-ce qu’on peut mesurer un impédance ? Ou bien constaté-t-on que le circuit est ouvert ?

      1. Oui j’ai également scellé le capteur dans le bouchon d’origine élargie à 20mm… Voici les photos: https://postimg.cc/gallery/i8piwss0/
        Non la durite n’était pas bouché…. Sachant que le capteur est scellé , c’est l’impédance entre Vout & GND ? qui vous intéresse ?

        1. Ça tendrait à prouver que les câbles sont bien raccordés au capteur. Deux seules possibilités restantes sont donc : soit l’entrée du capteur qui est bouchée, soit le capteur a qui est endommagé.

      2. Oui j’en ai bien peur …. 🙁 Bon de toute façon, je reçois un nouveau capteur. J’avais pris la version jusqu’à 2.5KPa… Ca élimine le problème de résolution dans la plage que tu avec ton capteur 7.5KPa.
        Je vais tester chaque étape… notamment avec une seringue… Après je me demande si avec de l’air simplement, ca ne marcherait pas directement… Evidemment avec une bouteille bien déformable mais solide et bien lestée.

        1. Effectivement, mon capteur n’est pas adapté à ma plage d’usage. J’avais aussi testé à chaque étape pour être sûr. Techniquement ça marcherai avec de l’air, mais j’y vois 2 inconvénients : la bouteille subit trop déformation et va finir par se fendre. Ensuite, si il y a une fuite et que de l’eau s’infiltre, il n’y a aucune façon de s’en rendre compte; la mesure sera faussée et le capteur va s’encrasser.

      3. Au fait, en regardant au plus près la doc du capteur … il est écrit qu’il est incompatible avec les liquides donc avec l’huile et qu’il doit fonctionner avec de dl’air… La version compatible avec les liquides coûte bcp plus cher. Dans mon cas, j’ai environ 5m de colonne d’eau maxi…. donc 0.5 bars en sus maximum. Sachant que je tire peu d’eau chaque jour (de l’ordre de 100-200L) maximum, les variations de déformations vont être petites à mon avis… De toute façon même avec de l’huile, il faut laisser une bulle d’air dans la durite d’accès… ca me parait un détail super important.

  2. Bonjour,
    Je pense qu’il falloir reprendre le troubleshooting au début. Commençons par enfoncer les portes ouvertes: le capteur se comporte comme une résistance variable. Il faut le brancher sur sur une 5v avec une résistance de 750ohm en série, puis voir au multimetre si la tension varie quand ond on presse fort sur la bouteille pour simuler de la pression. Seconde question bête, est-ce que le recipient choisi n’est pas trop rigide ? Cela limiterai la déformation et donc la mesure.
    Avec cela on devrait savoir si le problème vient du capteur ou du montage.
    Pour le biais, c’est juste une petite bidouille qui me permet de régler le niveau à zéro exactement sans devoir recompiler le code pour mettre une valeur de référence fixe qui dépends de plein de facteurs.

  3. Bonsoir,
    Super poste…. j’étais tombé sur l’article original…. mais vous avez amélioré encore les choses. J’essaye de faire le capteur…. J’ai utilisé des capacités non-polarisés… je pense pas que ca joue une énorme importance….. J’ai utilisé de la résine de coulée…. à la place de l’epoxy. Une durite de 6mm (diamètre externe) et une bouteille de liquide vaiselle. Pour le tube de 20mm, c’est un tube IRL d’électricité. .. J’ai bien coulé… bien remplie avec de l’huile après le lestage…. J’ai juste une toute petite bulle d’air …. Malheureusement mon capteur reste bloqué sur la même valeur …. 🙁 aussi bien à l’extérieur qu’au fond du puits (20m avec environ 4m de colonne d’eau) … 🙁 Je suis assez déçu … 🙁 Je vois pas où j’ai merdé. Par contre je n’ai pas utilisé de biais … je ne comprends pas d’ailleurs où ca sort.

  4. Bonjour,
    Honnêtement, je n’ai pas vraiment prêté attention au type de condensateur utilisé, j’ai juste pioché selon les capacités dont je disposais sous la main. De mémoire, je dirai que j’ai principalement utilisé de l’électrolytique, mais il y avait quelques céramiques.
    25V sera parfait.
    C3 est un condensateur de découplage pour la puce NRF.

    1. Merci pour votre réponse.
      J’ai commandé 2 sachets de différentes valeurs en électrochimique et céramique et je piocherai.
      Pour la résistance de 750Ω (qui n’es pas une valeur normalisée) je prendrai 680Ω et 68Ω en série. Je dis ça pour les nuls un peu stressés comme moi…

  5. Les condensateurs sont des céramiques sauf C3 et C4 qui sont électrolytiques. C’est ça?
    Si je les prends en 25V ça va?
    Sur le régulateur 3,3V il y a un C3 de 10µF. Doit-il y en avoir aussi un sur le régulateur 5V ?
    Les condensateurs 1µF et 0,01µF soudés sur le capteur ont quelle technologie?
    Merci encore pour vos réponses.

  6. Oui, ce sera parfait. Attention, vérifiez quand même le brochage. Je n’ai pas regardé si c’était le même que sur le schéma d’origine.

  7. Bonjour,
    J’ai quelques questions à propos du schéma de principe.
    Il y a un « voltage regulator 5V » et un « 78xx ». Ce n’est pas la même chose ?
    U1, SW1 et SW2 quels sont ces composants?
    Le potar connecte à A7 doit avoir quelle valeur ?
    Mon puits est à 25m de la box Jeedom que je compte acheter. Entre 2 il y a un mur en pierre (celui de ma maison). Pensez-vous que la portée du NRF24L01 sera suffisante?
    Sur la box Jeedom il faudra aussi prévoir une carte arduino et un NRF24L01?
    Merci,
    Alain

    1. Bonjour,
      Effectivement, je n’ai pas mis assez de détails. U1 est bien un 7805 pour fournir une alimentation de référence stable pour le MPX qui est un composant analogique. U3 est un 7803 qui fournit une source 3,3v stable pour la puce NRF qui est assez sensible aux interférences. SW1 est un connecteur pour un bouton poussoir en façade. Par défaut le rétro éclairage de l’afficheur est éteint. En appuyant une fois il s’allume pour 15secondes. Si on appuie deux fois il reste allumé. SW2 est un connecteur qui n’est pas utilisé. Le potentiomètre sur A7 sert à piloter l’offset pour le calibrage. Il n’y a pas besoin d’un courant important, donc une valeur élevée (10 ou 100kohms).
      Concernant la portée c’est très aléatoire. Certain parlent de 20m, voire 100 avec les versions puissantes avec antenne directionnellel. Personnellement, je suis dans un environnement très brouillé, je ne dépasse pas 10m à l’intérieur. Une solution serait de basculer sur une puce rfm a 433mhz ou 868mhz. Fréquence plus basse, portée plus grande. Mais il n’y a aucune garantie. Il faut tester. Je confirme qu’il faut une passerelle avec une puce équivalente connectée au jeedom

  8. Merci pour ce tuto.
    J’ai chez moi un puits d’une petite quinzaine de mètres avec, quand il est en forme 8m de colonne d’eau en juin. Je m’en sers pour arroser mes légumes.
    Connaître son niveau d’eau, sa vitesse de recharge, voir son évolution dans le temps me semblerait bien utile.
    Votre montage vous donne toujours satisfaction ?
    La partie mécanique ne m’inquiète pas. Le montage de la carte pas plus. En revanche, la partie relative au logiciel me fait à priori un peu peur, car je n’y connais pas grand chose en Arduino. Toutefois, si je peux avoir des conseils dans les passages critiques, je devrais pouvoir surmonter ça.
    En utilisant un MPX4250A qui semble être un bon choix pour les hauteurs de colonnes d’eau visées, cela changerait quelque chose dans le code à mettre ?
    Avez-vous envisagé une supervision à distance avec Jeedom permettant de garder les mesures dans le temps et de générer des graphes?
    Peut-être êtes vous passé à autre chose…
    Merci encore pour ce bel article et votre partage.
    Alain.
    alain.hervais@gmail.com

    1. Bonjour,
      Bon choix de capteur. La précision sera très bonne. Il faudra ajuster la formule de conversion dans code avec celle de la documentation du capteur.
      La connexion à la domotique est prise en charge à l’aide de la librairie mysensors et de la puce 2,4ghz qui fonctionne très bien avec jeedom.
      Pour ma part j’en suis toujours satisfait. J’ai juste un petit problème de consommation mémoire qui le fait planter de temps en temps (probablement dans la gestion des chaînes de caractères pour l’affichage).
      N’hésitez pas à me faire part de vos questions. Je suis content que cet article vous aide.

Leave a Reply to SeByDocKy Cancel reply

Your email address will not be published. Required fields are marked *