Skip to content
Snippets Groups Projects
Commit 0f37a809 authored by Aleksandra Dimitrievska's avatar Aleksandra Dimitrievska
Browse files

implementing HYT221 sensor

parent 0d9f6070
No related branches found
No related tags found
No related merge requests found
...@@ -80,3 +80,11 @@ if ( ${ENABLE_FTDI} ) ...@@ -80,3 +80,11 @@ if ( ${ENABLE_FTDI} )
target_sources(tempsensor_monitor_example PRIVATE tempsensor_monitor_example.cpp) target_sources(tempsensor_monitor_example PRIVATE tempsensor_monitor_example.cpp)
target_link_libraries(tempsensor_monitor_example PRIVATE DevCom) target_link_libraries(tempsensor_monitor_example PRIVATE DevCom)
endif() endif()
# hyt221
if ( ${ENABLE_FTDI} )
add_executable(hyt221_example)
target_sources(hyt221_example PRIVATE hyt221_example.cpp)
target_link_libraries(hyt221_example PRIVATE DevCom Utils)
endif()
#include <iostream>
#include <memory>
#include <iomanip>
#include <unistd.h>
#include <math.h>
#ifdef ENABLE_FTDI
#include "FT232H.h"
#include "I2CFTDICom.h"
#endif
#include "Logger.h"
#include "HYT221.h"
#include "I2CDevComuino.h"
#include "I2CDevCom.h"
int main(int argc, char*argv[])
{
#ifndef ENABLE_FTDI
logger(logERROR) << "FTDI support is not enabled.";
return 1;
#else
//std::shared_ptr<MPSSEChip> ftdi=std::make_shared<FT232H>(MPSSEChip::Protocol::I2C, MPSSEChip::Speed::ONE_HUNDRED_KHZ, MPSSEChip::Endianness::MSBFirst,"","ftink02");
//std::shared_ptr<I2CCom> i2c=std::make_shared<I2CFTDICom>(ftdi, 0x44);
// this is our I2C bus primary -- on the FT232H device -- that will control communication
std::shared_ptr<FT232H> ftdi;
try
{
ftdi = std::make_shared<FT232H>(MPSSEChip::Protocol::I2C
,MPSSEChip::Speed::FOUR_HUNDRED_KHZ
,MPSSEChip::Endianness::MSBFirst, "","ftink02");
logger(logINFO) << "Initialized MPSSE: " << ftdi->to_string();
}
catch(std::exception& e)
{
logger(logERROR) << "Failed to initialized MPSSE: " << e.what();
return 1;
}
std::shared_ptr<I2CCom> i2c=std::make_shared<I2CFTDICom>(ftdi, 0x28);
//#else
// std::shared_ptr<TextSerialCom> TC(new TextSerialCom("/dev/ttyACM0", B9600));
// TC->setTermination("\r\n");
// TC->init();
// std::shared_ptr<I2CCom> i2c(new I2CDevComuino(0x44, TC));
//#endif // FTDI
std::shared_ptr<ClimateSensor> sensor=std::make_shared<HYT221>(i2c);
for(uint32_t i=0;i<10000;i++)
{
sensor->read();
std::cout << sensor->temperature() << "\t" << sensor->humidity() << std::endl;
}
return 0;
#endif // FTDI
}
...@@ -4,8 +4,10 @@ ...@@ -4,8 +4,10 @@
#include <unistd.h> #include <unistd.h>
#include <math.h> #include <math.h>
#ifdef ENABLE_FTDI
#include "FT232H.h" #include "FT232H.h"
#include "I2CFTDICom.h" #include "I2CFTDICom.h"
#endif
#include "Logger.h" #include "Logger.h"
#include "SHT85.h" #include "SHT85.h"
...@@ -14,16 +16,37 @@ ...@@ -14,16 +16,37 @@
int main(int argc, char*argv[]) int main(int argc, char*argv[])
{ {
#ifdef FTDI #ifndef ENABLE_FTDI
std::shared_ptr<MPSSEChip> ftdi=std::make_shared<FT232H>(MPSSEChip::Protocol::I2C, MPSSEChip::Speed::ONE_HUNDRED_KHZ, MPSSEChip::Endianness::MSBFirst); logger(logERROR) << "FTDI support is not enabled.";
std::shared_ptr<I2CCom> i2c=std::make_shared<I2CFTDICom>(ftdi, 0x44); return 1;
#else #else
std::shared_ptr<TextSerialCom> TC(new TextSerialCom("/dev/ttyACM0", B9600)); //std::shared_ptr<MPSSEChip> ftdi=std::make_shared<FT232H>(MPSSEChip::Protocol::I2C, MPSSEChip::Speed::ONE_HUNDRED_KHZ, MPSSEChip::Endianness::MSBFirst,"","ftink02");
TC->setTermination("\r\n"); //std::shared_ptr<I2CCom> i2c=std::make_shared<I2CFTDICom>(ftdi, 0x44);
TC->init();
std::shared_ptr<I2CCom> i2c(new I2CDevComuino(0x44, TC)); // this is our I2C bus primary -- on the FT232H device -- that will control communication
#endif // FTDI std::shared_ptr<FT232H> ftdi;
try
{
ftdi = std::make_shared<FT232H>(MPSSEChip::Protocol::I2C
,MPSSEChip::Speed::ONE_HUNDRED_KHZ
,MPSSEChip::Endianness::MSBFirst);
logger(logINFO) << "Initialized MPSSE: " << ftdi->to_string();
}
catch(std::exception& e)
{
logger(logERROR) << "Failed to initialized MPSSE: " << e.what();
return 1;
}
std::shared_ptr<I2CCom> i2c=std::make_shared<I2CFTDICom>(ftdi, 0x44);
//#else
// std::shared_ptr<TextSerialCom> TC(new TextSerialCom("/dev/ttyACM0", B9600));
// TC->setTermination("\r\n");
// TC->init();
// std::shared_ptr<I2CCom> i2c(new I2CDevComuino(0x44, TC));
//#endif // FTDI
std::shared_ptr<ClimateSensor> sensor=std::make_shared<SHT85>(i2c); std::shared_ptr<ClimateSensor> sensor=std::make_shared<SHT85>(i2c);
...@@ -34,5 +57,7 @@ int main(int argc, char*argv[]) ...@@ -34,5 +57,7 @@ int main(int argc, char*argv[])
} }
return 0; return 0;
#endif // FTDI
} }
...@@ -30,6 +30,7 @@ target_sources(DevCom ...@@ -30,6 +30,7 @@ target_sources(DevCom
HIH6130.cpp HIH6130.cpp
HIH4000.cpp HIH4000.cpp
HTS221.cpp HTS221.cpp
HYT221.cpp
SHT85.cpp SHT85.cpp
Si7021.cpp Si7021.cpp
NTCSensor.cpp NTCSensor.cpp
......
#include "HYT221.h"
#include "DeviceComRegistry.h"
REGISTER_DEVCOM(HYT221, ClimateSensor)
#include <unistd.h>
#include <math.h>
#include "NotSupportedException.h"
#include "ChecksumException.h"
HYT221::HYT221(std::shared_ptr<I2CCom> i2c)
: m_i2c(i2c)
{ }
HYT221::~HYT221()
{ }
void HYT221::init()
{ }
void HYT221::reset()
{ }
void HYT221::read()
{
m_i2c->write_reg16(0x28);
usleep(1000e3);
std::vector<uint8_t> data(4);
m_i2c->read_block(data);
uint16_t hdata=((data[0])<<8)|data[1];
uint8_t hcrc=calcCRC(data[0],data[1],0x3FFF);
if(hcrc)
throw ChecksumException(hcrc);
data[3]=(data[3] >> 2);//mask 2 least significant bits
uint16_t tdata=((data[2])<<6)|data[3];
uint8_t tcrc=calcCRC(data[2],data[3],0x3FFF);
if(tcrc)
throw ChecksumException(tcrc);
// Parse the data
// 0x0 complies with 0 % RH
// 0x3FFF complies with 100 % RH
// RHraw = 0x0000 to 0x3FFF (Hex) or 0 to 16383 (Dec)
hdata=(hdata &= 0x3FFF);
m_humidity=100*((float)hdata)/(pow(2,14)-1.);
m_temperature=-40+165*((float)tdata)/(pow(2,14)-1.);
}
uint HYT221::status() const
{ return m_status; }
float HYT221::temperature() const
{ return m_temperature; }
float HYT221::humidity() const
{ return m_humidity; }
float HYT221::pressure() const
{ throw NotSupportedException("HYT221 does not have a pressure sensor"); return 0; }
uint8_t HYT221::calcCRC(uint8_t byte0,uint8_t byte1,uint8_t crc) const
{
static const uint8_t poly=0x31;
uint16_t reg=0xFF^byte0;
uint8_t bytes[]={byte1, crc};
for(uint32_t b=0;b<2;b++)
{
for(uint32_t bit=0;bit<8;bit++)
{
// shift the bit in
reg=(reg<<1)|(((bytes[b]>>(7-bit)))&1);
if(reg&0x100)
reg^=poly;
}
}
return (reg&0xFF);
}
#ifndef HYT221_H
#define HYT221_H
#include "ClimateSensor.h"
#include "I2CCom.h"
#include <memory>
/**
* The HYT221 climate sensor.
* [Datasheet](https://www.ist-ag.com/sites/default/files/downloads/hyt221.pdf)
*/
class HYT221 : public ClimateSensor
{
public:
HYT221(std::shared_ptr<I2CCom> i2c);
virtual ~HYT221();
virtual void init();
virtual void reset();
virtual void read();
virtual unsigned status() const;
virtual float temperature() const;
virtual float humidity() const;
virtual float pressure() const;
private:
std::shared_ptr<I2CCom> m_i2c;
int m_status;
float m_temperature;
float m_humidity;
uint8_t calcCRC(uint8_t byte0,uint8_t byte1,uint8_t crc) const;
};
#endif // HYT221_H
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment