Elektronik ve Teknoloji Merkezi Elektrotekno.com
Elektronik ve Teknoloji Merkezi



Click here to go to the original topic

Elektrotekno.com Ana Sayfa Microchip Pic Serisi
Yazar Mesaj
Nihat
Tarih: 16.10.2006, 18:44 Mesaj konusu: SHT11' den PIC' e veri okuma

Arkadaşlar, SHT11' den PIC'e sıcaklık ve nem değerlerini okutmak istiyorum. PIC 16F877 kullandık, programı C dilinde yazdık, SHT11' den sıcaklık ve nem değerlerini PIC'e okutan C dilinde program konusunda başarılı olamadık, yardımcı olursanız çok memnun olurum, şimdiden teşekkür eder, çalışmalarınızda başarı ve kolaylıklar dilerim.
-----------------------------------------------------

ete
Tarih: 16.10.2006, 19:33 Mesaj konusu:

sht-11 okuma bölümünü basic de yazmıştım. ilk yazdığım bölüm basit komutlardan oluşuyor idi. sanırım bu kodları kolayca c diline çevirebilirsiniz.
********************************************************************************************
kontrol=%00000011 ' ısı ölçüm için, kontrol=%00000101 olursa rutubet ölçer
gosub komver
gosub olcumal
h1=c0
gosub cık
h0=c0
gosub cık
gosub ısıhesap
gosub ekran1
..
..
..


komver:
gosub t_start
w=128
trısa.0=0
trısa.1=0
bır:
ıf (kontrol & w)=w then '........if (kontrol and w)=w
bılgı=1
else
bılgı=0
endıf
clk=1:pauseus 5
clk=0:ıf w=1 then ıkı
w=w>>1:goto bır '............w=w>>1 w değerini 1 bit sağa kaydır
ıkı: bılgı=1:clk=1:trısa.0=1
tekrar: ıf bılgı=1 then tekrar
clk=0
return

t_start:
trısa.0=0:trısa.1=0
bılgı=1:clk=0:pauseus 2
clk=1:bılgı=0:pauseus 2
clk=0:clk=1:pauseus 2
bılgı=1:clk=0
return

olcumal:
for w=0 to 65535
ıf bılgı=0 then cık
next w:ıf bılgı=1 then
hata=1:endıf
'------------------------------byte oku ----------------------------------------
cık: c0=0
w=128 ' ilk byte okuma
trısa.0=1
uc: clk=1
ıf bılgı=1 then
c0=c0 | w '................c0=c0 or w demektir
endıf
clk=0:ıf w=1 then dort
w=w>>1:goto uc
dort: trısa.0=0
bılgı=0:clk=1
clk=0:bılgı=1
return
*************************************************************************************************

kolay gelsin
ete
Nihat
Tarih: 18.10.2006, 13:14 Mesaj konusu:

Teşekkürler verdiğiniz bilgi ve ilginiz için Ete ustam, saygılarımla.
ete
Tarih: 18.10.2006, 13:17 Mesaj konusu:

Birşey değil. Hesap kısmını vermemiştim. Çünki ben 8 bit hesap ve zorlamalı 16 bit integer hesap yolu ile yapmıştım. C de float kullanabiliyorsunuz hatta double integer de var. Direkt data sheet deki formulü uygulayabilirsiniz sanırım.

Ete
zafzaf82
Tarih: 13.02.2007, 16:21 Mesaj konusu:

Kod:
//////////////////////////SHT75.H///////////////////////////////////////////////
//                                                                           //
// 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_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
}

Test code
Kod:
#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
 }
}

cenkara
Tarih: 13.02.2007, 22:38 Mesaj konusu:

Arkadaşlar bu ısı nem sensörünü İstabulda sürekli bulabilceğim
adres varmı .

Teşkkürler
Elektrotekno.com Ana Sayfa Microchip Pic Serisi
1. sayfa (Toplam 1 sayfa)

SHT11' den PIC' e veri okuma

Gizlilik Politikası

PLC programming