SHT11 hakkında ?

Başlatan tekniker_murat, 01 Mart 2013, 22:24:00

tekniker_murat

Selamun aleyküm değerli ustalarım Elimde bir adet ds18B20 ve sht11 var bu ds18B20 nin programını yazdım çokta güzel çalışıyor... kodlarını da aşağıda veriyorum belki bir arkadaşımızın işine yarar... ( bu arada ben de komutların tamamını yazdım desem yalan olur bir sitede pic basic ile yazılmıştı ve ben de proton basice çevirdim çalıştırdım )

Device 16F877A
Config  CP_OFF,DEBUG_OFF,WRT_OFF,CPD_OFF,LVP_OFF,BODEN_OFF,PWRTE_OFF,WDT_OFF,HS_OSC
Declare XTAL 20
CCP1_PIN = PORTC.2
Declare LCD_TYPE 0
Declare LCD_DTPIN PORTB.4
Declare LCD_ENPIN PORTB.3
Declare LCD_RSPIN PORTB.2
Declare LCD_INTEnjhRFACE 4
Declare LCD_LINES 4
DelayMS 500
Print   $fe,1
Print $FE ,1
Symbol DQ = PORTD.6 'iletisimin yapilacagi port
Dim mesgul  As  Byte
Dim bilgi   As  Word
Dim isaret  As  Byte
Dim onda1   As  Word
Dim onda2   As  Word
Dim ara     As  Word
Dim deger   As  Byte
DelayMS 500
BASLA: 'Dongüye gir.
isaret="+"
OWrite DQ, 1, [$CC, $44] 'sicakligi hesaplamasi icin komut gonderiyor
BEKLE: 'Sensör hazır olana kadar bekle.
ORead DQ, 4, [mesgul] ' islem suresince portb.2=0 oluyor     'OWIN SENSOR,4,[mesgul]
If mesgul=0 Then
GoTo BEKLE
EndIf
DEVAM:
OWrite DQ, 1, [$CC, $BE] 'sicaklik degerini RAM dan okumasi icin komut gönderiyor 
ORead DQ, 2,[bilgi.LowByte,bilgi.HighByte] 'sicaklik degeri sensörden okunuyor   
If bilgi.13  =   1 Then 'Sıcaklık negatif ise
isaret="-" 'İşaret artık + değil -
bilgi=~bilgi 'Gelen bilgideki bitleri tersle, 1->0, 0->1
bilgi=BILGI+1 'Bilgiyi 1 arttır.
EndIf
ara=BILGI*625 '12 bit hassasiyet kullandığımız için her değer 0.0625 santigrat dereceye denk geliyor.
deger=Div32 10000
ara=BILGI*625
onda1= Div32 1000
ara=BILGI*625
onda2= Div32 100
onda1=ONDA1-(DEGER*10)
onda2=ONDA2-((dEGER*100)+(ONDA1*10))
Print   $fe,1'LCD ekranın alt satırını temizle
Print   At  1,1,"derece ",isaret,#deger,".",#onda1,#onda2,"C"'   
DelayMS  300
GoTo BASLA 'BASLA etiketine dön
End

Fakat sorunum şu ki Sht11 hakkında sadece i2c ile haberleştiğinden başka bişiy bilmiyorum. Hesaplaması nasıl oluyor proton basic kullanarak hangi kodlarla okuyoruz nasıl bir mantığı var gibi konularda yardımcı olabilecek arkadaşlar varsa acil olarak yardımlarını beklemekteyim şimdiden herkese iyi çalışmalar
[email]murat.yagci.1984@gmail.com[/email]

pisayisi

Seri porta bağlayıp aşağıdaki gibi bir yordamla okutabilirsin, bu örnekte data için PB5 ve clk için PB6 pinleri kullanıılmış...

#define DATA  PIN_B6    /*set DATA to PortB6 and SCK to portB5*/
#define SCK   PIN_B5
#define noACK 0
#define ACK   1

/*SHT1x address=000 is currently supported*/
/*SHT1x command code*/
                            //adr  command  r/w
#define STATUS_REG_W 0x06   //000   0011    0
#define STATUS_REG_R 0x07   //000   0011    1
#define MEASURE_TEMP 0x03   //000   0001    1
#define MEASURE_HUMI 0x05   //000   0010    1
#define RESET        0x1E   //000   1111    0

