Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronic Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

[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. :]]
 

ckshivaram

Advanced Member level 5
Joined
Apr 21, 2008
Messages
5,070
Helped
2,149
Reputation
4,304
Reaction score
2,089
Trophy points
1,393
Location
villingen (Germany) / Bangalore
Activity points
30,097
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.

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Top