[SOLVED] Help me interface SHT75 with PIC16f877

Status
Not open for further replies.

sarahcuaterno

Newbie level 3
Joined
Apr 28, 2011
Messages
3
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Location
philippines
Activity points
1,300
i need to interface SHT75 with PIC16f877 for temperature monitoring and it will be displayed in a computer monitor via serial cable. can someone help me? SHT11 and LM35 interfaced with arduino are commonly used but how about with SHT75 with PIC? can someone help me? i will surely appreciate this. thank you. :]]
 

Code:
#define sht_data_pin   PIN_D3 
#define sht_clk_pin    PIN_C4 


//***** Function to alert SHT75 ***** 

void comstart (void) 
{ 
 output_float(sht_data_pin);  //data high 
 output_bit(sht_clk_pin, 0);  //clk low 
 delay_us(1); 
 output_bit(sht_clk_pin, 1);  //clk high 
 delay_us(1); 
 output_bit(sht_data_pin, 0); //data low 
 delay_us(1); 
 output_bit(sht_clk_pin, 0);  //clk low 
 delay_us(2); 
 output_bit(sht_clk_pin, 1);  //clk high 
 delay_us(1); 
 output_float(sht_data_pin);  //data high 
 delay_us(1); 
 output_bit(sht_clk_pin, 0);  //clk low 
} 


//***** Function to write data to SHT75 ***** 

int1 comwrite (int8 iobyte) 
{ 
 int8 i, mask = 0x80; 
 int1 ack; 

 //Shift out command 
 delay_us(4); 
 for(i=0; i<8; i++) 
  { 
   output_bit(sht_clk_pin, 0);                          //clk low 
   if((iobyte & mask) > 0) output_float(sht_data_pin);  //data high if MSB high 
   else output_bit(sht_data_pin, 0);                    //data low if MSB low 
   delay_us(1); 
   output_bit(sht_clk_pin, 1);                          //clk high 
   delay_us(1); 
   mask = mask >> 1;                                    //shift to next bit 
  } 

 //Shift in ack 
 output_bit(sht_clk_pin, 0);  //clk low 
 delay_us(1); 
 ack = input(sht_data_pin);   //get ack bit 
 output_bit(sht_clk_pin, 1);  //clk high 
 delay_us(1); 
 output_bit(sht_clk_pin, 0);  //clk low 
 return(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 data 
 for(i=0; i<8; i++) 
  { 
   iobyte = iobyte << 1; 
   output_bit(sht_clk_pin, 1);                //clk high 
   delay_us(1); 
   if (input(sht_data_pin)) iobyte |= mask1;  //shift in data bit 
   else iobyte |= mask0; 
   output_bit(sht_clk_pin, 0);                //clk low 
   delay_us(1); 
  } 

 //send ack 0 bit 
 output_bit(sht_data_pin, 0); //data low 
 delay_us(1); 
 output_bit(sht_clk_pin, 1);  //clk high 
 delay_us(2); 
 output_bit(sht_clk_pin, 0);  //clk low 
 delay_us(1); 
 output_float(sht_data_pin);  //data high 

 //shift in LSB data 
 for(i=0; i<8; i++) 
  { 
   iobyte = iobyte << 1; 
   output_bit(sht_clk_pin, 1);                //clk high 
   delay_us(1); 
   if (input(sht_data_pin)) iobyte |= mask1;  //shift in data bit 
   else iobyte |= mask0; 
   output_bit(sht_clk_pin, 0);                //clk low 
   delay_us(1); 
  } 

 //send ack 1 bit 
 output_float(sht_data_pin);  //data high 
 delay_us(1); 
 output_bit(sht_clk_pin, 1);  //clk high 
 delay_us(2); 
 output_bit(sht_clk_pin, 0);  //clk low 

 return(iobyte); 
} 


//***** Function to wait for SHT75 reading ***** 

void comwait (void) 
{ 
 int16 sht_delay; 

 output_float(sht_data_pin);                     //data high 
 output_bit(sht_clk_pin, 0);                     //clk low 
 delay_us(1); 
 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 ready 
   delay_us(10); 
  } 
} 


//***** Function to reset SHT75 communication ***** 

void comreset (void) 
{ 
 int8 i; 

 output_float(sht_data_pin);    //data high 
 output_bit(sht_clk_pin, 0);    //clk low 
 delay_us(2); 
 for(i=0; i<9; i++) 
  { 
   output_bit(sht_clk_pin, 1);  //toggle clk 9 times 
   delay_us(2); 
   output_bit(sht_clk_pin, 0); 
   delay_us(2); 
 } 
 comstart(); 
} 


//***** Function to soft reset SHT75 ***** 

void sht_soft_reset (void) 
{ 
 comreset();           //SHT75 communication reset 
 comwrite(0x1e);       //send SHT75 reset command 
 delay_ms(15);         //pause 15 ms 
} 


//***** Function to measure SHT75 temperature ***** 

int16 measuretemp (void) 
{ 
 int1 ack; 
 int16 iobyte; 

 comstart();             //alert SHT75 
 ack = comwrite(0x03);   //send measure temp command and read ack status 
 if(ack == 1) return; 
 comwait();              //wait for SHT75 measurement to complete 
 iobyte = comread();     //read SHT75 temp data 
 return(iobyte); 
} 


//***** Function to measure SHT75 RH ***** 

int16 measurehumid (void) 
{ 
 int1 ack; 
 int16 iobyte; 

 comstart();            //alert SHT75 
 ack = comwrite(0x05);  //send measure RH command and read ack status 
 if(ack == 1) return; 
 comwait();             //wait for SHT75 measurement to complete 
 iobyte = comread();    //read SHT75 temp data 
 return(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 reading 
 tc = ((float) temp * 0.01) - 40.0; 

 //calculate Real RH reading 
 rh = (float) humid; 

 rhlin = (rh * 0.0405) - (rh * rh * 0.0000028) - 4.0; 

 //calculate True RH reading 
 rhtrue = ((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 temp 
 reshumid = measurehumid();  //measure RH 
calculate_data (restemp, reshumid, temp, realhumid, truehumid);  //calculate temp & RH 
} 


//***** Function to initialise SHT75 on power-up ***** 

void sht_init (void) 
{ 
 comreset();    //reset SHT75 
 delay_ms(20);  //delay for power-up 
}

Code:
#include <16F877A.h> 
#fuses HS,NOWDT,PUT,NOPROTECT,NOLVP 
#use delay(clock=20000000) 

#include<lcd.c> 
#include<sht75.c> 

void main() 
{ 
 float restemp, truehumid; 
 lcd_init(); 
 sht_init(); 

 while(1) 
 { 
  sht_rd (restemp, truehumid); 
  lcd_gotoxy(1,1); 
  printf(lcd_putc, "Temp : %3.1f %cC   ", restemp, 223); 
  printf(lcd_putc, "\nRH   : %3.1f %%   ", truehumid); 
  delay_ms(500);        //delay 500 ms between reading to prevent self heating of sensor 
 } 
}
 
Status
Not open for further replies.

Similar threads

Cookies are required to use this site. You must accept them to continue using the site. Learn more…