Grove Temperature and Humidity Sensor

Grove is a modulated, ready-to-use tool set.
Much like Lego, it takes a building block approach to assembling electronics.

Moderators: lily.li, salmanfarisvp, violet, jeremy882, crail.lyu969

Post Reply
x641zzz
Pre-kindergarten
Pre-kindergarten
Posts: 9
Joined: Sun Mar 24, 2013 1:19 pm
Location: Between Heaven n Hell

Grove Temperature and Humidity Sensor

Post by x641zzz » Fri Mar 29, 2013 4:00 pm

Hi, I am connecting Grove Temp & Hum Sensor to XBee Carrier + Wifi Bee, I am using the library in the Wiki and use the example like this :

Code: Select all

// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain

#include "DHT.h"

#define DHTPIN 2     // what pin we're connected to

// Uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11 
//#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Connect pin 1 (on the left) of the sensor to +5V
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600); 
  Serial.println("DHTxx test!");
 
  dht.begin();
}

void loop() {
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (isnan(t) || isnan(h)) {
    Serial.println("Failed to read from DHT");
  } else {
    Serial.print("Humidity: "); 
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: "); 
    Serial.print(t);
    Serial.println(" *C");
  }
}
but the result is :

Code: Select all

DHTxx test!
Read failFailed to read from DHT
Humidity: 0.00 %	Temperature: 0.00 *C
Humidity: 0.00 %	Temperature: 0.00 *C
Humidity: 0.00 %	Temperature: 0.00 *C
==============
and then I tried to use another code :

Code: Select all

/* YourDuino.com Example Software Sketch
   DHT11 Humidity and Temperature Sensor test
   Credits: Rob Tillaart
   http://arduino-direct.com/sunshop/index.php?l=product_detail&p=162
   terry@yourduino.com */
   
/*-----( Import needed libraries )-----*/
#include <dht11.h>

/*-----( Declare objects )-----*/
dht11 DHT11;

/*-----( Declare Constants, Pin Numbers )-----*/
#define DHT11PIN 2

void setup()   /*----( SETUP: RUNS ONCE )----*/
{
  Serial.begin(9600);
  Serial.println("DHT11 TEST PROGRAM ");
  Serial.print("LIBRARY VERSION: ");
  Serial.println(DHT11LIB_VERSION);
  Serial.println();
}/*--(end setup )---*/

void loop()   /*----( LOOP: RUNS CONSTANTLY )----*/
{
  Serial.println("\n");

  int chk = DHT11.read(DHT11PIN);

  Serial.print("Read sensor: ");
  switch (chk)
  {
    case 0: Serial.println("OK"); break;
    case -1: Serial.println("Checksum error"); break;
    case -2: Serial.println("Time out error"); break;
    default: Serial.println("Unknown error"); break;
  }

  Serial.print("Humidity (%): ");
  Serial.println((float)DHT11.humidity, 2);

  Serial.print("Temperature (oC): ");
  Serial.println((float)DHT11.temperature, 2);

  Serial.print("Temperature (oF): ");
  Serial.println(Fahrenheit(DHT11.temperature), 2);

  Serial.print("Temperature (K): ");
  Serial.println(Kelvin(DHT11.temperature), 2);

  Serial.print("Dew Point (oC): ");
  Serial.println(dewPoint(DHT11.temperature, DHT11.humidity));

  Serial.print("Dew PointFast (oC): ");
  Serial.println(dewPointFast(DHT11.temperature, DHT11.humidity));

  delay(2000);
}/* --(end main loop )-- */

/*-----( Declare User-written Functions )-----*/
//
//Celsius to Fahrenheit conversion
double Fahrenheit(double celsius)
{
        return 1.8 * celsius + 32;
}

//Celsius to Kelvin conversion
double Kelvin(double celsius)
{
        return celsius + 273.15;
}

// dewPoint function NOAA
// reference: http://wahiduddin.net/calc/density_algorithms.htm 
double dewPoint(double celsius, double humidity)
{
        double A0= 373.15/(273.15 + celsius);
        double SUM = -7.90298 * (A0-1);
        SUM += 5.02808 * log10(A0);
        SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ;
        SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ;
        SUM += log10(1013.246);
        double VP = pow(10, SUM-3) * humidity;
        double T = log(VP/0.61078);   // temp var
        return (241.88 * T) / (17.558-T);
}

