GY-63_MS5611/libraries/DHT2pin/dht2pin.cpp
2023-01-29 20:16:17 +01:00

178 lines
3.3 KiB
C++

//
// FILE: DHT2pin.cpp
// AUTHOR: Rob Tillaart
// VERSION: 0.2.0
// PURPOSE: Experimental DHT _temperature & _humidiy Sensor library for Arduino
// URL: https://github.com/RobTillaart/DHT2pin
// http://arduino.cc/playground/Main/DHTLib
#include "DHT2pin.h"
/////////////////////////////////////////////////////
//
// PUBLIC
//
DHT2pin::DHT2pin(uint8_t rpin, uint8_t wpin)
{
_rpin = rpin;
_wpin = wpin;
_temperature = 0;
_humidity = 0;
};
void DHT2pin::begin()
{
pinMode(_rpin, INPUT);
pinMode(_wpin, OUTPUT);
}
// return values:
// DHTLIB_OK
// DHTLIB_ERROR_CHECKSUM
// DHTLIB_ERROR_TIMEOUT
int DHT2pin::read11()
{
// READ VALUES
int rv = _readSensor(DHTLIB_DHT11_WAKEUP);
if (rv != DHTLIB_OK)
{
_humidity = DHTLIB_INVALID_VALUE;
_temperature = DHTLIB_INVALID_VALUE;
return rv;
}
// CONVERT AND STORE
_humidity = _bits[0]; // _bits[1] == 0;
_temperature = _bits[2]; // _bits[3] == 0;
// TEST CHECKSUM
// _bits[1] && _bits[3] both 0
uint8_t sum = _bits[0] + _bits[2];
if (_bits[4] != sum) return DHTLIB_ERROR_CHECKSUM;
return DHTLIB_OK;
}
// return values:
// DHTLIB_OK
// DHTLIB_ERROR_CHECKSUM
// DHTLIB_ERROR_TIMEOUT
int DHT2pin::read()
{
// READ VALUES
int rv = _readSensor(DHTLIB_DHT_WAKEUP);
if (rv != DHTLIB_OK)
{
_humidity = DHTLIB_INVALID_VALUE;
_temperature = DHTLIB_INVALID_VALUE;
return rv; // propagate error value
}
// CONVERT AND STORE
_humidity = word(_bits[0], _bits[1]) * 0.1;
_temperature = word(_bits[2] & 0x7F, _bits[3]) * 0.1;
if (_bits[2] & 0x80) // negative _temperature
{
_temperature = -_temperature;
}
// TEST CHECKSUM
uint8_t sum = _bits[0] + _bits[1] + _bits[2] + _bits[3];
if (_bits[4] != sum)
{
return DHTLIB_ERROR_CHECKSUM;
}
return DHTLIB_OK;
}
float DHT2pin::temperature()
{
return _temperature;
}
float DHT2pin::humidity()
{
return _humidity;
}
/////////////////////////////////////////////////////
//
// PRIVATE
//
// return values:
// DHTLIB_OK
// DHTLIB_ERROR_TIMEOUT
int DHT2pin::_readSensor(uint8_t wakeupDelay)
{
// INIT BUFFERVAR TO RECEIVE DATA
uint8_t mask = 128;
uint8_t idx = 0;
// EMPTY BUFFER
for (uint8_t i = 0; i < 5; i++) _bits[i] = 0;
// REQUEST SAMPLE
digitalWrite(_wpin, LOW);
delay(wakeupDelay);
digitalWrite(_wpin, HIGH);
delayMicroseconds(40);
// GET ACKNOWLEDGE or TIMEOUT
uint16_t loopCnt = DHTLIB_TIMEOUT;
while(digitalRead(_rpin) == LOW)
{
if (--loopCnt == 0) return DHTLIB_ERROR_TIMEOUT;
}
loopCnt = DHTLIB_TIMEOUT;
while(digitalRead(_rpin) == HIGH)
{
if (--loopCnt == 0) return DHTLIB_ERROR_TIMEOUT;
}
// READ THE OUTPUT - 40 _bits => 5 BYTES
for (uint8_t i = 40; i != 0; i--)
{
loopCnt = DHTLIB_TIMEOUT;
while(digitalRead(_rpin) == LOW)
{
if (--loopCnt == 0) return DHTLIB_ERROR_TIMEOUT;
}
uint32_t t = micros();
loopCnt = DHTLIB_TIMEOUT;
while(digitalRead(_rpin) == HIGH)
{
if (--loopCnt == 0) return DHTLIB_ERROR_TIMEOUT;
}
if ((micros() - t) > 40)
{
_bits[idx] |= mask;
}
mask >>= 1;
if (mask == 0) // next byte?
{
mask = 128;
idx++;
}
}
digitalWrite(_wpin, HIGH);
return DHTLIB_OK;
}
// -- END OF FILE --