Не нашел темы про датчик температуры и влажности 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; // Рассчитать температуру } }
Может что упустил, или что не понятно-отвечу
|