///////////////////////////////////////////////////////////////////////////////// //// Driver file for SHT75 Temperature & Humidity Sensor //// //// ***** To initialise SHT75 sensor upon power up ***** //// //// Function : sht_init() //// Return : none //// //// //// ***** To measure and caluculate SHT75 temp & real RH ***** //// //// Function : sht_rd (temp, truehumid) //// Return : temperature & true humidity in float values //// ///////////////////////////////////////////////////////////////////////////////////#define sht_data_pin PIN_D0//#define sht_clk_pin PIN_D1//***** Function to alert SHT75 *****void comstart (void){output_float(sht_data_pin); //data highoutput_low(sht_clk_pin); //clk lowdelay_us(2);output_high(sht_clk_pin); //clk highdelay_us(2);output_low(sht_data_pin); //data lowdelay_us(2);output_low(sht_clk_pin); //clk lowdelay_us(5);output_high(sht_clk_pin); //clk highdelay_us(2);output_float(sht_data_pin); //data highdelay_us(2);output_low(sht_clk_pin); //clk low}//***** Function to write data to SHT75 *****int1 comwrite (int8 iobyte){int8 i, mask = 0x80;int1 ack;//Shift out commanddelay_us(5);for(i=0; i<8; i++){output_low(sht_clk_pin); //clk lowif((iobyte & mask) > 0) output_float(sht_data_pin); //data high if MSB highelse output_low(sht_data_pin); //data low if MSB lowdelay_us(2);output_high(sht_clk_pin); //clk highdelay_us(2);mask = mask >> 1; //shift to next bit}//Shift in ackoutput_low(sht_clk_pin); //clk lowdelay_us(2);ack = input(sht_data_pin); //get ack bitoutput_high(sht_clk_pin); //clk highdelay_us(2);output_low(sht_clk_pin); //clk lowreturn(ack);}//***** Function to read data from SHT75 *****int16 comread (void){int8 i;int16 iobyte = 0;const int16 mask0 = 0x0000;const int16 mask1 = 0x0001;//shift in MSB datafor(i=0; i<8; i++){iobyte = iobyte << 1;output_high(sht_clk_pin); //clk highdelay_us(2);if (input(sht_data_pin)) iobyte |= mask1; //shift in data bitelse iobyte |= mask0;output_low(sht_clk_pin); //clk lowdelay_us(2);}//send ack 0 bitoutput_low(sht_data_pin); //data lowdelay_us(2);output_high(sht_clk_pin); //clk highdelay_us(5);output_low(sht_clk_pin); //clk lowdelay_us(2);output_float(sht_data_pin); //data high//shift in LSB datafor(i=0; i<8; i++){iobyte = iobyte << 1;output_high(sht_clk_pin); //clk highdelay_us(2);if (input(sht_data_pin)) iobyte |= mask1; //shift in data bitelse iobyte |= mask0;output_low(sht_clk_pin); //clk lowdelay_us(2);}//send ack 1 bitoutput_float(sht_data_pin); //data highdelay_us(2);output_high(sht_clk_pin); //clk highdelay_us(5);output_low(sht_clk_pin); //clk lowreturn(iobyte);}//***** Function to wait for SHT75 reading *****void comwait (void){int16 sht_delay;output_float(sht_data_pin); //data highoutput_low(sht_clk_pin); //clk lowdelay_us(2);for(sht_delay=0; sht_delay<30000; sht_delay++) // wait for max 300ms{if (!input(sht_data_pin)) break; //if sht_data_pin low, SHT75 readydelay_us(10);}}//***** Function to reset SHT75 communication *****void comreset (void){int8 i;output_float(sht_data_pin); //data highoutput_low(sht_clk_pin); //clk lowdelay_us(5);for(i=0; i<9; i++){output_high(sht_clk_pin); //toggle clk 9 timesdelay_us(5);output_low(sht_clk_pin);delay_us(5);}comstart();}//***** Function to soft reset SHT75 *****void sht_soft_reset (void){comreset(); //SHT75 communication resetcomwrite(0x1e); //send SHT75 reset commanddelay_ms(15); //pause 15 ms}//***** Function to measure SHT75 temperature *****int16 measuretemp (void){int1 ack;int16 iobyte;comstart(); //alert SHT75ack = comwrite(0x03); //send measure temp command and read ack statusif(ack == 1) return;comwait(); //wait for SHT75 measurement to completeiobyte = comread(); //read SHT75 temp datareturn(iobyte);}//***** Function to measure SHT75 RH *****int16 measurehumid (void){int1 ack;int16 iobyte;comstart(); //alert SHT75ack = comwrite(0x05); //send measure RH command and read ack statusif(ack == 1) return;comwait(); //wait for SHT75 measurement to completeiobyte = comread(); //read SHT75 temp datareturn(iobyte);}//***** Function to calculate SHT75 temp & RH *****void calculate_data (int16 temp, int16 humid, float & tc, float & rhlin, float & rhtrue){float truehumid1, rh;//calculate temperature readingtc = ((float) temp * 0.01) - 40.0;//calculate Real RH readingrh = (float) humid;rhlin = (rh * 0.0405) - (rh * rh * 0.0000028) - 4.0;//calculate True RH readingrhtrue = ((tc - 25.0) * (0.01 + (0.00008 * rh))) + rhlin;}//***** Function to measure & calculate SHT75 temp & RH *****void sht_rd (float & temp, float & truehumid){int16 restemp, reshumid;float realhumid;restemp = 0; truehumid = 0;restemp = measuretemp(); //measure tempreshumid = measurehumid(); //measure RHcalculate_data (restemp, reshumid, temp, realhumid, truehumid); //calculate temp & RH}//***** Function to initialise SHT75 on power-up *****void sht_init (void){comreset(); //reset SHT75delay_ms(20); //delay for power-up}