Спойлер
Код: Выделить всё
enum ST_SHT10 {SHT10_START_DELAY,
SHT10_MEAS_T, SHT10_WAIT_T, SHT10_READ_T,
SHT10_MEAS_H, SHT10_WAIT_H, SHT10_READ_H,
SHT10_DATA_1, SHT10_DATA_2, SHT10_END_CONV};
#define SHT10_START_CONV SHT10_MEAS_T
Код: Выделить всё
//--------------------------------------------------------------
void measure_sht10(void){
static uint16_t Time1ms;
uint8_t error=0;
switch(StateSHT10){
case (SHT10_START_DELAY):
if (++Time1ms==TIME_WAIT_ERROR_SHT10*2)
StateSHT10=SHT10_MEAS_T;//StateSHT10=SHT10_CMD_STATUS_R;//
DRIVER(SCK,OUT);//инициализация на выход, что бы все ножки настраивались внутри модуля без выноса в основную прогу
break;
case (SHT10_MEAS_T):
error=sht_sart();
error=sht_wr_byte(MEASURE_TEMP);
Time1ms=0;
StateSHT10=SHT10_WAIT_T;
break;
case (SHT10_WAIT_T):
if ( (ACTIVE(SDA))==0 ) StateSHT10=SHT10_READ_T;
if (++Time1ms==TIME_WAIT_ERROR_SHT10) error=0xFF;
break;
case (SHT10_READ_T):
TempSht.Byte[1]=sht_rx_byte(1);//msb
TempSht.Byte[0]=sht_rx_byte(0);//lsb 0 stop connect (no ask)
StateSHT10=SHT10_MEAS_H;
break;
case (SHT10_MEAS_H):
error=sht_sart();
error=sht_wr_byte(MEASURE_HUMI);
Time1ms=0;
StateSHT10=SHT10_WAIT_H;
break;
case (SHT10_WAIT_H):
if ( (ACTIVE(SDA))==0 ) StateSHT10=SHT10_READ_H;
if (++Time1ms==TIME_WAIT_ERROR_SHT10) error=0xFF;
break;
case (SHT10_READ_H):
HumiSht.Byte[1]=sht_rx_byte(1);//msb
HumiSht.Byte[0]=sht_rx_byte(0);//lsb 0 stop connect (no ask)
StateSHT10=SHT10_DATA_1;
break;
case (SHT10_DATA_1):
TempSht.f=(float)TempSht.i;
HumiSht.f=(float)HumiSht.i;
StateSHT10=SHT10_DATA_2;
break;
case (SHT10_DATA_2):
calc_sth11(&HumiSht.f,&TempSht.f);
XhtHumi=(int)(HumiSht.f);
XhtTemper=(int)((TempSht.f)*10);
if ( (XhtHumi!=0) || (XhtTemper!=0) )
Flag_Xht=XHT_OK;
else
error=1;
StateSHT10=SHT10_END_CONV;
break;
case (SHT10_END_CONV):
//StateSHT10=1;
//return 1;
break;
default :
s_softreset();
StateSHT10=SHT10_START_DELAY;
Time1ms=0;
break;
}
if (error){
StateSHT10=0xFF;
Flag_Xht=XHT_ERROR;
//return 0xFF;
}
//return 0;
}
Сначала попадаем в состояние SHT10_START_DELAY, делал для того чтобы после ошибки датчика не сразу его опрашивать, а через какое то время. У меня функция measure_sht10 вызывается раз в 1мС. Старт после ошибки через время (++Time1ms==TIME_WAIT_ERROR_SHT10*2).
Как работает у меня.
В коде есть это:
#define SHT10_START_CONV SHT10_MEAS_T
Старт преобразования выполняется в основном коде программы
StateSHT10=SHT10_START_CONV
Затем можно ждать окончание преобразования StateSHT10==SHT10_END_CONV (можно не дождаться, нужно мониторить XHT_ERROR).
У меня, в рабочем проекте, это состояние опрашивается через 1сек после StateSHT10=SHT10_START_CONV, поэтому я не смотрю это условие, а проверяю if (Flag_Xht==XHT_OK){действия}
Затем запускаем по новому. Что бы крутилось автоматом, то можно сделать так:
Код: Выделить всё
case (SHT10_END_CONV):
StateSHT10=SHT10_START_CONV;
break;
Непонятно, для чего это присвоение засовывать в какую-то функцию, не относящуюся к измерению влажности.
У меня, для синхронизации задач в главном цикле программы. Старт измерения влажности во время простоя при опросе других датчиков.
Тут по ходу пьесы возникло пару вопросов. Первый, то что вычисление температуры и влажности происходят с плавающей. По температуре погрешность меньше запятой, насколько это критично для загрузки микроконтроллера.
Вычисления вынесены в отдельное состояние, занимают относительно мало времени.
И второй вопрос, в протеусе выставляю влажность 40% , а получаю от датчика преобразованную влажность 41,45% По температуре погрешность меньше устанавливаю на датчике10.0 град.Ц , а с датчика получаю 10,32 град.Ц. Ну и походу при изменении температуры изменяется влажность
У меня было также, не знаю почему. Код функции вычисления данных от производителя.