Go Down

Topic: Creating hysteresis with DHT11 sensor.. (Read 1 time) previous topic - next topic

Hackdub

I'm building a simple fan controller...I want the fan to switch on at 27c and go off at 25c, hence creating a 2c hysteresis..

at the moment with the code below the fan goes on off around 27.... is this due to the else command .. do I create a >27 and <25 scenarios and put the else between?

Code: [Select]
{
    if(t>=27)
    {//lcd.setCursor(0, 0);
    //lcd.print("*  hot *  ");
    digitalWrite(fan, HIGH);
    lcd.setCursor(15, 0);
  lcd.print("F");}
  else
    {//lcd.setCursor(0, 0);
   // lcd.print("  Just Right       ");
    digitalWrite(fan, LOW);
    lcd.setCursor(15, 0);
  lcd.print("_");
  }
  {
    if(t<=25)
   
    {//lcd.setCursor(0, 0);
    //lcd.print("It's Freezing");}
    digitalWrite(fan, LOW);}

  }


Second question. I'm using the DHT 11 sensor, the temp is only shown in single 1c units, no decimal.. Im using the library from http://learn.adafruit.com/dht/using-a-dhtxx-sensor

thanks for any help


Riva


I'm building a simple fan controller...I want the fan to switch on at 27c and go off at 25c, hence creating a 2c hysteresis..

at the moment with the code below the fan goes on off around 27.... is this due to the else command .. Yes
do I create a >27 and <25 scenarios and put the else between?
Just have a >=27 and <=25 with no else condition.

Second question. I'm using the DHT 11 sensor, the temp is only shown in single 1c units, no decimal.. Im using the library from http://learn.adafruit.com/dht/using-a-dhtxx-sensor
You don't show code for this but your probably using int instead of float and loosing the .x part.
http://forum.arduino.cc/index.php?action=unread;boards=5,67,10,11,66,12,15,17,21,22,23,24,25,29;ALL

Hackdub

Ok so code 
Code: [Select]
{
    if(t>=27)
    {
    digitalWrite(fan, HIGH);
    lcd.setCursor(15, 0);
    lcd.print("F");}
 
    if(t<=25)
    {digitalWrite(fan, LOW);}

  }



Hackdub

#3
Feb 13, 2013, 12:33 pm Last Edit: Feb 13, 2013, 12:50 pm by Hackdub Reason: 1
Code for reading sensor = I'm using float, but it only shows in 1c increments.

Code: [Select]
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("  %   ");
   Serial.print("Temp: ");
   Serial.print(t);
   Serial.println("C");
 }


 // set the cursor to column 0, line 1
 // (note: line 1 is the second row, since counting begins with 0):
 lcd.setCursor(8, 1);
 lcd.print("H:");
 lcd.print(h);
 lcd.print("%");
 //delay(2000);
 lcd.setCursor(0, 1);
 lcd.print("T:");
 lcd.print(t);
 //lcd.print("C");
 //delay(2000);

 {
   if(t>=25)
   {//lcd.setCursor(0, 0);
   //lcd.print("* hot *  ");
   digitalWrite(fan, HIGH);
   lcd.setCursor(15, 0);
 lcd.print("F");}
 else
   {//lcd.setCursor(0, 0);
  // lcd.print("  Just Right       ");
   digitalWrite(fan, LOW);
   lcd.setCursor(15, 0);
 lcd.print("_");
 }
 {
   if(t<=23)
   
   {//lcd.setCursor(0, 0);
   //lcd.print("It's Freezing");}
   digitalWrite(fan, LOW);}

 }

holmes4

You must make use of the auto format option on the IDE. It makes code so much more readable. (And helps keep PaulS at bay).

Mark

Hackdub

OK try again... still only reads in 1 deg c increments 

Code: [Select]
void loop()
{

  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("  %   ");
    Serial.print("Temp: ");
    Serial.print(t);
    Serial.println("C");
  }


  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(8, 1);
  lcd.print("H:");
  lcd.print(h);
  lcd.print("%");
  //delay(2000);
  lcd.setCursor(0, 1);
  lcd.print("T:");
  lcd.print(t);
  //lcd.print("C");
  //delay(2000);


  if(t>=27)

  {
    digitalWrite(fan, HIGH);
    lcd.setCursor(15, 0);
    lcd.print("F");
  }

  if(t<=25)

  {
    digitalWrite(fan, LOW);
    lcd.setCursor(15, 0);
    lcd.print("_");
  }

Riva

Did you set the DHT type in the library as stated in the Adafruit tutorial you linked to and what readout do you get if you use the example sketch included in the Adafruit library download?
http://forum.arduino.cc/index.php?action=unread;boards=5,67,10,11,66,12,15,17,21,22,23,24,25,29;ALL

Hackdub

yes.. set as dht 11

and when using example just get it as 1 degress c increments.

i think there example  shown on website , is using the dht22... not sure if that matters.

ive looked at the library files and cant see if thats the issue.

wildbill

Quote
ive looked at the library files and cant see if thats the issue.

It is.

Code: [Select]
   
case DHT11:
      f = data[2];


f is the float temp read, but the data array is declared as uint8_t, so it will always be a whole number.

Riva

Using Google translate on the datasheet and it looks like the DHT-11 is scaled to 1 degree values.
Code: [Select]
Parameter Condition Min Typ Max Units
Temperature          1   1   1  C
Resolution           8   8   8  Bit
Repeatability of ± 1 C
Accuracy of ± 1 ± 2 C
http://forum.arduino.cc/index.php?action=unread;boards=5,67,10,11,66,12,15,17,21,22,23,24,25,29;ALL

Hackdub

So looks like I'm stuck with 1 deg c  unless I change to dht22?


thanks for the help so far BTW

holmes4


Go Up