SOLUCIONADO: Problema con sensor de temp humedad

Buenas compañeros.

tengo el arduino uno, con un sensor sht15, por mas vueltas que le doy no consigo que me devuelva ni la temp ni humedad.

me descarge la libreria Sensirion pero me da muchisimos errores de compilacion en esta libreria, estoy desesperado ya no se como coger la temperatura de este sensor.

Ayudadme

Emplee el codigo de un compañeros del foro, el problema esque me sigue representando valores de temp muy altos y en negativo, es curioso porque si le quito el sensor y le dejo el arduino solo sigue esos valores, no se que hacer.

http://forum.arduino.cc/index.php?topic=32341.0

Hola, te propongo esto, te paso un código (no es mio lo bajé de http://www.glacialwanderer.com/_blog/blog2008/04_April/sht15.pde) ponés los pines así (data pin → 10 y clock pin → 11) y te conectás con el monitor a 9600 baudios.
Tipeás “t” (sin comillas) y enter. Te devuelve la temperatura. Si hacés lo mismo con “h” en lugar de la t, te devuelve la humedad.
Si esto te funciona, revisamos lo que tenés hecho hasta ahora.

Acá va el código (bajado desde:http://www.glacialwanderer.com/_blog/blog2008/04_April/sht15.pde):

// Maurice Ribble 
// 4-3-2008
// http://www.glacialwanderer.com/hobbyrobotics

// This code tests the SHT15 on the Arduino board.
// This app assumes your data pin is pin 10 and your your clock pin is pin 11.
// To run this app just attach HyperTerminal (or similar serial communications tool)
// to your Arduino board at 9600 bits per second.  I also needed te set the
// flow control to none or I couldn't send commands to my Arduino board via HyperTerminal.
// Then press the 't' key to take a temperature reading or the 'h' key to take a
// humidity reading.

// These are commands we need to send to HSHT15 to control it
int gTempCmd  = 0b00000011;
int gHumidCmd = 0b00000101;
  
int shiftIn(int dataPin, int clockPin, int numBits)
{
   int ret = 0;
   int i;

   for (i=0; i<numBits; ++i)
   {
      digitalWrite(clockPin, HIGH);
      delay(10);  // I don't know why I need this, but without it I don't get my 8 lsb of temp
      ret = ret*2 + digitalRead(dataPin);
      digitalWrite(clockPin, LOW);
   }

   return(ret);
}

void sendCommandSHT(int command, int dataPin, int clockPin)
{
  int ack;

  // Transmission Start
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  digitalWrite(dataPin, HIGH);
  digitalWrite(clockPin, HIGH);
  digitalWrite(dataPin, LOW);
  digitalWrite(clockPin, LOW);
  digitalWrite(clockPin, HIGH);
  digitalWrite(dataPin, HIGH);
  digitalWrite(clockPin, LOW);
           
  // The command (3 msb are address and must be 000, and last 5 bits are command)
  shiftOut(dataPin, clockPin, MSBFIRST, command);

  // Verify we get the coorect ack
  digitalWrite(clockPin, HIGH);
  pinMode(dataPin, INPUT);
  ack = digitalRead(dataPin);
  if (ack != LOW)
    Serial.println("Ack Error 0");
  digitalWrite(clockPin, LOW);
  ack = digitalRead(dataPin);
  if (ack != HIGH)
     Serial.println("Ack Error 1");
}

void waitForResultSHT(int dataPin)
{
  int i;
  int ack;
  
  pinMode(dataPin, INPUT);
  
  for(i= 0; i < 100; ++i)
  {
    delay(10);
    ack = digitalRead(dataPin);

    if (ack == LOW)
      break;
  }
  
  if (ack == HIGH)
    Serial.println("Ack Error 2");
}

int getData16SHT(int dataPin, int clockPin)
{
  int val;
  
  // Get the most significant bits
  pinMode(dataPin, INPUT);
  pinMode(clockPin, OUTPUT);
  val = shiftIn(dataPin, clockPin, 8);
  val *= 256;

  // Send the required ack
  pinMode(dataPin, OUTPUT);
  digitalWrite(dataPin, HIGH);
  digitalWrite(dataPin, LOW);
  digitalWrite(clockPin, HIGH);
  digitalWrite(clockPin, LOW);
           
  // Get the lest significant bits
  pinMode(dataPin, INPUT);
  val |= shiftIn(dataPin, clockPin, 8);

  return val;
}

void skipCrcSHT(int dataPin, int clockPin)
{
  // Skip acknowledge to end trans (no CRC)
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);

  digitalWrite(dataPin, HIGH);
  digitalWrite(clockPin, HIGH);
  digitalWrite(clockPin, LOW);
}

void setup()
{
   Serial.begin(9600); // open serial
}

void loop()
{
  int theDataPin  = 10;
  int theClockPin = 11;
  char cmd = 0;
  int ack;
  
  while (Serial.available() > 0)
  {
      cmd = Serial.read();
      
      switch (cmd)
      {
      case 't':  //Read Temperature
         {
           int val;
           int temp;
           
           sendCommandSHT(gTempCmd, theDataPin, theClockPin);
           waitForResultSHT(theDataPin);
           val = getData16SHT(theDataPin, theClockPin);
           skipCrcSHT(theDataPin, theClockPin);
           Serial.print("Temp is:");
           Serial.print(val, HEX);
           temp = -40.0 + 0.018 * (float)val;
           Serial.print("  ");
           Serial.println(temp, DEC);         
           break;
         }
      case 'h': //Read Humidity
         {
           int val;
           int humid;
           
           sendCommandSHT(gHumidCmd, theDataPin, theClockPin);
           waitForResultSHT(theDataPin);
           val = getData16SHT(theDataPin, theClockPin);
           skipCrcSHT(theDataPin, theClockPin);
           Serial.print("Humidity is:");
           Serial.print(val, HEX);
           humid = -4.0 + 0.0405 * val + -0.0000028 * val * val;
           Serial.print("  ");
           Serial.println(humid, DEC);
           break; 
         }
      default:
         {
           Serial.println("You pressed something else");
         }
      }
   }
}

Gracias por tu respuesta.

Me devuelve esto

Ack Error 0
Temp is:FFFFAAAA  -433
Ack Error 0
Humidity is:FFFFAAAA  -2225

Bueno, parece que tenés un problema de conexión. Revisá que el ground, el Vcc, clk y data estén bien conectados (no haya falsos contactos).
Si revisaste y te sigue dando valores erráticos, poné una resistencia de 10Koms entre la línea data y Vcc (esto se llama un pull-up resistor, que lo que hace es mantener un 1 lógico, hasta que haya un low lógico). Esto último está en el datasheet del sht15, no lo ví en el proyecto de donde bajé el código. Pero podría ser el problema tuyo, y la persona del proyecto que sité lo dió por un hecho.

Contame cómo te va con esto. Y si te sigue fallando (espero que no), decime si cambian los valores de una prueba a otra.

Saludos

Hola te cuento las pruebas que hice.

Le coloque una resistencia como me dijistes de 1koms en VCC y otra resistencia en 1koms en data ( es asi??), lo conecte y me seguia dando el mismo resultado.

Ack Error 0
Temp is:FFFFAAAA  -433
Ack Error 0
Humidity is:FFFFAAAA  -2225

Pensando que no recibia corriente le conecte un diodo led y se encendia cada vez que inserto "t" o "h" no se donde puede estar el problema...pero arduino no recibe lo que el sensor le manda o el propio sensor no hace lo que tiene que hacer....

Que puede ser????

Hola, hubo un error de interpretación. La resistencia debe unir la línea de data con la del Vcc (5v). Solo eso.

La prueba del led me sorprende que sólo se encienda cuando mandás la t o la h. El sensor debe recibir el ground (-) y Vcc(5v+) todo el tiempo! Además se conectan las líneas data al pin 10 y clock al pin 11 del arduino. Estaría bueno si sacás una foto de las conexiones y la subís, así puedo ayudarte a descubrir qué está mal.

Ahora si que me he perdido, Te mando una foto de como lo tengo conectado, dime como tengo que conectar la resistencia de 10koms.

La Prueba del led encendia tanto en el VCC con el ground continuamente.
Si unia VCC - con DATA se enciende cuando mando “h” o “t”

Gracias

Las conexiones están bien, te falta poner una resistencia de 10K uniendo el cable amarillo (dat) con el rosa (Vcc o +).
Por otro lado no sé cómo están soldadas las patitas del sensor. Fijate de poner soldaduras del lado que mostrás en la foto. Se entiende?
Te subí una foto con flechitas dónde creo que deberías soldar (salvo que esté bien soldado del otro lado - bien me refiero a que haya contacto de la placa con los pines).

Yo tengo el SHT11 y la resistencia (de entré 1 y 10 K) se pone entre el pin Data y la línea de 5v así:

Correcto! De esa forma generás un 1 lógico permanente en Data. Cuando data tenga un valor LOW, al pin 10 le va a llegar un 0 lógico. Esto se llama pull-up resistor.

haciendo eso me retorna estos valores

Le coloque el led en data y sck y esta permanentemente encendido, peor el sensor sigue sin darme valores correctos es mas los ack dan error

PD: Voy a revisar las soldaruras del sensor.

Ack Error 0
Ack Error 2
Temp is:FFFFFFFF  -40
Ack Error 0
Ack Error 2
Humidity is:FFFFFFFF  -4

Te falta revisar eso…si no son las soldaduras, tirá el sensor a la basura! Esperemos que no!

Revisadas las soldaduras una a una, volvi a soldarlas pero seguimos igual. Vaya sensor!!!!!

Quite toda la ilera de pines y le puse unos nuevos, ahroa si me funciona!!!

con estos valores.

Temp is:1CF4  93
Humidity is:526  44

Esta recien soldado supongo que bajara la temperatura

WARNING - Temp C - F: 31.40 - 88.59 Humidity :48.75
WARNING - Temp C - F: 31.40 - 88.56 Humidity :48.75
WARNING - Temp C - F: 31.38 - 88.56 Humidity :48.78
WARNING - Temp C - F: 31.37 - 88.54 Humidity :48.78
WARNING - Temp C - F: 31.34 - 88.48 Humidity :48.78
WARNING - Temp C - F: 31.34 - 88.45 Humidity :48.85
WARNING - Temp C - F: 31.31 - 88.45 Humidity :48.85
WARNING - Temp C - F: 31.30 - 88.41 Humidity :48.84
WARNING - Temp C - F: 31.30 - 88.38 Humidity :48.88

Esto ya es más normal.

Me alegro muchísimo! Yo también soy nuevo en el foro (y en los foros también) y sos el primero que ayudo! Muy contento! :D

Acordate de poner como resuelto el topic. Saludos

Enhorabuena!!! ;)

Gracias compañero.

Volvi a re-soldar los pines y funciono,

Aproposito la resistencia de 10Koms no es necesaria ponerla, me toma los valores igual con ella que sin ella.

Lo que me gustaria saber es como poner un led que se encienda cuando toma la temp y la humedad.

Se ve que el módulo que tenés ya tiene la resistencia haciendo el pull-up.
Lo del led, yo lo haría en otro pin, comandando aparte en simultáneo a las lecturas que hagas. Esto lo haría así para no sacar corriente (electrones) necesarios para la comunicación con el sensor.

Recordá cambiar el status de este topic a resuelto. :smiley:

El Led que le quiero poner es a modo de estado del sensor para saber que esta activo o fallo. Se lo colocaré en otro pin