Sensor ok pero temperatura -127 si agrego un led

Buenas tardes,
Este no es el tipico posteo de ... tengo un sensor y la temperatura me lee -127 ..
Si no que por momentos lee correctamente y en otras ocasiones no.

Mi proyecto consta de un sensor de temperatura, que sube un nivel y se enciende la refrigeración, o baja y se enciende la calefacción; Antes de poner los peltier en funcionamiento, fuí de a poco... Primero el sensor de temperatura, el display... todo marcando ok... Agregue unos leds de color segun la temperatura y wuala... Aqui es donde se jode... En la lectura nº 26, empieza a marcar temperatura -127 ... Anteriormente sacando el led, se nota que el display refrezca en esa lectura nº 26 y pone el nuevo valor tomado en ese instante . y cada 25 lecturas pone un nuevo valor en el display... A que se debe esto, si no programe que a tantas lecturas lo muestre.. Es mas, deberia aparecer cada 1 segundo que fue lo que programe... Les dejo el texto del Monitor Serie:

Mandando comando al sensor
1 Temperatura sensor: 25.56
Mandando comando al sensor
2 Temperatura sensor: 25.50
Mandando comando al sensor
3Temperatura sensor: 25.37
Mandando comando al sensor
4Temperatura sensor: 24.94
Mandando comando al sensor
5Temperatura sensor: 25.62
Mandando comando al sensor
6Temperatura sensor: 25.50
Mandando comando al sensor
7Temperatura sensor: 25.31
Mandando comando al sensor
8Temperatura sensor: 25.50
Mandando comando al sensor
9Temperatura sensor: 24.81
Mandando comando al sensor
10Temperatura sensor: 25.56
Mandando comando al sensor
11Temperatura sensor: 25.37
Mandando comando al sensor
12Temperatura sensor: 25.50
Mandando comando al sensor
13Temperatura sensor: 25.00
Mandando comando al sensor
14Temperatura sensor: 25.56
Mandando comando al sensor
15Temperatura sensor: 24.94
Mandando comando al sensor
16Temperatura sensor: 25.31
Mandando comando al sensor
17Temperatura sensor: 24.69
Mandando comando al sensor
18Temperatura sensor: 25.31
Mandando comando al sensor
19Temperatura sensor: 25.56
Mandando comando al sensor
20Temperatura sensor: 25.44
Mandando comando al sensor
21Temperatura sensor: 25.50
Mandando comando al sensor
22Temperatura sensor: 25.50
Mandando comando al sensor
23Temperatura sensor: 25.31
Mandando comando al sensor
24Temperatura sensor: 25.44
Mandando comando al sensor
25Temperatura sensor: 25.56
Mandando comando al sensor
26TempERatura sensor: -127.00
Mandando comando al sensor
27Temperatura sENsor: -127.00
Mandando comando al sensor
28Temperatura sensor: -127.00

Desde ya , muchas gracias

Saludos.

Cómo podemos adivinar que es lo que funciona mal si no indicas que sensor estás usando y ni siquiera subes lo que programaste ? Te recomiendo que leas las normas del foro antes de contestar.

Porque la falla es algo generica y no tiene que ver con el programa, de todas formas …

#include <OneWire.h>
#include <DallasTemperature.h>
#include "U8glib.h"


//DISPLAY
//U8GLIB_ST7920_128X64_1X u8g(10);//este es para uno
U8GLIB_ST7920_128X64_1X u8g(12, 11, 10);  // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17

// pin donde esta conectado dq
const byte pinDatosDQ = 13;
long temperatura = 0;


// instancia a las clases OneWire y DallasTempmerature
OneWire oneWireObjeto(pinDatosDQ);
DallasTemperature sensorDS18B20(&oneWireObjeto);


void setup() {
  //inicio la comunicacion serie
  Serial.begin(9600);
  pinMode(3, OUTPUT);     // pin 3 como salida (aca va el led)
  digitalWrite(3, LOW);   // Inicializamos el pin 3 en cero 
  // inicio el bus onewire
  sensorDS18B20.begin();


  //----display--
  u8g.setColorIndex(3);         // definir intensidad, 3 es maximo
  u8g.setColorIndex(1);         // pixeles on, poniendo 0 no salen
  u8g.setFont(u8g_font_5x8r);//define tipo/tamaño letra https://github.com/olikraus/u8glib/wiki/fontgroupx11
  u8g.firstPage();
  pinMode(12, OUTPUT);
  digitalWrite(12, HIGH);
}


void loop() {
  // mando el comando para tomar la temperatura del sensor
  Serial.println("Mandando comando al sensor");
  sensorDS18B20.requestTemperatures(); // clase de dallastemperature

  //leo y muestro los datos del sensor
  Serial.print("Temperatura sensor: ");
  Serial.println(sensorDS18B20.getTempCByIndex(0));
  // clase de dallas temperature.
  delay(1000);

  temperatura = sensorDS18B20.getTempCByIndex(0);

  if (temperatura >= 25 && temperatura <= 34) { // pregunta si la temperatura esta mayor o igual que 25 grados y menor o igual que 34 grados
    digitalWrite(3, HIGH);    // Prende led
  }
  if (temperatura >= 35) {    // pregunta si la temperatura es mayor o igual a 35 grados centigrados
    digitalWrite(3, LOW);      // Apaga led
   
  }
  if (temperatura <= 24) {    // pregunta si la temperatura es mayor o igua a 24 grados  centigrados
    digitalWrite(3, LOW);       // apaga led
  }


  do {
    muestra_dsp();
  } while ( u8g.nextPage() );

}


void muestra_dsp(void) {
  int temp = 0;
  u8g.enableCursor();
  u8g.setPrintPos(7, 7); // 2,7
  u8g.setCursorStyle(32);
  u8g.print("Aire Acondicionado Movil");
  u8g.setPrintPos(20, 20);
  u8g.print("Temperatura : ");
  u8g.enableCursor();
  u8g.print(sensorDS18B20.getTempCByIndex(0));
}

Y para que leer las nomas del foro, o leer otros hilos y ver cómo se postea un código, un enlace o una imágen.
Ahora esas advertido por la falta cometida. Lee las normas y edita tu post.

Probaste los ejemplos de las librerías DallasTemperture o OneWire?

Pusiste una resistencia entre la salida del DS18B20 y vcc ? Es recomendable una de 4k7.

Pablo_Lucini:
Pusiste una resistencia entre la salida del DS18B20 y vcc ? Es recomendable una de 4k7.

Buenas tardes, si, tengo una resistencia de 4k7 justo.

Buenas tardes,
Actualizo ya que de forma magica … ( si, el famoso borrar y volver a escribir funciono ), y ahora el programa responde al agregarle un Led… por el momento cuando la temperatura es mayor a 25 grados se enciende, sino se apaga… , Le quise agregar un segundo led y volvio a tirar la falla del principio… en la lectura 26 empieza a marcar -127 … Tambien me llama la atención, que en los momentos que todo funciona ok, el programa refresca la pantalla en la lectura 26 y no cada un segundo … y eso no esta programado en ningun lado, porque lo hace justo en ese nº de lectura ?

 #include <OneWire.h>
#include <DallasTemperature.h>
#include "U8glib.h"


//DISPLAY
//U8GLIB_ST7920_128X64_1X u8g(10);//este es para uno
U8GLIB_ST7920_128X64_1X u8g(12, 11, 10);  // SPI Com: SCK = en = 18, MOSI = rw = 16, CS = di = 17

// pin donde esta conectado dq
const byte pinDatosDQ = 13;
long temperatura = 0;


// instancia a las clases OneWire y DallasTempmerature
OneWire oneWireObjeto(pinDatosDQ);
DallasTemperature sensorDS18B20(&oneWireObjeto);


void setup() {
  //inicio la comunicacion serie
  Serial.begin(9600);
  pinMode(2, OUTPUT);     // pin 2 como salida Led azul
  //pinMode(3, OUTPUT);    // pin 3 como salida Led rojo.
  digitalWrite(2, LOW);   // Inicializo el pin 2 en cero
  //digitalWrite(3, LOW);  // Inicializo el pin 3 en cero

  // inicio el bus onewire
  sensorDS18B20.begin();


  //----display--
  u8g.setColorIndex(3);         // definir intensidad, 3 es maximo
  u8g.setColorIndex(1);         // pixeles on, poniendo 0 no salen
  u8g.setFont(u8g_font_5x8r); //define tipo/tamaño letra https://github.com/olikraus/u8glib/wiki/fontgroupx11
  u8g.firstPage();
  pinMode(12, OUTPUT);
  digitalWrite(12, HIGH);
}


void loop() {
  // mando el comando para tomar la temperatura del sensor
  Serial.println("Mandando comando al sensor");
  sensorDS18B20.requestTemperatures(); // clase de dallastemperature

  //leo y muestro los datos del sensor
  Serial.print("Temperatura sensor: ");
  Serial.println(sensorDS18B20.getTempCByIndex(0));
  // clase de dallas temperature.
  delay(1000);

  temperatura = sensorDS18B20.getTempCByIndex(0);

  if (temperatura > 25) { // pregunta si la temperatura esta mayor o igual que 25 grados
    digitalWrite(3, HIGH);    // enciende led rojo  
    digitalWrite(2, LOW);    // 
     
  }
  if (temperatura <= 25) {    // pregunta si la temperatura es mayor o igual a 35 grados centigrados
    digitalWrite(3, LOW);     //  
    digitalWrite(2, HIGH);      // enciende led  azul
     
  }
  


  do {
    muestra_dsp();
  } while ( u8g.nextPage() ); 

}


void muestra_dsp(void) {

  u8g.enableCursor();
  u8g.setPrintPos(7, 7); // 2,7
  u8g.setCursorStyle(32);
  u8g.print("Aire Acondicionado Movil");
  u8g.setPrintPos(20, 20);
  u8g.print("Temperatura : ");
  u8g.enableCursor();
  u8g.print(sensorDS18B20.getTempCByIndex(0));



}

Joy. Revisá las conexiones. Cuando muestra ese valor ( -127) suele ser porque no está leyendo la info del DS18B20. No sé si estás usando una protoboard, daría la impresión de que está haciendo algún falso contacto.

Vuelvo a consultarte,

Probaste los ejemplos de las librerías DallasTemperture o OneWire?

te dan el mismo error?

Pablo_Lucini:
Joy. Revisá las conexiones. Cuando muestra ese valor ( -127) suele ser porque no está leyendo la info del DS18B20. No sé si estás usando una protoboard, daría la impresión de que está haciendo algún falso contacto.

Pero siempre lo hace en la lectura 26 , si es q pongo los dos led, con uno funciona perfecto... mejoro , nose como.

surbyte:
Vuelvo a consultarte,

te dan el mismo error?

Funcionan perfecto, probe todas... es mas, encontre una sentencia que me puede llegar a servir para hacer esto de activar y desactivar el led.. ( en un futuro sera un peltier y sus cooler).
Se llama AlarmHandler ... tiene dos rangos, sensors.getLowAlarmTemp y sensors.getHighAlarmTemp , outsideThermometer y outsideThermometer . Todavia no investigue mucho pero lo hice funcionar con los led y va .. nose q puede ser q un simple If haga tanta historia..

Existe la posibilidad (cosa que no puedo asegurar) que U8glib use algun timer o interrupción. He visto que con AVR no usa interrupciones pero no revisé todos sus archivos de librería.

Eso podría complicarte el manejo del DS18B20.

surbyte:
Existe la posibilidad (cosa que no puedo asegurar) que U8glib use algun timer o interrupción. He visto que con AVR no usa interrupciones pero no revisé todos sus archivos de librería.

Eso podría complicarte el manejo del DS18B20.

La libreria esta la estoy usando porque tengo el display grandote, pero nose.. puedo usar la de liquidcristal ? Pensaba q desaprovecharia el display, igual intente agregarle logo con programas q hay en el foro , sin éxito jaja . Me enquilombe mucho con esa libreria decis ? No es comun usarla ? Gracias.

surbyte:
Existe la posibilidad (cosa que no puedo asegurar) que U8glib use algun timer o interrupción. He visto que con AVR no usa interrupciones pero no revisé todos sus archivos de librería.

Eso podría complicarte el manejo del DS18B20.

Buenas,
Sabes que comente todas las zonas donde estaba en uso el display, y ahora funciona, prende el led rojo cuando pasa los 25 grados, el azul cuando es menor... no entiendo poorque sucede esto ... timer o interrupción? Tan diifcil es usar un misero display, conrazon nadie de los otros proyectos utilizo uno ¬¬ ... Alguna idea de como poder solucionarlo ? :cry: Gracias. Saludos!

O sea que tenia razón.
No es dificil pero solo hay que ser cuidadoso.
El ds18b20 necesita 750 mseg para entregarte un valor, si algo perturba eso, la información que te da, será errónea.
Eso puede estar pasando.
Usan un LCD simple y verás que no ocurre el problema.