// delta max = 0.6544 wrt dewPoint()
// 5x faster than dewPoint()
// reference: http://en.wikipedia.org/wiki/Dew_point
double dewPointFast(double celsius, double humidity)
{
        double a = 17.271;
        double b = 237.7;
        double temp = (a * celsius) / (b + celsius) + log(humidity/100);
        double Td = (b * temp) / (a - temp);
        return Td;
}

/* ( THE END ) */
and the result is :

Code: Select all

DHT11 TEST PROGRAM 
LIBRARY VERSION: 0.3.2



Read sensor: Time out error
Humidity (%): 0.00
Temperature (oC): 0.00
Temperature (oF): 32.00
Temperature (K): 273.15
Dew Point (oC): nan
Dew PointFast (oC): nan
I was wondering that the cause is the I/O pin, in both code above they use pin 2 but when I googling around I found that the code is for DHT11 like this :
Image
pin 1 = VCC
pin 2 = Signal/Data
pin 3 = NC/Not Connected
pin 4 = Ground
not a Grove like I am using :
Image
that's why the both code use pin 2, so I tried to change it to pin 5 as discribed in Xbee Carrier Wiki, although I am not sure that pin 5 means D5 and pin 6 means D6 Grove Connector:
Image
When using an RFBee, the following pinouts apply for using the arduino IDE
Pin 5 is the Grove connector for I/O - Yellow wire
Pin 6 is the Grove connector for I/O - White wire
and when I carefully look at the cable, everything is at the right place :
Cable Colour == Xbee Carrier == Grove Temp Hum
Yellow == D5 == SIG
White == D6 == NC
Red == VCC == VCC
Black == Ground == Ground
but the result is the same, timeout or communication failed, anyone can help?

#sorry for my bad english

User avatar
loovee
Elementary-3
Elementary-3
Posts: 352
Joined: Fri Nov 02, 2012 9:15 am

Re: Grove Temperature and Humidity Sensor

Post by loovee » Sun Mar 31, 2013 9:16 am

hi, do you have a multimeter by hand? Can you chenk if the Vcc pin 3.3V ?
btw~ you english is more good than mine~ :D

x641zzz
Pre-kindergarten
Pre-kindergarten
Posts: 9
Joined: Sun Mar 24, 2013 1:19 pm
Location: Between Heaven n Hell

Re: Grove Temperature and Humidity Sensor

Post by x641zzz » Tue Apr 02, 2013 10:36 pm

My friend has just checked VCC pin on both the sensor and Xbee Carrier and the result is around 3.8 V. So, I think that should be enough to powering the sensor.

#nope, my english is not as good as you think :P

x641zzz
Pre-kindergarten
Pre-kindergarten
Posts: 9
Joined: Sun Mar 24, 2013 1:19 pm
Location: Between Heaven n Hell

Re: Grove Temperature and Humidity Sensor

Post by x641zzz » Mon Apr 08, 2013 4:29 pm

I tried another code again from here :

Code: Select all

#define dht11_pin 14 //Analog port 0 on Arduino Uno
//#define dht11_pin 54 //Analog port 0 on Arduino Mega2560
  
byte read_dht11_dat()
{
  byte i = 0;
  byte result=0;
  for(i=0; i< 8; i++)
  {
    while (!digitalRead(dht11_pin));
    delayMicroseconds(30);
    if (digitalRead(dht11_pin) != 0 )
      bitSet(result, 7-i);
    while (digitalRead(dht11_pin));
  }
  return result;
}
  
  
void setup()
{
  pinMode(dht11_pin, OUTPUT);
  digitalWrite(dht11_pin, HIGH);
  Serial.begin(9600);
  Serial.println("Ready");
}
      
void loop()    
{
  byte dht11_dat[5];   
  byte dht11_in;
  byte i;// start condition
       
  digitalWrite(dht11_pin, LOW);
  delay(18);
  digitalWrite(dht11_pin, HIGH);
  delayMicroseconds(1);
  pinMode(dht11_pin, INPUT);
  delayMicroseconds(40);     
    
  if (digitalRead(dht11_pin))
  {
    Serial.println("dht11 start condition 1 not met"); // wait for DHT response signal: LOW
    delay(1000);
    return;
  }
  delayMicroseconds(80);
  if (!digitalRead(dht11_pin))
  {
    Serial.println("dht11 start condition 2 not met");  //wair for second response signal:HIGH
    return;
  }
    
  delayMicroseconds(80);// now ready for data reception
  for (i=0; i<5; i++)
  {  dht11_dat[i] = read_dht11_dat();}  //recieved 40 bits data. Details are described in datasheet
    
  pinMode(dht11_pin, OUTPUT);
  digitalWrite(dht11_pin, HIGH);
  byte dht11_check_sum = dht11_dat[0]+dht11_dat[2];// check check_sum
  if(dht11_dat[4]!= dht11_check_sum)
  {
    Serial.println("DHT11 checksum error");
  }
  Serial.print("Current humdity = ");
  Serial.print(dht11_dat[0], DEC);
  Serial.print("%  ");
  Serial.print("temperature = ");
  Serial.print(dht11_dat[2], DEC);
  Serial.println("C  ");
  delay(2000); //fresh time
}
the result :

