sht75 sıcaklık sonucu çok oynak

Başlatan kantirici, 15 Nisan 2013, 15:28:06

kantirici

Merhaba arkadaşlar.SHT75 ile sıcaklık ve nem ölçüyorum.Fakat virgülden sonraki hane çok oynak.Öyleki, 22.0 da oluyor 22.9 da. Nemde o kadar olmasada onda da oynama var. Devre standart sht şeması, data ucu 10k ile pullup, 5v besleme, clk.

SHT75 için bu normalmidir?

Kullandıgım kütüphane;
#define noACK 0
#define ACK   1
                            //adr  command  r/w
#define STATUS_REG_W 0x06   //000   0011    0
#define MEASURE_TEMP 0x03   //000   0001    1
#define MEASURE_HUMI 0x05   //000   0010    1
#define RESET        0x1E   //000   1111    0

void sht75_init(void)
{
    sht75_comreset();		//reset SHT75
    DelayMs(25);			//delay for power-up
}

void sht75_start(void)
{
    // İletişim satartı 
    //       _____         ________
    // DATA:      |_______|
    //           ___     ___
    // SCK : ___|   |___|   |______
    
    SHT75_TRIS=1;
    SHT75_SCK=0;
    DelayUs(5);
    SHT75_SCK=1;
    DelayUs(3);
    SHT75_TRIS=0;
    DelayUs(3);
    SHT75_DATA=0;
    DelayUs(3);
    SHT75_SCK=0;
    DelayUs(3);
    SHT75_SCK=1;
    DelayUs(3);
    SHT75_TRIS=1;
    DelayUs(3);
    SHT75_SCK=0;
}

void sht75_comreset(void)
{
    // Reset: Data hattı 1 iken 9 clk cycle'ı gelir ve sonra iletişim startı ile devam eder
    //       _____________________________________________________         ________
    // DATA:                                                      |_______|
    //          _    _    _    _    _    _    _    _    _        ___     ___
    // SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______|   |___|   |______
    unsigned char i;
    SHT75_DATA=1;
    SHT75_SCK=0;
    for(i=0;i<9;i++)
    {
        SHT75_SCK=1;
        DelayUs(3);
        SHT75_SCK=0;
        DelayUs(3);
    }
    sht75_start();
}

unsigned char sht75_softreset(void)
{
    //Interface'i resetler, status register'i default değerine döndürür 
    unsigned char error=0;  
    sht75_comreset();
    error=sht75_write_byte(RESET);		// Reset komutu gönderiliyor
    DelayMs(15);						// En az 11ms beklenmeli
    return error;						// 1'ise sensörden tepki yok, hata var
}

unsigned char sht75_write_byte(unsigned char veri)	// 1 byte yazılıyor
{
    unsigned char i, error=0;
    SHT75_TRIS=0;
    DelayUs(3);
    for(i=0x80;i>0;i/=2)
    {
        SHT75_SCK=0;
        DelayUs(3);
        if(i&veri)
            SHT75_DATA=1;
        else
            SHT75_DATA=0;
        DelayUs(3);
        SHT75_SCK=1;
        DelayUs(3);
    }
    SHT75_TRIS=1;
    DelayUs(3);
    SHT75_SCK=0;
    DelayUs(3);
    error=SHT75_DATA;
    DelayUs(3);
    SHT75_SCK=1;
    DelayUs(3);
    SHT75_SCK=0;
    
    return error;
}

unsigned int sht75_read_byte(void)		// 2 byte okunuyor
{
    unsigned int kay=0x0001,veri=0;
    unsigned char i;
    SHT75_TRIS=1;
    DelayUs(3);
    for(i=0;i<8;i++)
    {
        veri=veri<<1;
        SHT75_SCK=1;
        DelayUs(3);
        if(SHT75_DATA)
            veri=veri|kay;
        DelayUs(3);
        SHT75_SCK=0;
        DelayUs(3);
    }
    SHT75_TRIS=0;
    DelayUs(3);
    SHT75_DATA=0;
    DelayUs(3);
    SHT75_SCK=1;
    DelayUs(3);
    SHT75_SCK=0;
    DelayUs(3);
    SHT75_TRIS=1;
    DelayUs(3);
    
    for(i=0;i<8;i++)
    {
        veri=veri<<1;
        SHT75_SCK=1;
        DelayUs(3);
        if(SHT75_DATA)
            veri=veri|kay;
        DelayUs(3);
        SHT75_SCK=0;
        DelayUs(3);
    }
    SHT75_TRIS=0;
    DelayUs(3);
    SHT75_DATA=1;
    DelayUs(3);
    SHT75_SCK=1;
    DelayUs(3);
    SHT75_SCK=0;
    DelayUs(3);
    SHT75_TRIS=1;
    DelayUs(3);
    
    return veri;
}