/*constant use for SHT11 Humidity Measurement*/
#define C1  -4.0
#define C2  0.0405
#define C3  -0.0000028

/*constant use for SHT11 Temperature Measurement*/
#define D1  -40.0
#define D2  0.01

/*constant use for SHT11 True Humidity Measurement*/
#define T1  0.01
#define T2  0.00008

/*SHT11 Transmission Start Sequence*/
void sht11_xmission_start()
{output_high(DATA);output_low(SCK);delay_us(2);
 output_high(SCK);delay_us(2);output_low(DATA);delay_us(2);
 output_low(SCK);delay_us(2);delay_us(2);delay_us(2);
 output_high(SCK);delay_us(2);
 output_high(DATA);delay_us(2);
 output_low(SCK);delay_us(2);}

/*SHT11 Connection Reset Sequence*/
void sht11_connection_reset()
{  int i;

   output_high(DATA);
   for (i=0; i<9; i++)
   {output_high(SCK);
    delay_us(2);
    output_low(SCK);
    delay_us(2);}
   sht1x_xmission_start();}

/*SHT11 Address & Command Mode with address=000*/
void sht11_command_mode(int iMode)
{
   int i;
   for (i=128; i>0; i/=2)
   {if (i & iMode) output_high(DATA);
    else  output_low(DATA);delay_us(2);
          output_high(SCK);delay_us(2);
          output_low(SCK);}

   output_float(DATA);
   delay_us(2);
   output_high(SCK);
   delay_us(2);
   output_low(SCK);
   
   /*delay >55ms for 12-bit measurement*/
   /*delay >210ms for 14-bit measurement*/
   delay_ms(250);  /*250ms is chosen as delay time*/
}

/*SHT11Soft Reset - resets the interface, clears the status register to default values*/
/*wait minimum 11ms before next command*/
void sht11_soft_reset()
{
  sht11_connection_reset();
  sht11_command_mode(RESET);
}
// read data from SHT11 and store
long sht11_read_data()
{  int i;
   long lTmp,lVal1=0,lVal2=0,lValue;

   for (i=0; i<8; i++)          /*get MSB from SHT11*/
   {lVal1<<=1;
    output_high(SCK);
    lTmp = input(DATA);
    delay_us(2);
    output_low(SCK);
    delay_us(2);
    if (lTmp) lVal1|=1; }
 
   output_low(DATA);   /*acknowledge routine*/
   delay_us(2);
   output_high(SCK);delay_us(2);
   output_low(SCK);output_float(DATA);delay_us(2);

   for (i=0; i<8; i++)          /*get LSB from SHT11*/
   {lVal2<<=1;
    output_high(SCK);
    lTmp = input(DATA);
    delay_us(2);
    output_low(SCK);
    delay_us(2);
    if (lTmp) lVal2|=1;}
   lValue = make16(lVal1,lVal2);
   return(lValue);}
Murat

tekniker_murat

Emeğiniz için teşekkür ederim fakat ben proton basic dili kullanılarak bir program örneği istemiştim ve sistemin çalışması hakkında bilgi sormuştum CCSC ile olan bir çok örneği mevcut fakat yinede ilginiz için çok saolun.
[email]murat.yagci.1984@gmail.com[/email]

Ser-Er_bilgi_islem

Arkadaşım Buyur...
Benim Daha Önce Kuluçka Makinası İçin Kullandığım Kodlar...
Ayrıca 10k Ntc İle Kullanmıştım..
İyi Çalışmalar...


;--------------------TANIMLAMALAR--------------------;
    Dim Hamntc As Word
    Dim Ntc As Float
    Dim ISI As Word
    Dim HAM As Word
    Dim RHlin As Float
    Dim RHlin2 As Float
    Dim c1 As Float
    Dim c2 As Float
    Dim c3 As Float
    Dim RHtrue As Float
    Dim T As Float
    Dim t1 As Float
    Dim t2 As Float
    Dim d1 As Float
    Dim d2 As Float
    Dim KONTROL As Byte
    Dim H0 As HAM.LowByte
    Dim H1 As HAM.HighByte
    Dim HATA As Bit
    Dim W As Word
