Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить

Датчик температуры и влажности SHTC3

Сб фев 12, 2022 23:43:05

Не нашел темы про датчик температуры и влажности SHTC3. Может кому пригодится функция активации и чтения влажности и температуры. Все читается при условии исправности датчика. Использовал программный I2C на частоту 200 кгц.

PINB.0 SCL
PINB.1 SDA
// Глобальные переменные
float RH;
float T;
unsigned char block[6];

// SHTC3 CRC Проверка
unsigned char SHTC3_CRC_CHECK(unsigned int DAT, unsigned char CRC_DAT)
{
unsigned char i,t,temp;
unsigned char CRC_BYTE;
CRC_BYTE=0xFF;
temp=(DAT>>8)&0xFF;
for(t=0;t<2;t++)
{
CRC_BYTE^=temp;
for(i=0;i<8;i++)
{
if(CRC_BYTE&0x80)
{
CRC_BYTE<<=1;
CRC_BYTE^=0x31;
}
else
{
CRC_BYTE<<=1;
}
}
if(t==0)
{
temp=DAT&0xFF;
}
}
if(CRC_BYTE==CRC_DAT)
{
temp=1;
}
else
{
temp=0;
}
return temp;
}

// чтение данных
void i2c_read_block(unsigned char i)
{
unsigned char a;
for(a=0;a<i;a++)
{
block[a]=i2c_read(1);
}
}
// Пробуждение, преобразование, чтение данных, сон
void SHTC_read(void)
{
unsigned char tmp;
unsigned int T_temp,RH_temp,CRC_T_temp,CRC_RH_temp;

i2c_start();
i2c_write(0xE0); // Адрес микросхемы и устанавливаем запись
i2c_write(0x35); // Старший байт пробуждения
i2c_write(0x17); // младший байт пробуждения
i2c_stop(); // stop

delay_us(300); // пауза на пробуждение
i2c_start(); // отсылка стартовой последовательности (делаем restart)
i2c_write(0xE0); // Адрес микросхемы и устанавливаем запись
i2c_write(0x5C); // Старший байт начала преобразования (0x7C если читать сначала температуру, а потом влажность
i2c_write(0x24); // младший байт начала преобразования (0xA2
i2c_stop();

tmp=DDRB; // переводим В0 и В1 (предварительно сохраняя) в режим входов, т.к. аппаратный I2C держит на В0 и В1 (SCL и SDA)
DDRB|=0b11111100; // высокий уровень, а SHTC3 на шине SCL будет держать "0" до конца преобразования
while(PINB.0==0); // ждем пока SCL=0
DDRB=tmp; // восстанавливаем DDRB

i2c_start();
i2c_write(0xE1); // Адрес микросхемы и устанавливаем чтение
i2c_read_block(6); // функция чтения влажности и температуры
i2c_stop();

i2c_start(); // отсылка стартовой последовательности
i2c_write(0xE0); // Адрес микросхемы и устанавливаем запись
i2c_write(0xB0); // старший байт команды SLEEP
i2c_write(0x98); // младший байт
i2c_stop(); // stop

RH_temp=block[0]; // читаем старший байт влажности из буфера
RH_temp=RH_temp<<8; // сдвиг на 8 разрядов влево
RH_temp|=block[1]; // читаем младший байт
CRC_RH_temp=block[2]; //читаем CRC

T_temp=block[3]; // читаем старший байт температуры из буфера
T_temp=T_temp<<8; // сдвиг на 8 разрядов влево
T_temp|=block[4]; // читаем младший байт
CRC_T_temp=block[5]; //читаем CRC
// проверить данные
if(SHTC3_CRC_CHECK(RH_temp,CRC_RH_temp))
{
RH=(float)(RH_temp)*100/65536; // Расчитать влажность
}
if(SHTC3_CRC_CHECK(T_temp,CRC_T_temp))
{
T=(float)(T_temp)*175/65536-45; // Рассчитать температуру
}
}

Может что упустил, или что не понятно-отвечу
Ответить