Plantilla para crear la libreria DHT para la plataforma FRDM
Diff: DHT22.cpp
- Revision:
- 0:547e68daeb1b
- Child:
- 1:5b20ff4fd227
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DHT22.cpp Tue Jun 21 03:44:05 2011 +0000 @@ -0,0 +1,176 @@ +/* + DHT22.cpp - DHT22 sensor library + Developed by Ben Adams = 2011 + + This library is free software; you can redistribute it and / or + modify it under the terms of the GNU Leser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRENTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PATRICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + + Humidity and Temperature Sensor DHT22 info found at + http://www.sparkfun.com/products/10167 + + Version 0.4: 24-Jan-2011 by Ben Adams + Added return code constants to keywords.txt + Return DHT_ERROR_CHECKSUM on check sum mismatch + + Version 0.3: 17-Jan-2011 by Ben Adams + This version reads data + Needs check sum code added at the end of readData + + Version 0.2: 16-Jan-2011 by Ben Adams + Changed coding style to match other Arduino Libraries. + This version will not read data either! + +*/ + +#include "DHT22.h" + +// This should be 40, but the sensor is adding an extra bit at the start +#define DHT22_DATA_BIT_COUNT 41 + +DHT22::DHT22(PinName Data) { + _data = Data; // Set Data Pin + DigitalInOut VCC(_vcc); + _lastReadTime = time(NULL)-2; + _lastHumidity = 0; + _lastTemperature = DHT22_ERROR_VALUE; +} + +DHT22::~DHT22() { +} + +DHT22_ERROR DHT22::readData() { + int i, retryCount; + int currentTemperature; + int currentHumidity; + unsigned int checkSum, csPart1, csPart2, csPart3, csPart4; + unsigned int bitTimes[DHT22_DATA_BIT_COUNT]; + time_t currentTime; + + DigitalInOut DATA(_data); + + currentHumidity = 0; + currentTemperature = 0; + checkSum = 0; + currentTime = time(NULL); + for (i = 0; i < DHT22_DATA_BIT_COUNT; i++) { + bitTimes[i] = 0; + } + if (currentTime - _lastReadTime < 2) { + // Caller needs to wait 2 seconds between each call to read Data + return DHT_ERROR_TOOQUICK; + } + _lastReadTime = currentTime; + retryCount = 0; + // Pin needs to start HIGH, wait unit it is HIGH with a timeout + do { + if (retryCount > 125) { + return DHT_BUS_HUNG; + } + retryCount ++; + wait_us(2); + } while (DATA==1); + // Send the activate pulse + DATA = 0; // MCU send out start signal to DHT22 + wait_us(1100); // 1.1 ms + // Find the start of the ACK Pulse + retryCount = 0; + do { + if (retryCount > 25) {// (Spec is 20 to 40 us, 25*2 == 50us + return DHT_ERROR_NOT_PRESENT; + } + retryCount ++; + wait_us(2); + } while (DATA==1); + // Find the end of the ACK Pulse + retryCount = 0; + do { + if (retryCount > 50) {// (Spec is 80 us, 50 * 2 == 100us) + return DHT_ERROR_ACK_TOO_LONG; + } + retryCount++; + wait_us(2); + } while (DATA==0); + // Read the 40 bit data stream + for (i=0; i < DHT22_DATA_BIT_COUNT; i++) { + retryCount = 0; + do { + if (retryCount > 35) { // spec is 50 u, 35*2 = 70 us + return DHT_ERROR_SYNC_TIMEOUT; + } + retryCount ++; + wait_us(2); + } while (DATA==1); + // Measure the width of the data pulse + retryCount = 0; + do { + if (retryCount > 50) { // spec is 80us, 50*2 == 100us + return DHT_ERROR_DATA_TIMEOUT; + } + retryCount++; + wait_us(2); + } while (DATA==0); + bitTimes[i] = retryCount; + } + + // Now bitTimes have the number of retries (us *2) + // that were needed to find the end of each data bit + // Spec: 0 is 26 to 28 us + // Spec: 1 is 70 us + // bitTimes[x] <= 11 is a 0 + // bitTimes[x] > 11 is a 1 + // Note: the bits are offset by one from the data sheet, not sure why + for (i=0; i<16; i++) { + if (bitTimes[i+1] > 11) { + currentHumidity |= ( 1 << (15-i)); + } + } + + for (i=0; i<16; i ++) { + if (bitTimes[i+17] > 11) { + currentTemperature |= (1 <<(15-i)); + } + } + + for (i=0; i<8; i++) { + if (bitTimes[i+33]>11) { + checkSum |= (1 << (7-i)); + } + } + _lastHumidity = (float(currentHumidity & 0x7FFF) / 10.0); + if (currentTemperature &= 0x8000) { + currentTemperature &= 0x7FFF; + _lastTemperature = (float(currentTemperature) / 10.0) * -1.0; + } else { + _lastTemperature = float(currentTemperature) / 10.0; + } + + // Calculate Check Sum + csPart1 = currentHumidity >> 8; + csPart2 = currentHumidity & 0xFF; + csPart3 = currentTemperature >> 8; + csPart4 = currentTemperature & 0xFF; + if (checkSum == ((csPart1 + csPart2 + csPart3 + csPart4) & 0xFF)) { + return DHT_ERROR_NONE; + } + return DHT_ERROR_CHECKSUM; +} + +float DHT22::getTemperatureC() { + return _lastTemperature; +} + +float DHT22::getHumidity() { + return _lastHumidity; +} \ No newline at end of file