Files
arduino-libs/arduino-cli/libraries/AHT10_Soft/Thinary_AHT10_Soft.cpp
2024-07-20 22:09:06 +08:00

165 lines
4.9 KiB
C++

/*
AHT10_Soft - A Humidity Library for Arduino.
Supported Sensor modules:
AHT10_Soft-Breakout Module - https://www.aliexpress.com/item/33002710848.html
Created by Thinary Eletronic at Modern Device on April 2019.
* This file is part of Thinary_AHT10_Soft.
*
* Thinary_AHT10_Soft is free software: you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation, either version 3 of
* the License, or(at your option) any later version.
*
* Thinary_AHT10_Soft 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with Thinary_AHT10_Soft. If not, see
* <http://www.gnu.org/licenses/>.
*/
#include <stdint.h>
#include <math.h>
#include <Arduino.h>
#include <SoftwareWire.h>
#include "Thinary_AHT10_Soft.h"
// Specify the constants for water vapor and barometric pressure.
#define WATER_VAPOR 17.62f
#define BAROMETRIC_PRESSURE 243.5f
Sensor_CMD eSensorCalibrateCmd[3] = {0xE1, 0x08, 0x00};
Sensor_CMD eSensorNormalCmd[3] = {0xA8, 0x00, 0x00};
Sensor_CMD eSensorMeasureCmd[3] = {0xAC, 0x33, 0x00};
Sensor_CMD eSensorResetCmd = 0xBA;
boolean GetRHumidityCmd = true;
boolean GetTempCmd = false;
/******************************************************************************
* Global Functions
******************************************************************************/
AHT10_SoftClass::AHT10_SoftClass() {
}
bool AHT10_SoftClass::begin(unsigned char _AHT10_Soft_address, SoftwareWire *theWire)
{
_wire = theWire;
AHT10_Soft_address = _AHT10_Soft_address;
//Serial.begin(9600);
//Serial.println("\x54\x68\x69\x6E\x61\x72\x79\x20\x45\x6C\x65\x74\x72\x6F\x6E\x69\x63\x20\x41\x48\x54\x31\x30\x20\x4D\x6F\x64\x75\x6C\x65\x2E");
_wire->begin();
_wire->beginTransmission(AHT10_Soft_address);
_wire->write(eSensorCalibrateCmd, 3);
_wire->endTransmission();
//Serial.println("https://thinaryelectronic.aliexpress.com");
delay(500);
if((readStatus()&0x68) == 0x08)
return true;
else
{
return false;
}
}
/**********************************************************
* GetHumidity
* Gets the current humidity from the sensor.
*
* @return float - The relative humidity in %RH
**********************************************************/
float AHT10_SoftClass::GetHumidity(void)
{
float value = readSensor(GetRHumidityCmd);
if (value == 0) {
return 0; // Some unrealistic value
}
return value * 100 / 1048576;
}
/**********************************************************
* GetTemperature
* Gets the current temperature from the sensor.
*
* @return float - The temperature in Deg C
**********************************************************/
float AHT10_SoftClass::GetTemperature(void)
{
float value = readSensor(GetTempCmd);
return ((200 * value) / 1048576) - 50;
}
/**********************************************************
* GetDewPoint
* Gets the current dew point based on the current humidity and temperature
*
* @return float - The dew point in Deg C
**********************************************************/
float AHT10_SoftClass::GetDewPoint(void)
{
float humidity = GetHumidity();
float temperature = GetTemperature();
// Calculate the intermediate value 'gamma'
float gamma = log(humidity / 100) + WATER_VAPOR * temperature / (BAROMETRIC_PRESSURE + temperature);
// Calculate dew point in Celsius
float dewPoint = BAROMETRIC_PRESSURE * gamma / (WATER_VAPOR - gamma);
return dewPoint;
}
/******************************************************************************
* Private Functions
******************************************************************************/
unsigned long AHT10_SoftClass::readSensor(boolean GetDataCmd)
{
unsigned long result, temp[6];
_wire->beginTransmission(AHT10_Soft_address);
_wire->write(eSensorMeasureCmd, 3);
_wire->endTransmission();
delay(100);
_wire->requestFrom(AHT10_Soft_address, 6);
for(unsigned char i = 0; _wire->available() > 0; i++)
{
temp[i] = _wire->read();
}
if(GetDataCmd)
{
result = ((temp[1] << 16) | (temp[2] << 8) | temp[3]) >> 4;
}
else
{
result = ((temp[3] & 0x0F) << 16) | (temp[4] << 8) | temp[5];
}
return result;
}
unsigned char AHT10_SoftClass::readStatus(void)
{
unsigned char result = 0;
_wire->requestFrom(AHT10_Soft_address, 1);
result = _wire->read();
return result;
}
void AHT10_SoftClass::Reset(void)
{
_wire->beginTransmission(AHT10_Soft_address);
_wire->write(eSensorResetCmd);
_wire->endTransmission();
delay(20);
}