Code: Select all

Ready
dht11 start condition 1 not met
dht11 start condition 1 not met
dht11 start condition 1 not met
dht11 start condition 1 not met
dht11 start condition 1 not met
dht11 start condition 1 not met
I also asked on "Question & Answer" section in Xbee Carrier product guide and Jacket Chueng answered :
Hi.You also need to add some code to the program,such as: pinMode(16, OUTPUT); digitalWrite(16, LOW).And more information you can refer to our wiki:Pin 16 may need to be driven low to provide enough power to the I/O Grove [via mosfet].
Answered by Jacket Chueng | 2013-04-07
anyone can give me some more detail what should I do? I am a newbie on Arduino and microcontroller, I just want to make a simple project and develop it later after this has been success.

x641zzz
Pre-kindergarten
Pre-kindergarten
Posts: 9
Joined: Sun Mar 24, 2013 1:19 pm
Location: Between Heaven n Hell

Re: Grove Temperature and Humidity Sensor

Post by x641zzz » Mon May 20, 2013 10:41 pm

Ok since I bought this sensor from Gerai Cerdas in my country, so I asked them to check the sensor in case if it is broken, but they said there is no problem. Then I emailed them about this problem and they answered that those sketches I've tried is only for simple circuit like Uno, Mega, etc. and told me to make a simple webserver to send the temperature & humidity value but I dont know how to do that, I am only able to send RAW value from sensor to webserver and store it into MySQL and then show the statistic from MySQL to webserver, I am using Wifi Bee and WiShield/WiServer library and it works fine (only RAW value from the sensor). I've searched over the internet for 2 months and already posted in some forums but still not solved.

Can anyone teach me how to extract temperature & humidity value? fist I have to try to show in Serial Monitor, if it works then I will go to WiServer.
Here is DHT11 Datasheet if needed :
http://www.micro4you.com/files/sensor/DHT11.pdf

Thanks in advance.
#sorry for my bad english

x641zzz
Pre-kindergarten
Pre-kindergarten
Posts: 9
Joined: Sun Mar 24, 2013 1:19 pm
Location: Between Heaven n Hell

Re: Grove Temperature and Humidity Sensor

Post by x641zzz » Tue May 21, 2013 1:23 am

I look again to Wifi Bee wiki for pin definition :
Image

and try again the sketch :

Code: Select all

// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain

#include <DHT.h>

#define DHTPIN 5     // what pin we're connected to

// Uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11 
//#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Connect pin 1 (on the left) of the sensor to +5V
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600); 
  Serial.println("DHTxx test!");
 
  dht.begin();
}

void loop() {
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  unsigned char sensorValue = analogRead(5);

  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (isnan(t) || isnan(h)) {
    Serial.println("Failed to read from DHT");
  } else {
    Serial.print("Humidity: "); 
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: "); 
    Serial.print(t);
    Serial.println(" *C");
    Serial.print("RAW value : ");
    Serial.println(sensorValue);
  }
}
but the result still same although it can read RAW value from sensor :
Image

then I move the sensor from D5,D6 to I2C Grove Connector and changed the DHTPIN from 5 to 19 and it works!! XD
Image

Not sure how it become works because I have already tried to move the sensor to I2C connector but that time still didnt work. And I dont know why pin 5 (PD5) cant read sensor value but pin 19 (SCL) can although pin 5 and 19 both are DIO. Cant believe I have been struggling for 2 months only because of this mistake.. -_-'

since my problem is solved then I will continue my project, I were already able to store RAW value and store it into MySQL and show the statistic, and now I only have to change the RAW value with temperature & humidity value.. :D
many thanks to all who has been assisting me till now. sorry if this newbie have been being troublesome for you all..

Post Reply