DS18B20 sensor devuelve un valor fijo

Buenas noches para cada unos de ustedes, estoy iniciando en todo este mundo del arduino y con muchas dificultades, por los cuales recurro al conocimiento de ustedes. Estoy haciendo un proyecto donde presionando una tecla me marca una temperatura diferente. El problema es que si bien el sensor está funcionando solamente me devuelve un número fijo, estático. Me podrán decir donde esta el error. Por lo pronto muchas gracias.

#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Keypad.h>

#define ONE_WIRE_BUS 9

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;

LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {22, 24, 26, 28};
byte colPins[COLS] = {23, 25, 27, 29};

Keypad teclado = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

float Sensor_Agua; //sensors.getTempCByIndex(0);
float Sensor_Mosto; //sensors.getTempCByIndex(1);
float Sensor_Hervido; //sensors.getTempCByIndex(2);
float Sensor_Fermentacion; //sensors.getTempCByIndex(3);


void setup() {
lcd.begin( 20, 4);
sensors.begin();

}

void loop() {

char tecla = teclado.getKey ();

//sensors.requestTemperatures();

if (tecla == 'A') {
Sensor_Agua = sensors.getTempCByIndex(0);
lcd.setCursor( 5, 0);
lcd.print("Sensor Agua");
lcd.setCursor( 5, 1);
lcd.print(Sensor_Agua);

} else if (tecla == 'B') {
Sensor_Mosto = sensors.getTempCByIndex(1);
lcd.setCursor( 5, 0);
lcd.print("Sensor_Mosto");
lcd.setCursor( 5, 1);
lcd.print(Sensor_Mosto);

} else if (tecla == 'C') {
Sensor_Hervido = sensors.getTempCByIndex(2);
lcd.setCursor( 5, 0);
lcd.print("Sensor_Hervido");
lcd.setCursor( 5, 1);
lcd.print(Sensor_Hervido);

} else if (tecla == 'D') {
Sensor_Fermentacion = sensors.getTempCByIndex(3);
lcd.setCursor( 5, 0);
lcd.print("Sensor_Fermentacion");
lcd.setCursor( 5, 1);
lcd.print(Sensor_Fermentacion);
}
}

Tal vez se me escape algo pero el programa luce bien.
Has probado los 4 sensores por separado, sin tener que presionar cual quieres leer?
Intenta con este loop y lees en el monitor Serie sus valores contantemente cada 1 segundo aprox

Solo te dejo la parte del loop

void loop() {
        Sensor_Agua = sensors.getTempCByIndex(0);
        Sensor_Mosto = sensors.getTempCByIndex(1);
        Sensor_Hervido = sensors.getTempCByIndex(2);
        Sensor_Fermentacion = sensors.getTempCByIndex(3);
        
        Serial.print("Sensor Agua           : ");
        Serial.println(Sensor_Agua);
        
        Serial.print("Sensor_Mosto          : ");
        Serial.println(Sensor_Mosto);

        Serial.print("Sensor_Hervido        : ");
        Serial.println(Sensor_Hervido);

        Serial.print("Sensor_Fermentacion   : ");
        Serial.println(Sensor_Fermentacion);
        // como cada sensor tarda 750 mseg no vale la pena poner un delay() 
        // o algo que demore la presentación
    }
1 Like

Hola, (perdon por errores, pero estoy con un teclado sin caracteres espanoles)
el programa no esta bien, esta incompleto desde el punto de vista de los sensores.
cual es el valor fijo que te da ?
si es -127 o +85 son codigos de error
si es otro valor fijo es porque no has pedido la adquisicion de la temperatura, solamente has pedido la conversion del ultimo dato registrado en el sensor
hay varios ejemplos en la libreria de dallas temperature

te faltan definiciones: la resolucion de temperatura por ejemplo

entonces en el area de definiciones:

#define ONE_WIRE_BUS 9
#define T_RES 10  /// para una resolucion de un carto de grado C°///

en la seccion setup:

sensors.begin();
  sensors.setResolution(T_RES);
  sensors.setWaitForConversion(true); ///para esperar la respuesta el tiempo que sea necesario para realizar la conversion de acuerdo a la resolucion elegida ( el maximo es 750ms)//

y en el loop te falta lo mas importante:
pedir al bus &onewire que lea las temperaturas cuando lo solicites (pulsar una tecla) o periodicamente (en el loop) eso depende de lo que necesites hacer.

sensors.requestTemperatures();

solo debes decidir donde poner esta linea: si decides poner la linea en la funcion de cada tecla, seria sin delay porque solamente seria solicitado cuando presiones la tecla
si decides hacerlo en cada ciclo del loop necesitas un delay razonable para no estar pidiendole al bus que lea las temperaturas permanentemente.... no tiene sentido.
espero haberte ayudado
Ale

1 Like

Los 4 sensores andan perfectamente. La dificultad arranca cuando le anexo el teclado matricial. Que no se confunda, el teclado anda y selecciona la temperatura deseada pero el sensor deja de funcionar (deja de censar en tiempo real) y tira un valor, como si fuera el último valor que tomo.

