GY-63_MS5611/libraries/tinySHT2x/tinySHT2x.cpp
2023-12-05 16:14:45 +01:00

149 lines
2.4 KiB
C++

//
// FILE: tinySHT2x.cpp
// AUTHOR: Rob Tillaart, Viktor Balint
// VERSION: 0.2.0
// DATE: 2021-09-27
// PURPOSE: Arduino library for the SHT2x temperature and humidity sensor optimized for AVR tiny
// URL: https://github.com/RobTillaart/tinySHT2x
#include "tinySHT2x.h"
#define SHT2x_GET_TEMPERATURE_NO_HOLD 0xF3
#define SHT2x_GET_HUMIDITY_NO_HOLD 0xF5
#define SHT2x_SOFT_RESET 0xFE
#define SHT2x_ADDRESS 0x40
tinySHT2x::tinySHT2x(TwoWire *wire)
{
_wire = wire;
}
bool tinySHT2x::begin()
{
return isConnected();
}
bool tinySHT2x::isConnected()
{
_wire->beginTransmission(SHT2x_ADDRESS);
return (_wire->endTransmission() == 0);
}
bool tinySHT2x::reset()
{
return writeCmd(SHT2x_SOFT_RESET);
}
///////////////////////////////////
//
// ASYNC INTERFACE
//
void tinySHT2x::requestTemperature()
{
writeCmd(SHT2x_GET_TEMPERATURE_NO_HOLD);
}
float tinySHT2x::readTemperature()
{
uint8_t buffer[3];
uint16_t raw;
if (readBytes(3, (uint8_t*) &buffer[0], 90) == false)
{
return TINY_SHT2x_NO_VALUE;
}
raw = buffer[0] << 8;
raw += buffer[1];
raw &= 0xFFFC;
return -46.85 + (175.72 / 65536.0) * raw;
}
void tinySHT2x::requestHumidity()
{
writeCmd(SHT2x_GET_HUMIDITY_NO_HOLD);
}
float tinySHT2x::readHumidity()
{
uint8_t buffer[3];
uint16_t raw;
if (readBytes(3, (uint8_t*) &buffer[0], 30) == false)
{
return TINY_SHT2x_NO_VALUE;
}
raw = buffer[0] << 8;
raw += buffer[1];
raw &= 0xFFFC;
return -6.0 + (125.0 / 65536.0) * raw;
}
///////////////////////////////////
//
// SYNC INTERFACE
//
float tinySHT2x::getTemperature(uint8_t del)
{
requestTemperature();
delay(del);
return readTemperature();
}
float tinySHT2x::getHumidity(uint8_t del)
{
requestHumidity();
delay(del);
return readHumidity();
}
//////////////////////////////////////////////////////////
//
// PRIVATE
//
bool tinySHT2x::writeCmd(uint8_t cmd)
{
_wire->beginTransmission(SHT2x_ADDRESS);
_wire->write(cmd);
return (_wire->endTransmission() == 0);
}
bool tinySHT2x::readBytes(uint8_t n, uint8_t * val, uint8_t maxDuration)
{
_wire->requestFrom((uint8_t)SHT2x_ADDRESS, (uint8_t) n);
uint32_t start = millis();
while (_wire->available() < n)
{
if (millis() - start > maxDuration)
{
return false;
}
yield();
}
for (uint8_t i = 0; i < n; i++)
{
val[i] = _wire->read();
}
return true;
}
// -- END OF FILE --