Solucionado Sensor Nivel Agua 4-20 mA

#include <SoftwareSerial.h>
#include <Adafruit_ADS1X15.h>
#include <LiquidCrystal_I2C.h>
#include <Relay.h>
#include <Wire.h>

Adafruit_ADS1115 ads;
LiquidCrystal_I2C lcd(0x27, 20, 4);

const float NIVEL_INFERIOR = 12500.0;
const float NIVEL_SUPERIOR = 66600.0;

const byte relepinB = 9;
const byte relepinA = 8;

const unsigned long TIEMPO_ADS = 2500UL;
const unsigned long TIEMPO_PRESENTACIO = 5000UL;
int adc0;
int nivel;
int aux;
int i;
int readADC0;
float litros;
float centimetros;
int ESTADOS;

unsigned long tiempoads = 0;
unsigned long tiempopresentacion = 0;

enum estados_l {

  ESTADO_LITROS,
  ESTADO_CENTIMETROS,
  ESTADO_NIVEL_INFERIOR,
  ESTADO_NIVEL_SUPERIOR
} estado = adc0;

void setup(void) {
  Wire.begin();
  lcd.begin(20, 4);
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  Serial.begin(9600);

  ads.setGain(GAIN_ONE);
  ads.begin();

  lcd.setCursor(0, 1);
  lcd.print("  INTERPRISE MX ");
  lcd.setCursor(0, 3);
  lcd.print("     AGUA CRUDA ");
  delay(5000);
  tiempopresentacion = millis();
   
   lcd.clear();
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  tiempoads = millis();
}

void loop(void) {

  if (millis() - tiempoads > 5000UL) {
    tiempoads = millis();

    short adc0 = ads.readADC_SingleEnded(0);
    Serial.print("A0: ");
    Serial.println(adc0);

    float cadc0  = ads.readADC_SingleEnded(0); //deposito 3.7 mts. ancho - 6 mts. largo - 3 mts. altura 
    float ads =  (0.01875 * adc0) ;            //conversor 4-20ma = 2.722 mv. - 20530 adc0 - ads1115 0.01850 - maximo centimetros 306.00
    float centimetros = ( 0.01475 * adc0) ;    // ajuste centimetros
    float litros = (centimetros * 222);        // litros por cada centimetro -  maximo 67988 litros

    Serial.print("litros ");
    Serial.println(   litros);
    Serial.print("   ctm:  ");
    Serial.println(  centimetros);
    lcd.setCursor(0, 1);
    lcd.print("litros  ");
    lcd.print(litros , 0.0);
    lcd.setCursor(0, 3);
    lcd.print("centimetros ");
    lcd.print(centimetros, 0.0);


    if (NIVEL_INFERIOR) {
      if (litros < NIVEL_INFERIOR) {
        digitalWrite(8, LOW);
      } else {

        digitalWrite(8, HIGH);
      }
    }
    if (NIVEL_SUPERIOR) {
      if (litros > NIVEL_SUPERIOR) {

        digitalWrite(9, LOW);
      } else {

        digitalWrite(9, HIGH);
      }
    }
  }
}

Hola foro, e usado este código con sensor MPX10DP, ahora lo estoy usando con sensor de nivel piezoresistivo de 4 a 20 ma, uso un conversor de corriente a voltaje, HW-685 y de hay pasa por conversor de analógico a digital ADS1115 pin A0 analógico, y de hay a Arduino vía I2C, ya funciona mas o menos se que esta mal la conversión no se en que punto ads, a centímetros, a litros se que algo esta mal en mis matemáticas de conversión.
Saludos

nivel agua 4-20 ma

opera de 0 a 5 mts. con 24vcc

Conversor de corriente a voltage? Lo único que necesitas es una R de 250 ohms y mides entre 1 y 5V sin problemas.
Pero sigamos con lo que tienes. Al menos con ese conversor no pierdes rango dinámico porque con la R solo mides entre 1 y 5V y seguramente tu HW-685 te dara de 0 a 5V
Luego lo sigo Silvia.

