Hello, I'm working with DuinOS and the DHT11 library has some problems working with it 'cause the timing. 'cause of this i had improved the library to use ineterrupts on pins and liberate the cpu meanwhile. I have proved it in a Mega2560 with arduino 1.03 and is working bery well.
Hi can someone help please with newb question. Trying to read temp/rh with the dht11. In the code samples and examples I came across a VERY cool code example that not only reads temp/rh BUT reads dewpoint calcs. Which is very useful for me. Only problem is that being a NEWB Im sure that Im doing something wrong in loading the code to the Arduino.
Hello, your question isn't related to this specific lib. You are using example code and source files from the original DHT11 lib. THIS lib that I published here is another version, that works different (interrupt driven way) and has his own example codes. If you want you can try it downloading it from the link to github in the original post of this thread.
I'm talking on the other thread. If the modification is working on a dht22 sensor, I'll analyze how to mix both sensors in the same library, other way we have to make 2 libraries. Other thing is that I dont have a dht22 sensor, so any modification must be proved by others (or someone can gift me one :D)
That's right. I'll make it for DHT22 to, but give me some time to do it, I'm working and don't have to much time to my personal projects, so please be patient. I'm goig to continue this conversation on the other thread
I'm not pretty sure if it's working with two sensors, but I have two, and when I was developing it I used the 2. If I'm not wrong it should work with two sensors. The only thing is that you have to use 2 different pins that has interrupts
In a quick review, I can say that looks like the interrupt is not being called. What method are you calling to get the -7 value, can you share the code.
A small example that is based on the example that comes with the lib:
/*
Board int.0 int.1 int.2 int.3 int.4 int.5
Uno, Ethernet 2 3
Mega2560 2 3 21 20 19 18
Leonardo 3 2 0 1
Due (any pin, more info http://arduino.cc/en/Reference/AttachInterrupt)
*/
#include <idDHT11.h>
int idDHT11pinA = 2; //Digital pin for comunications
int idDHT11intNumberB = 0; //interrupt number (must be the one that use the previus defined pin (see table above)
int idDHT11pinB = 3; //Digital pin for comunications
int idDHT11intNumberB = 1; //interrupt number (must be the one that use the previus defined pin (see table above)
//declaration
void dht11_wrapperA(); // must be declared before the lib initialization
//declaration
void dht11_wrapperB(); // must be declared before the lib initialization
// Lib instantiate
idDHT11 DHT11A(idDHT11pinA,idDHT11intNumberA,dht11_wrapperA);
idDHT11 DHT11B(idDHT11pinB,idDHT11intNumberB,dht11_wrapperB);
// This wrapper is in charge of calling
// mus be defined like this for the lib work
void dht11_wrapperA() {
DHT11A.isrCallback();
}
// This wrapper is in charge of calling
// mus be defined like this for the lib work
void dht11_wrapperB() {
DHT11B.isrCallback();
}
if you test this small example (need to be completed the loop and setup functions), please tell me how it goes. If it works, you can make a pull request to add an example that use 2 sensors on github, so everyone wins. If not, we can review why and analyze if it will be possible and add this functionality to the lib, anyway, everyone wins :).
Sorry for the long wait, i was swamped by another aspect of my project.
Now it's working. The problem was the missing DHT11B.acquire();
Is there any other reason than debugging purpose for this part of code?
while (DHT11A.acquiring())
;
int result = DHT11A.getStatus();
switch (result)
{
case IDDHTLIB_OK:
Serial.println("OK");
break;
case IDDHTLIB_ERROR_CHECKSUM:
Serial.println("Error\n\r\tChecksum error");
break;
case IDDHTLIB_ERROR_ISR_TIMEOUT:
Serial.println("Error\n\r\tISR Time out error");
break;
case IDDHTLIB_ERROR_RESPONSE_TIMEOUT:
Serial.println("Error\n\r\tResponse time out error");
break;
case IDDHTLIB_ERROR_DATA_TIMEOUT:
Serial.println("Error\n\r\tData time out error");
break;
case IDDHTLIB_ERROR_ACQUIRING:
Serial.println("Error\n\r\tAcquiring");
break;
case IDDHTLIB_ERROR_DELTA:
Serial.println("Error\n\r\tDelta time to small");
break;
case IDDHTLIB_ERROR_NOTSTARTED:
Serial.println("Error\n\r\tNot started");
break;
default:
Serial.println("Unknown error");
break;
}
because it work just fine without it, and i didn't figured out how to change it for the second sensor.
Here is the modified code. Sorry for the bad formating
/*
Board int.0 int.1 int.2 int.3 int.4 int.5
Uno, Ethernet 2 3
Mega2560 2 3 21 20 19 18
Leonardo 3 2 0 1
Due (any pin, more info http://arduino.cc/en/Reference/AttachInterrupt)
*/
#include <idDHT11.h>
int idDHT11pinA = 2; //Digital pin for comunications
int idDHT11intNumberA = 0; //interrupt number (must be the one that use the previus defined pin (see table above)
int idDHT11pinB = 3; //Digital pin for comunications
int idDHT11intNumberB = 1; //interrupt number (must be the one that use the previus defined pin (see table above)
//declaration
void dht11_wrapperA(); // must be declared before the lib initialization
//declaration
void dht11_wrapperB(); // must be declared before the lib initialization
// Lib instantiate
idDHT11 DHT11A(idDHT11pinA, idDHT11intNumberA, dht11_wrapperA);
idDHT11 DHT11B(idDHT11pinB, idDHT11intNumberB, dht11_wrapperB);
void setup()
{
Serial.begin(115200);
Serial.println("idDHT11 Example program for two sensors");
Serial.print("LIB version: ");
Serial.println(IDDHT11LIB_VERSION);
Serial.println("---------------");
}
// This wrapper is in charge of calling
// mus be defined like this for the lib work
void dht11_wrapperA() {
DHT11A.isrCallback();
}
// This wrapper is in charge of calling
// mus be defined like this for the lib work
void dht11_wrapperB() {
DHT11B.isrCallback();
}
void loop()
{
Serial.print("\nRetrieving information from sensors: ");
Serial.print("Read sensor: ");
//delay(100);
DHT11B.acquire();
DHT11A.acquire();
while (DHT11A.acquiring())
;
int result = DHT11A.getStatus();
switch (result)
{
case IDDHTLIB_OK:
Serial.println("OK");
break;
case IDDHTLIB_ERROR_CHECKSUM:
Serial.println("Error\n\r\tChecksum error");
break;
case IDDHTLIB_ERROR_ISR_TIMEOUT:
Serial.println("Error\n\r\tISR Time out error");
break;
case IDDHTLIB_ERROR_RESPONSE_TIMEOUT:
Serial.println("Error\n\r\tResponse time out error");
break;
case IDDHTLIB_ERROR_DATA_TIMEOUT:
Serial.println("Error\n\r\tData time out error");
break;
case IDDHTLIB_ERROR_ACQUIRING:
Serial.println("Error\n\r\tAcquiring");
break;
case IDDHTLIB_ERROR_DELTA:
Serial.println("Error\n\r\tDelta time to small");
break;
case IDDHTLIB_ERROR_NOTSTARTED:
Serial.println("Error\n\r\tNot started");
break;
default:
Serial.println("Unknown error");
break;
}
Serial.println("************************************************************");
Serial.println("*********************************Sensor 1*******************");
Serial.println("************************************************************");
Serial.print("Humidity (%): ");
Serial.println(DHT11A.getHumidity(), 2);
Serial.print("Temperature (oC): ");
Serial.println(DHT11A.getCelsius(), 2);
Serial.print("Temperature (oF): ");
Serial.println(DHT11A.getFahrenheit(), 2);
Serial.print("Temperature (K): ");
Serial.println(DHT11A.getKelvin(), 2);
Serial.print("Dew Point (oC): ");
Serial.println(DHT11A.getDewPoint());
Serial.print("Dew Point Slow (oC): ");
Serial.println(DHT11A.getDewPointSlow());
Serial.println("************************************************************");
Serial.println("*********************************Sensor 2*******************");
Serial.println("************************************************************");
Serial.print("Humidity (%): ");
Serial.println(DHT11B.getHumidity(), 2);
Serial.print("Temperature (oC): ");
Serial.println(DHT11B.getCelsius(), 2);
Serial.print("Temperature (oF): ");
Serial.println(DHT11B.getFahrenheit(), 2);
Serial.print("Temperature (K): ");
Serial.println(DHT11B.getKelvin(), 2);
Serial.print("Dew Point (oC): ");
Serial.println(DHT11B.getDewPoint());
Serial.print("Dew Point Slow (oC): ");
Serial.println(DHT11B.getDewPointSlow());
delay(2000);
}
I've added an example that use 2 sensor, please try it at
One problem with your example is that it doesn't check if the B sensor end acquiring. so maybe sometimes you could get error values.
The part that you said is for debugging, is only to know which error was causing a problem. you can erase it, but you should do something like this to be sure you receive a good measure
....
while (DHT11A.acquiring()) // check if first sensor has ended acquiring
;
int result = DHT11A.getStatus();
if(result != IDDHTLIB_OK)
//HANDLE THE ERROR
......
} else {
// DO WHATEVER YOU WANT with the data of the sensor
......
}
I'm trying to use idDHTLib with a DHT22 on a Pro 5V, using port 3 on the Pro (and therefore interrupt number 1).
But I cannot read any value, everytime I've got a CheckSum error.
Any idea of what I'm doing wrong ?
Regards,
edit : ok my very bad, I do not noticed I had to change the callback method. Sorry !
I would like to make an addition to catch a transmission timeout while recieving a talagram, for example due to a bad connection (dupont wires anyone):