Termómetro digital de 4 canales

Hola a todos,
Mi pequeño prototipo (arduino nano) es para mostrar la temperatura de 4 congeladoras de -20° en una pantalla (estoy usando una oled 0.96") lo he realizado con 4 sensores DS18B20 (sonda impermeable) con su cable de 80cm al cual le he agregado un cable de 3m a cada sensor para poder llegar a cada congeladora, cada sensor de T° se conecta con la tarjeta principal via conector USB; en el programa estoy utilizando la dirección única de cada sensor.
Mi programa es sencillo consiste en leer los 4 sensores y enviar a pantalla la lectura. Todo anda bien a temperatura ambiente tengo la lectura de los 4 sensores, pero cuando lo conecto a las congeladoras también me muestra las temperaturas la cuales llegan hasta -24° aprox sin embargo hay momentos que el pantalla oled me muestra -127°C , es como si el prototipo pierde conexión con los sensores pero a T° ambiente todo funciona bien.
De ser necesario puedo poner el sketch para sus opiniones pero como mencione es simple solo mostrar en la pantalla la lectura de los sensores.
A ver si por ahi alguien tiene alguna experiencia con este sensor aplicado en congeladoras.

Nota: quiero poner un imagen de mis sensores pero no se como se hace.

Espero sus comentarios.

That I have seen with loose connections, a short, or the pull up resistors were to far out of range. It is also possible your sensor is failing, can you try a new one.

Que he visto con conexiones flojas, un corto, o las resistencias pull up estaban muy fuera de rango. También es posible que su sensor esté fallando, ¿puede probar uno nuevo?

Estimado gilshultz
Aún no he probado un sensor nuevo porque no tengo, pero el problema sucede con los 4 sensores a bajas temperaturas.
La resistencia pull up es de 4.7K lo voy a medir y verificar que mida el valor correcto también voy a probar los sensores a temperatura de conservación: 2° a 8°C, estaré comentando, estoy insertando una foto de los sensores.
A ver si por ahí alguien tiene experiencia con este sensor a bajas T° .

Saludos

El proyecto parece muy profesional. Unas cuantas preguntas. ¿Los está operando con energía parásita o los suministra con 5V? Pruebe algo en el rango de 3K para una resistencia de pull-up. ¿Están los componentes electrónicos expuestos a la baja temperatura o solo las sondas?

The project looks very professional. A few questions. are you operating them in parasitic power or do you supply them with 5V. Try something in the range of 3K for a pull up resistor. Are the electronics exposed to the low temperature or just the probes.

La resistencia pull_up esta en rango para la longitud del cable, no creo que ese sea el problema.
¿Has identificado bien la funcion de cada color?, parece ser que existen tres codigos segun fabricante. Compruebalo AQUI.
Sin ver el código y esquema de montaje no se me ocurre nada mas.
saludos.

Estimado gilshultz,
Me tomo tiempo acondicionar los sensores los cuales le aumente con cable de usb porque es mas delgado y puede salir por el jebe (puerta) del congelador.
Esta operando con 5v esta se obtiene de una fuente de laptop (24v) confiable a LM2596(5v), voy a probar con la resistencia de 3k.
Solo los sensores (sondas) entran a las congeladoras, el nano esta a temperatura ambiente.

Estimado Gonpezzi,
Los sensores si están bien identificados en eso he sido riguroso la longitud llega a casi 4 metros por ello uso la pull up de 4.7k.
Estoy subiendo el esquema, el dht lo anule no se esta usando, solo los 4 sensores.
Gracias pos sus comentarios en unos días voy a poner el código, como dije es sencillo solo enviar en pantalla lo que lee los sensores. Recordar que el problema surge solo a bajas temperaturas.

Saludos

Aunque lo dudo, coloca tu código para poder descartar algo con el.

Dos dudas:

conectorusb

¿La señal D+ de los conectores USB está conectada entre ellos. Deduzco que si porque dices que a temperatura ambiente funcionan todos...

La otra duda... dices que en momentos la temperatura marca -127º... ¿no serán esos momentos en los que el motor del refrigerador se pone en marcha y/o para?

Estimado victorjam,
Es la primera vez que estoy trabajando con el sensor DS18B20, hasta donde he visto cuando el nano no lo detecta esto lo interpreta como -127 (esto envía al lcd); el motor no afecta al funcionamiento del nano.
Hoy hice un prueba a temperatura de conservación 2° a 8°C por 3 horas y todo estuvo bien aunque lo volveré a realizar pero con mas horas de funcionamiento.

No puedes afirmar eso tan livianamente. Lo que @victorjam te esta diciendo es que es muy posible que el ruido electrico del motor al accionarse o apagarse provoque la falla que estas describiendo.

Los cables que usas no estan mallados no?

Moderador:
Tema movido a Hardware

Estimado Surbyte,
El código consiste leer los 4 sensores y enviar a pantalla oled como esta es pequeña se muestra cada sensor por separado es decir uso un switch (pagina) donde pagina va desde el 0 al 4 y se incrementa con cada pulsada, si no detecta al sensor la temperatura es -127° y envía a pantalla nn.
Quiero subir el código como se hace, copiar y pegar...lo subiré mañana, estoy con una pc prestada.
Gracias por sus comentarios..

Hola Surbyte,
Si estuvieran en mismo circuito eléctrico te daría la razón pero creo que este no es el caso, el prototipo es portatil no esta fijo luego de usar lo retiro y lo guardo, seguiré haciendo mas pruebas les estaré comentando..
Gracias

@ejoel creo que tenemos un poco mas de experiencia que tu en estas cosas. Yo al menos desde 2014 respondo por problemas de Arduino. En todos los casos he visto cuestiones que al OP se le pasan por alto pero tienen relevancia.
Ejemplo: yo tengo un circuito con Arduino que funciona perfecto. Enciendo un tubo fluorescente con arrancador VIEJO (balasto y disparo por capacitor y bulbo) y el arduino se vuelve loco, dime, por qué ocurre?
En tu caso, tu accionas directamente un motor y cuando lo haces podría ocurrir que falle el sensor, ahora dices que a baja temperatura esto no ocurre porque te he leído

Entonces tal vez no tenga que ver con el motor pero no descartes las hipotesis que te brindamos porque justamente has venido para que te brindemos ideas, asi que al menos has una prueba o simplemente observa si hay relación entre motor y falla del sensor.

Hipotesis 2:
Aún no formulo nada pero veamos que surge. Escribiré por un momento a ver si surge alguna idea.
Hoja de datos del DS18B20 según MAXIM (ojala que sea de MAXIM y no sea un clon Chino, ojo con eso).
Según la hoja de datos lee desde -55°C to +125°C entonces no hay razón para problemas pero no es el caso.
Desde 2 a 8°C funciona bien al menos por el período indicado.
Pero a -24°C falla presentando -127°C
Leyendo el manual he encontrado esto:

Valores de resistencias pull-up para DS18B20

Para que la comunicación con el DS18B20 funcione, requerimos una resistencia “pull-up” en el pin DQ.

La siguiente tabla resume los valores de resistencias pull-up que sugerimos emplear de acuerdo a la distancia a la que colocaremos el sensor (longitud del cable).

Podemos experimentar colocando la resistencia en el lado del sensor o del microcontrolador hasta conseguir el mejor resultado en distancias grandes.

  • Distancia Valor de resistencia
  • Hasta 5 metros 4.7 kΩ
  • 5 a 10 metros 3.3 kΩ
  • 10 a 20 metros 2.2 kΩ
  • 20 a 50 metros 1.2 kΩ

Considera hacer una corrección en tu resistencia Pull-up si hiciera falta de acuerdo a la distancia.
El error mas común parece ser de CRC. El dispositivo hace una verificación y como no coincide da error.
En este comentario sugieren hacer un powercycle, aclaro es de otro microcontrolador pero sirve la idea general!

I do get them occasionally too, but for that reason the sample in this library does check the CRC and performs some additional read attempts to get a good reading.
That way I do get almost no wrong readings anymore. You can play with the retry count and also perform some sensor reset (implicitly performed with DS18B20::readPowerSupply()) if the error doesn’t go away.

Sugieren hacer un reset. En este mismo micro hacen esto que ahora compararé con nuestra librería

float DS18B20::getTemperature(){
    ds->reset();
    //ds->select(addr); // <-- replace this with the following line
    ds->write(0xCC);        // Skip ROM for single drop bus
    ds->write(0x44);        // start conversion, with parasite power on at the end
    delay(750);             // 750ms for 12bit read
    // we might do a ds.depower() here, but the reset will take care of it.
    ds->reset();
    //ds->select(addr); // <-- replace this with the following line
    ds->write(0xCC);        // Skip ROM for single drop bus
    ds->write(0xBE);        // Read Scratchpad
    ...
}

Hacen 2 resets. veamos la librería que usamos nosotros.

Bueno, dirás este este divagando pero en la búsqueda de otra posible causa he encontrado un posible problema
Resulta que la secuencia de lectura no debe interrumpirse y da la casualidad que interrupciones que pueden ocurrir en un programa podrian ser responsables de fallos aleatorios.
Tienes alguna interrupción en tu código?

Hola Subyte,
No uso interrupciones es un programa normal, respecto a la resistencia estoy usando una de 4.7K debido que la longitud del cable de cada sensor es de 4 metros aprox.
Tengo entendido que el DS18B20 tiene memoria y esta grabada de fabrica la T° min y T°max, alguien sabe algo de eso como modificar?
Por fin un usuario de mi trabajo me va a prestar su congeladora para hacer una prueba el día de mañana, es un poco difícil conseguir una congeladora para hacer pruebas, les estaré comentando los resultados.
Me podrían indicar como se hace para poner código aquí?, O solo con copiar y pegar es suficiente?

Gracias a todos por sus comentarios..

No puedes modificar nada en un DS18B20. Esta calibrado de fábrica.
Por favor, lee las Normas del foro y postea tu código usando etiquetas de código.
Solo selecciona esta etiqueta </> y pega el código dentro. No a la inversa. Si queda mal, repite, o sea ve a editar y corrige.

Hola a todos,
Pude hacer dos pruebas por mas tiempo:
Una prueba fue con 2 sensores a T° ambiente y 2 sensores dentro de la congeladora, el resultado fue sigue sucediendo lo mismo me doy cuenta porque en el oled muestro de la T° del congelador y las T° máxima y mínima esta ultima es donde muestra -127.
La otra prueba que hice fue a T de conservación de 2° a 8° en un sensor me marco -127°
Debo comentar que no es todo el tiempo sino solo unos segundos luego pasa puede funcionar normal por varias horas.
Seguiré haciendo mas pruebas y tratare de buscar una incubadora de 37°C.

A continuación estoy poniendo código dentro del loop.
Cada case muestra el valor de cada sensor es decir se repite, recordar que son 4 sensores va desde T0 a T3.

void loop() {

   sensors.requestTemperatures();            // envia comandos para la toma de T°  
   Temp[0] = sensors.getTempC(Sensor0);      // toma lectura del sensor 0
   Temp[1] = sensors.getTempC(Sensor1);      // toma lectura del sensor 1
   Temp[2] = sensors.getTempC(Sensor2);      // toma lectura del sensor 2
   Temp[3] = sensors.getTempC(Sensor3);      // toma lectura del sensor 3
   
   //TEMP = dht.readTemperature();           // obtención de valor de temperatura
   //HR = dht.readHumidity();                // obtención de valor de humedad
   
    for (int i = 0; i < 4; i++){   
      /*Temperatura subiendo */
      if (Temp[i] >= TempMAX[i]) TempMAX[i] = Temp[i]; // escribe TempMAX[0] y TempMAX[1]
     
      /*Temperatura bajando */
      if (Temp[i] < TempMIN[i])  TempMIN[i] = Temp[i]; 
         if (Temp[i] == -127)  TempMIN[i] = Temp[i];       
    } 

    if (digitalRead(BUTTON) == LOW ){     // entra al if presiona pulsador 
       delay(120);     
       pagina++;                      // incrementa para pasar a la sgte pagina
       if (pagina == 4) pagina = 0;   // 
    }


    oled.clearDisplay();        // limpia pantalla
    oled.setTextColor(WHITE);   // establece color al unico disponible (pantalla monocromo)
    oled.setCursor(0, 0);       // ubica cursor en inicio de coordenadas 0,0
    oled.setTextSize(1);        // establece tamaño de texto en 1
    oled.print(" Texto a imprimir");  // escribe en pantalla el texto  
    
    digitalWrite(LED, HIGH);    // enciende LED de indicación
   
    switch (pagina){
     case 0:        
        oled.setCursor(10, 17);     // indica posición del sensor en pantalla
        oled.setTextSize(2);        // indica tamaño del texto
        oled.print("T0: ");         // imprime en pantalla el texto T0
        if (Temp[0] == -127)
           oled.print("nn ");        // imprime nn si no hay señal de sensor
        else {
           oled.print(Temp[0], 1);      // imprime T0 actual, el 1 indica un decimal
          } 
   
        oled.setCursor(10, 40);     
        oled.setTextSize(1);
        oled.print("T0max: ");
        oled.print(TempMAX[0], 1);
        oled.setCursor(10, 54);
        oled.setTextSize(1);
        oled.print("T0min: ");
        oled.print(TempMIN[0], 1);  
        oled.display();
        break;

     case 1:
        oled.setCursor(10, 17);      // indica posición del sensor en pantalla
        oled.setTextSize(2);         // indica tamaño del texto
        oled.print("T1: ");          // imprime en pantalla el texto T1
        if (Temp[1] == -127)
           oled.print("nn ");        // imprime nn no hay señal de sensor
        else {
           oled.print(Temp[1], 1);      // imprime T1 actual, el 1 indica un decimal
          } 
        
        oled.setCursor(10, 40);
        oled.setTextSize(1);
       ...
       ... // se repite hasta el case 3


Te invito a que hagas dos pruebas.
1.Quita el OLED del código y presenta todo por Monitor Serie y nos dices si el problema persiste. Tengo la sensación que algo de la librería del OLED conspiera con la lectura de los sensores, haciendo que pierda el timming
2. Existe una librería no bloqueante para DS18B20, o buscala a ver si la encuentras. La librería no se queda esperando a que el DS18B20 termine su ciclo y lo hace de una manera mas liviana digamos.

Prueba ambas opciones a ver si tienes mejor resultado.

Voy a tomar en cuenta tus recomendaciones.
Buscando mas información encontré este link:

Aquí un forista comenta que tiene el mismo problema de mi prototipo los dejo para que le den una revisada.
Les comento que deje mi prototipo conectado, en una refrigeradora de 2° a 8° , hasta este lunes les comentare los resultados..

SaludosImagen