hay que revisar esto

 short adc0 = ads.readADC_SingleEnded(0);
    Serial.print("A0: ");
    Serial.println(adc0);

    float cadc0  = ads.readADC_SingleEnded(0); //deposito 3.7 mts. ancho - 6 mts. largo - 3 mts. altura 
    float ads =  (0.01875 * adc0) ;            //conversor 4-20ma = 2.722 mv. - 20530 adc0 - ads1115 0.01850 - maximo centimetros 306.00
    float centimetros = ( 0.01475 * adc0) ;    // ajuste centimetros
    float litros = (centimetros * 222);        // litros por cada centimetro -  maximo 67988 litros

El ADS1115 es buena placa.
Luego sigo la cuenta y edito este post si nadie responde.

Hola Surbyte, si entre los reglones 74 y 77 esta el problema, y si el problema surge cuando se acerca al cero, se cambia a voltaje negativo no hay resistencias de 250 ohms, lo intentare con una de 220 y una de 30 ohms para probar.
Saludos.

 float nivel  = ads.readADC_SingleEnded(0); //deposito 3.7 mts. ancho - 6 mts. largo - 3 mts. altura 
    float ads =  (0.01875 * nivel) ;            //conversor 4-20ma = 2.722 mv. - 20530 adc0 - ads1115 0.01850 - maximo centimetros 306.00
    float centimetros = ( 0.01475 * adc0) ;    // ajuste centimetros
    float litros = (centimetros * 222);        // litros por cada centimetro -  maximo 67988 litros

Hice pequeño cambio para que se vea mas claro.

No.. no cambies ahora. Porque poner la resistencia hara que pierdas el rango de 0 a 1 Volt. sigo con el HW-685.
Dejame ver.. son dias de trabajo de tareas que dejo para fin de año y no miro mucho el foro.

Ok, no cambio nada en el hardware, si son días difíciles.
saludos

Voy a analizar en tus lineas.

float cadc0 = ads.readADC_SingleEnded(0); //deposito 3.7 mts. ancho - 6 mts. largo - 3 mts. altura 

El ADS1115 es un ADC de 16 bits. No se porque empiezas con un float cuando recibes un long. Error de tipo de variable.
Mejor es usar long o unsigned long

unsigned long cadc0 = ads.readADC_SingleEnded(0); //deposito 3.7 mts. ancho - 6 mts. largo - 3 mts. altura 

Los datos del depósito los usaremos luego.

Del HW-685 leo esto
3. Cuando la entrada de corriente esté en el valor mínimo (0mA o 4mA), ajuste el potenciómetro cero para hacer que la salida de salida sea el valor mínimo de salida (0,0 V u otro voltaje).
4. Cuando la entrada de corriente esté en el valor máximo (20mA), ajuste el potenciómetro SPAN para hacer que la salida de salida sea el valor máximo (3,3 V o 5V o 10V). Cuando la entrada es de 4-20Ma, la salida puede ser tan pequeña como 2,5 V)

 float ads = (0.01875 * adc0);            //conversor 4-20ma = 2.722 mv. - 20530 adc0 - ads1115 0.01850 - maximo centimetros 306.00
Por lo visto acá conviertes 306 cm a pasos de tu adc.
Veamos: 306 cm / 65535 = 0,00466926 
Tu adc tiene 16 bits. Si el conversor HW-685 tiene bien el 0 y el span (marca 5V cuando tienes los 306 cm entonces) la cuenta esta mal.
Con el máximo del sensor te marcará 1.228,78 cm o sea 12mts

float centimetros = (0.01475 * adc0); // ajuste centimetros

Esto no se para que sirve?

float litros = (centimetros * 222); // litros por cada centimetro - maximo 67988 litros

Si mides bien en cm entonces convertirlo a litros es fácil, supongo que estará bien
deposito 3.7 mts. ancho - 6 mts. largo - 3.06 mts
Area 3.7 x 6 = 22.2 m2 asi que son 222 cm2, esto último esta bien.

Hola @Surbyte, uso un generador de señal para calibrarlos potenciometros del HW685 cuando generdor marca 4 ajusto el potenciometro de cero y cuando el generador esta en 20 mA ajusto los 5v hasta hay todo bien.