void com_wait(void)		// Çevrimin bitmesi bekleniyor
{
    int i;
    
    SHT75_TRIS=1;
    DelayUs(3);
    SHT75_SCK=0;
    DelayUs(3);
    while(SHT75_DATA);
}

unsigned char sht75_write_statusreg(unsigned char veri)
{
    unsigned char error=0;
    sht75_start();
    error+=sht75_write_byte(STATUS_REG_W);
    error+=sht75_write_byte(veri);
    
    return error;
}

unsigned int measure_temp(void)		// Sıcaklık hesaplanıyor
{
    unsigned char ack;
    unsigned int veri;
    sht75_start();
    ack=sht75_write_byte(MEASURE_TEMP);
    com_wait();
    veri=sht75_read_byte();

    return veri;
}

unsigned int measure_humi(void)		// Nem hesaplanıyor
{
    unsigned char ack;
    unsigned int veri;
    sht75_start();
    ack=sht75_write_byte(MEASURE_HUMI);
    com_wait();
    veri=sht75_read_byte();

    return veri;
}

void sht75(int *temp, float *rhlin, float *rhtrue)
{
    float realhumid;
    
    *temp = measure_temp() - 4000;
    
    realhumid = (float)measure_humi();
    
    *rhlin = (realhumid * 0.0405) - (realhumid * realhumid * 0.0000028) - 4;
    
    *rhtrue = (((*temp - 2500)/100) * (0.01 + (0.00008 * realhumid))) + *rhlin;
}

muratdu

Delay ekle gitsin derim :) En kısa çözüm.

kantirici

delay derken hocam anlamadım. ölçümleri yaklaşık 8 snde bir alıyorum.

muratdu

Anlık ölçüm lazım degilse, 1 dakika bir ölçüm alın anlamında yazmıştım. Ama 8 sn. de bu kadar fazla geldi bana. Neredeyse 1 oC fark ediyor. 

Kabil ATICI

Besleme gerilimin kararlı mı?  Devrem tamam diyorsan;

Sistemin kararsızlığı için önceki 4 tane ölçümü son ölçüme ekle ve 5'e böl. (hem sıcaklık hem de nem için ölçüm değerlerini tabii).

sıcaklık=(sıcak1+sıcak2+sıcak3+sıcak4+son sıcak)/5

Nem=(nem1+nem2+nem3+nem4+son nem)/5

sistemin ani tepkisini azaltır ama ani sıçramalarıda ortadan kaldırır.
ambar7

haydarpasamikro

Sıcaklığın belli bir birim zamanda değişmesinin mümkün olmadığı sayıda ve aralıklarla alınan örneklerle standart sapma bulunur. Eğer bu değerden daha büyük farklı sıcaklık okunmuşsa bu kabul edilmeyebilir. Yani matematikteki standart sapma formülü ile hesaplama yapılabilir.
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

kantirici

@ambar7, hocam değişkenlik çok fazla oldugu için o çözüm olmayacaktır.

@haydarpasamikro, hocam olabilir fakat asıl ögrenmek istedigim bu sensörle daha önce çalışanların nasıl bir sonuç aldıkları. Devre ve yazılımda problem yok gibi ama bir yerleride atlamış olabilirim.

Klein

muhtemelen atladığınız bir şeyler var. Eğer ortam sıcaklığında bir değişme yoksa, Noktadan sonra 1 hanede herhangi bir oynama olmamalı.

haydarpasamikro

Ben sht11 ile çalışıyorum. Sorun yok. CRC verisini dikkate alın o zaman.  Hatanın kaynağını bulmanızda yardım eder. Bir de besleme gerilimi ve stabilitesi nasıl?
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

kantirici

cevaplarınız için teşekkürler.Yazılımı tekrar gözden geçirdim, crc kontrolüde yaptım.Şu an virgülden sonraki ilk hane oda sıcaklıgında normal gibi, yani pek oynamıyor.

Bir sorumda bu sht serisi sürekli okumada  iki okuma süresi ne kadar olmalı, bir sınır varmı acaba?

haydarpasamikro

kataloğunda ısı ve nem için şartlara bağlı olarak farklı response time değerleri veriyor tabloda.
Mikro Dünyası.Haydarpaşa Teknik ve Endüstri Meslek Lisesi Mikrodenetleyici Atl. Şefi

Burak B

14bit için ölçüm istediğinde cevap için maks. 320ms bekleme gerekir. Ayrıca ölçümden ölçüme 800ms gibi bir aralık koyman da sensörün ısınmasını engelleyecektir. Ölçümden ölçüme min. 500ms in altına düşmemeni öneririm.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle