diff -r 9c7119ac0455 -r 89dd2b691701 lib/dht11.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/dht11.c Thu May 08 22:36:51 2014 +0200 @@ -0,0 +1,167 @@ +/***************************************************************************** + * Copyright (C) 2008-2014 + * + * Michiel Broek + * + * This file is part of the mbsePi-apps + * + * Parts original by CurlyMo from the pilight project. + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * mbsePi-apps is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with EC-65K; see the file COPYING. If not, write to the Free + * Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + *****************************************************************************/ + +#include "../config.h" +#include "mbselib.h" + +#ifdef HAVE_WIRINGPI_H + +#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"); + } + dht11_temperature = -1; + dht11_humidity = -1; + dht11_valid = false; + } else { + + /* + * 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; +} + + +#endif +