la sonda esta diseñada para medir desde cero metros hasta 5 metros, y tengo como máximo nivel 306 centímetros, con mas se desbordaría el deposito, me parece que tengo que dividir los 32000 bits que serian lo mismo que 5v, que a su vez seria 5 metros, y 0 bits seria cero litros y cero volts, 306 centímetros es igual a 2.700 volts que es mi limite superior.

unsigned long nivel  = ads.readADC_SingleEnded(0);  
    float A0 =  (32578 / nivel);  //adc0 es igual Serial.print(32578);  32578 es =  5 volts           
    float centimetros = ( 0.01850 * nivel); // en teoria nivel es igual 32578 dividiendo 0.01850 que es un bits           
    float litros = (centimetros * 222);      

En todos los casos al llegar a 100 centímetros disminuye bien, si disminuye a 99 ctm. aparece un numero despues del 99, aveces 8 o 0 ejemplo 990 y cuando el voltímetro indica 400mv los centímetros en lugar de seguir disminuyendo comienzan a aumentar ejemplo 865 centímetros a cero volt 2473 centímetros.
(float centimetros = (0.01475 * adc0); // ajuste centímetros) al parecer no hace nada como usted me indica. En el código original los bits primero se convierten en mv, y después se convierte a centímetros, y a su vez en litros. en este caso he querido convertir los bits directa mente a centímetros sera que no es posible hacerlo

  nivel = analogRead (mpxpin);
    tiempompxpin  = millis();
    float mv = (nivel / 1023.0) * 5000.0;
    float centimetros = mv / 10.960;
    float litros (centimetros * 116.1);

Saludos


#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>
#include <Adafruit_ADS1X15.h>

#include <Relay.h>
#include <Wire.h>
#define I2C_ADDRESS 4x48

Adafruit_ADS1115 ads;
LiquidCrystal_I2C lcd(0x27, 20, 4);

const float NIVEL_INFERIOR = 12500.0;
const float NIVEL_SUPERIOR = 66600.0;

const byte relepinB = 9;
const byte relepinA = 8;

const unsigned long TIEMPO_ADC0 = 2500UL;
const unsigned long TIEMPO_PRESENTACIO = 5000UL;

int nivel;
int aux;
int i;
int readADC0;
float litros;
float centimetros;
int ESTADOS;

unsigned long tiempoadc0 = 0;
unsigned long tiempopresentacion = 0;

enum estados_l {

  ESTADO_LITROS,
  ESTADO_CENTIMETROS,
  ESTADO_NIVEL_INFERIOR,
  ESTADO_NIVEL_SUPERIOR
} estado = A0;

void setup(void) {
  Wire.begin();
  lcd.begin(20, 4);
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  Serial.begin(9600);

  ads.setGain(GAIN_TWOTHIRDS);
  ads.begin();

  lcd.setCursor(0, 1);
  lcd.print("  INTERPRISE MX ");
  lcd.setCursor(0, 3);
  lcd.print("     AGUA CRUDA ");
  delay(5000);
  tiempopresentacion = millis();

  lcd.clear();
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  tiempoadc0 = millis();
}

void loop(void) {

  if (millis() - tiempoadc0 > 5000UL) {
    tiempoadc0 = millis();

    short adc0 = ads.readADC_SingleEnded(0);


    unsigned long nivel  = ads.readADC_SingleEnded(0);
    float A0 = (32500 / .01850 ) * 4.044;
    float centimetros = ( nivel * 0.01266); //no entiendo que funcion cumple pero ya funciona bien si lo comento marca 0 ctm. 0 litros
    float litros (centimetros * 222.0);

    Serial.print("litros ");
    Serial.println(litros);
    Serial.print("   ctm:  ");
    Serial.println(centimetros);
    Serial.print("A0: ");
    Serial.println(adc0);
    lcd.setCursor(0, 1);
    lcd.print("litros    ");
    lcd.print(litros);
    lcd.setCursor(0, 3);
    lcd.print("centimetros ");
    lcd.print(centimetros);



    if (NIVEL_INFERIOR) {
      if (litros < NIVEL_INFERIOR) {
        digitalWrite(8, LOW);
      } else {

        digitalWrite(8, HIGH);
      }
    }
    if (NIVEL_SUPERIOR) {
      if (litros > NIVEL_SUPERIOR) {

        digitalWrite(9, LOW);
      } else {

        digitalWrite(9, HIGH);
      }
    }
  }
}

Hola @Surbyte, ya funciona siguiendo tus acertadas opiniones, lo conseguí, la falla de las impresiones en la LCD era por libreria de <LiquidCrystal_I2C.h> la elimine y la volví a cargar, creo que se puede mejorar agregando un ciclo for, para hacer unas 20 lecturas antes de imprimir, cambie ads.setgain(GAIN_ONE); por ads.setgain(GAIN_TWOTHIRDS); cambio el rango de voltaje 4.524 volts a 306 ctm. en lugar de los 2.712 volts anteriores.
Toda sugerencia es bienvenida.

Nota: se que este año fue pésimo para Argentina económicamente, de consuelo ganaron su tercera copa mundial, espero y este año les pinte mejor por el bien de toda América latina que tengas un feliz año Surbyte.

Gracias por los buenos augurios, los necesitamos.
Lo mejor para ti también.

Donde compraste el sensor de presión, puedes poner un link?

Hola ahora me entero de tu pregunta disculpa.
https://www.electronicashopqro.com/
Saludos
Nota: en su catalogo descargable, esta en 350.00 pesos, actualice el precio y esta en 420.00 pesos mexicanos, me dicen que les llega un nuevo lote en unos días a mejor precio, yo tengo 2 pero son de 6 pines y no requieren de amplificador operacional funcionan de 0 a 5 volts

Hola Surbyte, no funciono muy bien en el mundo real, le hice algunas modificaciones ahora funciona mejor, pero no me termina de convencer adjunto en código con las modificaciones.

#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>
#include <Adafruit_ADS1X15.h>

#include <Relay.h>
#include <Wire.h>
#define I2C_ADDRESS 4x48

Adafruit_ADS1115 ads;
LiquidCrystal_I2C lcd(0x27, 20, 4);

const float NIVEL_INFERIOR = 10000.0;
const float NIVEL_SUPERIOR = 49900.0;

const byte relepinB = 9;
const byte relepinA = 8;

const unsigned long TIEMPO_ADC0 = 2500UL;
const unsigned long TIEMPO_PRESENTACION = 5000UL;

int nivel;
int aux;
int i;
int readADC0;
float litros;
float centimetros;
int ESTADOS;

unsigned long tiempoadc0 = 0;
unsigned long tiempopresentacion = 0;

enum estados_l {

  ESTADO_LITROS,
  ESTADO_CENTIMETROS,
  ESTADO_NIVEL_INFERIOR,
  ESTADO_NIVEL_SUPERIOR
} estado = A0;

void setup(void) {
  Wire.begin();
  lcd.begin(20, 4);
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  Serial.begin(9600);

  ads.setGain(GAIN_TWOTHIRDS);
  ads.begin();

  lcd.setCursor(0, 1);
  lcd.print("  INTERPRISE MX ");
  lcd.setCursor(0, 3);
  lcd.print("     AGUA CRUDA ");
  delay(5000);
  tiempopresentacion = millis();

  lcd.clear();
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  digitalWrite(8, HIGH);
  digitalWrite(9, HIGH);
  tiempoadc0 = millis();
}

void loop(void) {

  if (millis() - tiempoadc0 > 5000UL) {
    tiempoadc0 = millis();

    short adc0 = ads.readADC_SingleEnded(0);


    unsigned long A0  = ads.readADC_SingleEnded(0);
    float nivel = (A0 / 3.200 );
    float centimetros ( nivel / 17.82970); 
    float litros (centimetros * 222.0);

    Serial.print("litros ");
    Serial.println(litros);
    Serial.print("   ctm:  ");
    Serial.println(centimetros);
    Serial.print("A0: ");
    Serial.println(adc0);
    lcd.setCursor(0, 1);
    lcd.print("litros    ");
    lcd.print(litros);
    lcd.setCursor(0, 3);
    lcd.print("centimetros ");
    lcd.print(centimetros);
     lcd.setCursor(0, 0);
    lcd.print(adc0);



    if (NIVEL_INFERIOR) {
      if (litros < NIVEL_INFERIOR) {
        digitalWrite(8, LOW);
      } else {

        digitalWrite(8, HIGH);
      }
    }
    if (NIVEL_SUPERIOR) {
      if (litros > NIVEL_SUPERIOR) {

        digitalWrite(9, LOW);
      } else {

        digitalWrite(9, HIGH);
      }
    }
  }
}

Saludos.
Nota: la modificación es en los renglones del 72 al 78

NO he mirado el código pero según el catalogo el MPX10DP es un sensor de freescale diferencia de 10Kpascal, es el caso?
image

Y lo que has puesto es diferente.
Te lo consulto porque tengo un problema similar.

Hola,si es 10 KPA, te adjunto la hoja de datos.

Esta es la pagina del foro donde esta el código, y esquema y algunas fotos.

//https://forum.arduino.cc/t/arduino-y-ad620/979015/67

#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>
#include <Relay.h>
#include<Wire.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

const float NIVEL_INFERIOR = 8061.0;
const float NIVEL_SUPERIOR = 49603.0;

const byte RELE_NIVEL_INFERIOR = 8;
const byte RELE_NIVEL_SUPERIOR = 9;
const unsigned long TIEMPO_MPXPIN = 2500UL;
const unsigned long TIEMPO_PRESENTACIO = 5000UL;
float nivel;
float litros;
float centimetros;
int ESTADOS;
const byte mpxpin = A0;
unsigned long tiempompxpin = 0 ;
unsigned long tiempopresentacion = 0 ;
enum estados_l {
  ESTADO_MPXPIN,
  ESTADO_LITROS,
  ESTADO_CENTIMETROS,
  ESTADO_NIVEL_INFERIOR,
  ESTADO_NIVEL_SUPERIOR
} estado = mpxpin;

void setup() {
  Wire.begin();
  lcd.begin(20, 4);
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  Serial.begin(9600);
  lcd.print("D. Marmo Servicios");
  lcd.setCursor(0, 2);
  lcd.print(" cisterna 50 000 ");

  tiempopresentacion = millis();

  pinMode(A0, INPUT);
  pinMode(RELE_NIVEL_INFERIOR, OUTPUT);
  pinMode(RELE_NIVEL_SUPERIOR, OUTPUT);
  digitalWrite (RELE_NIVEL_INFERIOR, HIGH);
  digitalWrite (RELE_NIVEL_SUPERIOR, HIGH);
  tiempompxpin = millis();
  delay (10);
}

void loop() {
  
  if (millis() - tiempompxpin > 2500UL) {
    nivel = analogRead (mpxpin);
    tiempompxpin  = millis();
    float mv = (nivel / 1023.0) * 5000.0;
    float centimetros = mv / 10.960;
    float litros (centimetros * 116.1);

    Serial.print("litros ");
    Serial.println(litros);
    Serial.print("   ctm:  ");
    Serial.println(centimetros);
    Serial.print("   mv:  ");
    Serial.println(mv);
    lcd.setCursor(0, 0);
    lcd.print("litros    ");
    lcd.print(litros);
    lcd.setCursor(0, 2);
    lcd.print("centimetros ");
    lcd.print(centimetros);


    //if (NIVEL_INFERIOR) {
    if ( litros < NIVEL_INFERIOR ) {
      digitalWrite (RELE_NIVEL_INFERIOR, LOW);
    } else {

      digitalWrite (RELE_NIVEL_INFERIOR, HIGH);
    }
    //if (NIVEL_SUPERIOR) {
    if (litros > NIVEL_SUPERIOR ) {

      digitalWrite (RELE_NIVEL_SUPERIOR, LOW);
    } else {

      digitalWrite (RELE_NIVEL_SUPERIOR, HIGH);
    }
  }
}
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>
#include <Relay.h>
#include<Wire.h>

LiquidCrystal_I2C lcd(0x27, 20, 4);

const float NIVEL_INFERIOR = 8061.0;
const float NIVEL_SUPERIOR = 49603.0;

const byte RELE_NIVEL_INFERIOR = 8;
const byte RELE_NIVEL_SUPERIOR = 9;
const unsigned long TIEMPO_MPXPIN = 2500UL;
const unsigned long TIEMPO_PRESENTACIO = 5000UL;
float nivel;
float litros;
float centimetros;
int ESTADOS;
const byte mpxpin = A0;
unsigned long tiempompxpin = 0 ;
unsigned long tiempopresentacion = 0 ;
enum estados_l {
  ESTADO_MPXPIN,
  ESTADO_LITROS,
  ESTADO_CENTIMETROS,
  ESTADO_NIVEL_INFERIOR,
  ESTADO_NIVEL_SUPERIOR
} estado = mpxpin;

void setup() {
  Wire.begin();
  lcd.begin(20, 4);
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  Serial.begin(9600);
  lcd.print("D. Marmo Servicios");
  lcd.setCursor(0, 2);
  lcd.print(" cisterna 50 000 ");

  tiempopresentacion = millis();

  pinMode(A0, INPUT);
  pinMode(RELE_NIVEL_INFERIOR, OUTPUT);
  pinMode(RELE_NIVEL_SUPERIOR, OUTPUT);
  digitalWrite (RELE_NIVEL_INFERIOR, HIGH);
  digitalWrite (RELE_NIVEL_SUPERIOR, HIGH);
  tiempompxpin = millis();
  delay (10);
}

void loop() {
  
  if (millis() - tiempompxpin > 2500UL) {
    nivel = analogRead (mpxpin);
    tiempompxpin  = millis();
    float mv = (nivel / 1023.0) * 5000.0;
    float centimetros = mv / 10.960;
    float litros (centimetros * 116.1);

    Serial.print("litros ");
    Serial.println(litros);
    Serial.print("   ctm:  ");
    Serial.println(centimetros);
    Serial.print("   mv:  ");
    Serial.println(mv);
    lcd.setCursor(0, 0);
    lcd.print("litros    ");
    lcd.print(litros);
    lcd.setCursor(0, 2);
    lcd.print("centimetros ");
    lcd.print(centimetros);


    //if (NIVEL_INFERIOR) {
    if ( litros < NIVEL_INFERIOR ) {
      digitalWrite (RELE_NIVEL_INFERIOR, LOW);
    } else {

      digitalWrite (RELE_NIVEL_INFERIOR, HIGH);
    }
    //if (NIVEL_SUPERIOR) {
    if (litros > NIVEL_SUPERIOR ) {

      digitalWrite (RELE_NIVEL_SUPERIOR, LOW);
    } else {

      digitalWrite (RELE_NIVEL_SUPERIOR, HIGH);
    }
  }
}

Este es el codigo que use para medir nivel de agua, post # 68


Este es el que use y aqui lo compre hace unos 4 años costo como 150.00 pesos mexicanos

Silvia, yo pense que hablabas del sensor piezoeléctrico con salida 4-20mA. Y de ese fue que te pedí el dato, no del MPX10DP que no había registrado. Esta claro que tu dices que estas haciendo las pruebas con el hasta que te llegue el MPX.

El MPX10DP te va a dar tantos problemas que no vale la pena, porque requiere amplificarlo.
Evidentemente tienes que medir 10Kp o sea un MPX5010DP es ideal porque tiene salida 0.5 a 4.5V en 10kpa
Intenta buscarlo porque te va a resolver todo. Recuperas el ADS1115 y tus lecturas serán geniales.
Es para 1 metro de altura de agua, en realidad 1020 mm.

Hola @Surbyte , no el MPX10DP esta descartado, el código es para la sonda 4-20mA, y ella envia la señal al convertidor de corriente HW685, y del convertidor de corriente va al ADS1115, y de hay la señal va al Arduino, los sensores pizoresistivo lo compre en mercado libre MX, en un momento te envió la información de los proveedores, los dos son chinos uno no tiene ni marca y su diámetro es de 25m.m. el otro si tiene marca y su diámetro es de 19m.m., los dos funcionan bien

Hola @Surbyte, estas son las ligas de las sondas y el generador de señal 4-20 mA.

https://articulo.mercadolibre.com.mx/MLM-1357927651-transmisor-sensor-de-nivel-de-agua-liquida-para-detectar-0-5-_JM

la de marca esta pausada y tambien la del generador de señal
Saludos.