;-------------NTC Tanımlaları -----------------
;Dim a As Float
;Dim b As Float
;Dim c As Float
;Dim formul As Float
;Dim formull As Float
;Dim Resistance As Float
;Dim mv As Float
;Dim temp As Float
;Dim ltemp As Float
;Dim formul2 As Float
;Dim kelvin As Float
;Dim formul3 As Float
;Dim formul4 As Float
;Dim kelvin2 As Float
;Dim ntcdata As Float
;Dim fahre As Float
;Dim fah As Float
;Dim LNRT As Float
;Dim RT As Float
;-----------------------------------------------   
   
;--------SHT BAGLANTI---------------------------

    Symbol CLK=PORTE.0  ; 3 NOLU AYAK
    Symbol DTA=PORTE.1  ; 2   "    "


;----------SHT---------DEGERLER------------------ ;data sheetlerde farklılık gösterebiliyor
    c1 = -2.0468                                                 
    c2 = 0.0367                                                   
    c3 = -0.0000015955                                             
    t1 = 0.01
    t2 = 0.00008
    d1 = -40.1                                                   
    d2 = 0.01
    a = 0.001125108
    b = 0.000234772
    c = 0.000000085
    fah = 1.8
   
;    kelvin = 273.15
;    ntcdata = 3950



   
GoSub T_START   
BASLA:
;Hamntc = ADIn 3

; SHT ISI   
KONTROL=%00000011
HAM=0 'SICAKLIK ÖLÇME'
;GoSub ISII
GoSub OLCUM_AL
GoSub ISI_HESAP
;Print Font ARIAL13
;Print At 5,20,DEC1 fahre
;Print At 5,20,DEC1 Ntc
Print At 5,20,"Ortam "," ",DEC1 T,"C" 

;NEM   
KONTROL=%00000101
HAM=0 'RUTUBET ÖLÇME'
GoSub OLCUM_AL
;GoSub ISII
GoSub RUTUBET_HESAP
Print At 20,20,DEC1 RHtrue             
KONTROL=%00011110
GoTo BASLA   


;ISII:                  ; 10 K NTC İLE ÖLÇME
;Hamntc = ADIn 3
;Hamntc = Hamntc + 188
;mv = Hamntc * 4.8828125
;temp = 5000 - mv
;Resistance = mv * ntcdata / temp
;RT = Log Resistance
;LNRT =  RT * RT * RT
;ltemp = Log temp
;formull = a + (b * RT)
;formul = c * LNRT
;formul2 = formull + formul
;formul4 = formul2 * formul2 * formul2
;formul3 = 1 / formul2
;kelvin2 = formul3 - kelvin
;Ntc = formul3 - kelvin
;fah = 9 / 5
;fahre =  fah * Ntc  + 32
;Return     

OLCUM_AL:

        GoSub T_START
        SHOut DTA,CLK,1,[KONTROL]
        Input DTA
        PulsOut CLK,10
        HATA=0
        For W=0 To 65500
           If DTA=0 Then CIK
        Next W
        HATA = 1
     

CIK: 
       If HATA=1 Then
       ;GoSub SENSORYOK
       EndIf
       SHIn DTA,CLK,0,[H1]
       Output DTA
       Low DTA
       PulsOut CLK,10
       Input DTA
       SHIn DTA,CLK,0,[H0]
       PulsOut CLK,10

Return

ISI_HESAP:
    T = d1 + d2 * HAM
Return

RUTUBET_HESAP:
    RHlin = c1 + c2 * HAM 
    RHlin2 = c3 * HAM * HAM
    RHlin = RHlin + RHlin2
    RHtrue = ( t1 + t2 * HAM)
    RHtrue = RHtrue * ( T - 25)
    RHtrue = RHtrue + RHlin
Return

T_START:

    Output DTA:Output CLK
        High DTA
        Low CLK
        DelayMS 1
        High CLK
        Low DTA
        DelayMS 1
        Low CLK
        DelayMS 1
        High CLK
        DelayMS 1                             
        High DTA
        Low CLK
Return


;SENSORYOK:
;Print Font VERDANA15
;           Print At 4,48,"Sensor"
;          Print At 30,63,"Y o k"
           
;           DelayMS 1500               
;           yok:DelayMS 50:GoTo yok
;Return