diff -r 8b5e8f1e172d -r a03b6dac5398 dht11/dht11.c --- a/dht11/dht11.c Sun May 25 16:39:54 2014 +0200 +++ b/dht11/dht11.c Sun May 25 22:06:56 2014 +0200 @@ -20,14 +20,148 @@ * Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *****************************************************************************/ -#include "../lib/mbselib.h" #include "dht11.h" #ifdef HAVE_WIRINGPI_H -extern int dht11_valid; -extern int dht11_temperature; -extern int dht11_humidity; +#define MAXTIMINGS 100 + +int dht11_pin = -1; +int dht11_temperature = -1; +int dht11_humidity = -1; +int dht11_valid = false; +int dht11_t_offset = 0; +int dht11_h_offset = 0; + + + +static uint8_t sizecvt(const int read_value) { + /* + * digitalRead() and friends from wiringpi are defined as returning a value + * < 256. However, they are returned as int() types. This is a safety function + */ + if (read_value > 255 || read_value < 0) { + syslog(LOG_NOTICE, "invalid data from wiringPi library"); + } + + return (uint8_t)read_value; +} + + + +/* + * DHT11 sensor read. This should be used in a thread loop. + */ +void dht11Read(void) { + int tries = 5; + unsigned short got_correct_data = 0; + + if (dht11_pin == -1) + return; + + while (tries && !got_correct_data) { + uint8_t laststate = HIGH; + uint8_t counter = 0; + uint8_t j = 0, i = 0; + int dht11_dat[5] = {0,0,0,0,0}; + + /* + * Select output mode to send the start signal. + */ + pinMode(dht11_pin, OUTPUT); + digitalWrite(dht11_pin, HIGH); + usleep(1000); + + /* + * Low for at least 18 milliseconds + */ + digitalWrite(dht11_pin, LOW); + usleep(20000); + digitalWrite(dht11_pin, HIGH); + pinMode(dht11_pin, INPUT); + + /* + * Detect change and read data + */ + for (i=0; i= 4) && (i%2 == 0)) { + + // shove each bit into the storage bytes + dht11_dat[(int)((double)j/8)] <<= 1; + if (counter > 16) + dht11_dat[(int)((double)j/8)] |= 1; + j++; + } + } + + /* + * If there is no sensor, j = 0 + */ + if ((counter == 255) && (j == 0)) { + if (dht11_temperature != -1) { + syslog(LOG_NOTICE, "dht11 sensor disappeared"); + } else { + syslog(LOG_NOTICE, "dht11 sensor not present"); + } + dht11_temperature = -1; + dht11_humidity = -1; + dht11_valid = false; + return; + } + + /* + * check we read 40 bits (8bit x 5 ) + verify checksum in the last byte + * print it out if data is good + */ + if ((j >= 40) && (dht11_dat[4] == ((dht11_dat[0] + dht11_dat[1] + dht11_dat[2] + dht11_dat[3]) & 0xFF))) { + got_correct_data = 1; + + int h = dht11_dat[0] + dht11_dat[1]; + int t = (dht11_dat[2] & 0x7F) + dht11_dat[3]; + t += dht11_t_offset; + h += dht11_h_offset; + + if ((dht11_dat[2] & 0x80) != 0) + t *= -1; + + dht11_temperature = t; + dht11_humidity = h; + dht11_valid = true; + } else { + tries--; + if (tries == 0) + syslog(LOG_INFO, "dht11 data checksum was wrong 5 times"); + usleep(100000); + } + } +} + + + +void dht11Init(int pin, int t_offset, int h_offset) { + dht11_pin = pin; + dht11_t_offset = t_offset; + dht11_h_offset = h_offset; +} + + int main(int argc, char *argv[]) {