No hace falta la resolución, por defecto arranca en 12bits.
Si quieres cambiarla lo modificas como has sugerido.

Gracias Ale-X por la respuesta, de hecho es orientadora en la resolución del problema, ya que coincido con esto que decis "solo debes decidir donde poner esta línea: si decides poner la línea en la función de cada tecla". Pero no doy con la resolución del problema. Y no es ninguno de estos valores de error de código (-127 o +85)
En este primer Ejemplo el sensor anda perfectamente

#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Keypad.h>

#define ONE_WIRE_BUS 9
//#define T_RES 10

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;

LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {22, 24, 26, 28};
byte colPins[COLS] = {23, 25, 27, 29};

Keypad teclado = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

float Sensor_Agua;         //sensors.getTempCByIndex(0);

void setup() {
  lcd.begin( 20, 4);
  sensors.begin();
}

void loop() {
  sensors.requestTemperatures();
  Sensor_Agua = sensors.getTempCByIndex(0);
    lcd.setCursor( 5, 0);
  lcd.print("Sensor Agua");
  lcd.setCursor( 5, 1);
  lcd.print(Sensor_Agua);
}

Enlace para el primer ejemplo https://www.youtube.com/watch?v=gx0lIvJj2s4

En este segundo Ejemplo cuando quiero que funcione con la tecla A el sensor deja de funcionar
Ejemplo https://www.youtube.com/watch?v=OdgfwUTg5KY

#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Keypad.h>

#define ONE_WIRE_BUS 9
//#define T_RES 10

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;

LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {22, 24, 26, 28};
byte colPins[COLS] = {23, 25, 27, 29};

Keypad teclado = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

float Sensor_Agua;         //sensors.getTempCByIndex(0);

void setup() {
  lcd.begin( 20, 4);
  sensors.begin();

}

void loop() {
  char tecla = teclado.getKey ();
  if (tecla == 'A') {
    sensors.requestTemperatures();
    Sensor_Agua = sensors.getTempCByIndex(0);
    lcd.setCursor( 5, 0);
    lcd.print("Sensor Agua");
    lcd.setCursor( 5, 1);
    lcd.print(Sensor_Agua);
  }
}

Hola Nandozu,
a mi me parece logico el funcionamiento , ya que cuando has presionado la tecla A te ha devuelto el valor que ha encontrado,
lo que esta programado en tu segundo sketch es que si cambia la temperatura del sensor y vuelves a presionar la tecla A la lecture se actualiza,
lo que esta programado en el primer sketch es un loop eterno sin ningun delay que instantaneamente pide y convierte la temperatura que tiene el sensor y la muestra directamente en el display lcd. .... sin delay significa que esta ocurriendo varios miles de veces por segundo, dependiendo de la velocidad de tu arduino.

si quieres que la lectura se haga en continuo para cada sensor, hasta que presiones otra tecla entonces debes hacer un cambio en la programacion y hacer una variable que cambie cuando se presiona cada tecla entonces el loop sabe que sensor buscar y tambien seria bueno poner un delay razonable y ademas poner una condicion de salida de la lectura por ejemplo cuando pase un determinado tiempo sin presionar nada ...
hay muchas maneras de programar eso
por ejemplo con un switch logico

pero tambien hay varias otras maneras de hacer lo mismo...
como te dije todo depende de lo que quieras hacer ... no esta claro para mi tu necesidad, aunque asumo que es para poder cambiar de sensor entre los cuatro puntos de control de la fermentacion pero no esta claro si quieres una lectura permanente de alguno de los puntos y poder cambiar segun la tecla pulsada el captor activo ... imagino que eso es lo que quieres
en todo caso primero hay que definir la logica de funcionamiento y luego escribir la logica de programacion. de esa manera el sketch es bastante mas facil de organizar

1 Like

@cuantron te había mostrado que debías poner

 sensors.requestTemperatures();

En el primer ejemplo del post#6 lo haces bien y luego cómo no te das cuenta?

void loop() {
  char tecla = teclado.getKey ();
  sensors.requestTemperatures();
  if (tecla == 'A') {
    Sensor_Agua = sensors.getTempCByIndex(0);
    lcd.setCursor( 5, 0);
    lcd.print("Sensor Agua");
    lcd.setCursor( 5, 1);
    lcd.print(Sensor_Agua);
  }
}

Asi debes usarlo que es coincidente con los ejemplos de la librería. Siempre que algo no funciona mira la librería y sus ejemplos, de observar detenidamente casi que no tienes que preguntar nada.
Y no pasa porque nosotros sabemos o no, porque te aseguro que casi todos hemos cometido los mismos errores, pero siempre hago eso, las respuestas estan en los ejemplos y en saber interpretarlos. Hasta la documentación de las librerías te dicen como debes hacer las cosas.

1 Like

Gracias Ale-X por la orientación y referencias.

Gracias Surbyte. Coincido con lo que decís, y se termina pecando de novato.

Siempre se aprende.