AM2315 I2C Dijital Çıkışlı Nem ve Sıcaklık Sensör Modülü

AM2315 Isı ve Nem Sensörü

AM2315 Sıcaklık, Nem ve Isı Sensörü’nü detaylandırdık!

Neden ISI ve NEM ölçeriz?

Özellikle ülkemizin iklim koşulları nedeni ile sıcaklık ve nem çok büyük bir aralıkta değişim göstermektedir. Hepimiz duymuşuzdur “hissedilen sıcaklık”. Hissedilen sıcaklık –özellikle yaz aylarında nem ile alakalıdır. Aşağıdaki grafikte (kaynak: Meteoroloji genel müdürlüğü sitesi) görüldüğü üzere; yazın sıcaklığın ülkemizde hiç te anormal olmayan 35°C olduğu bir günde, NEM %75 ise hissedilen sıcaklık 53°C dir. Bu da tehlikeli sıcaklık kategorisine girmektedir. AM2315 Sıcaklık, Nem ve Isı Sensörü bu aşamada devreye girmektedir.

 

am2315-i2c-dijital-cikisli-nem-ve-sicaklik-sensor-modulu-1

Görüldüğü gibi hayatımızı sadece sıcaklık değil NEM ile birlikte etkilemektedir.

Klimalı ortamlarda, klimayı yukarıdaki örnekten yola çıkarak; sadece ısıyı 27°C ye düşürmek yerine, Nemi de %40’a indirirsek ortamda aynı hissi elde etmiş olacağız. Tabi bunun için de hem ısı hem nem ölçümü önem kazanmaktadır.

Bilindiği gibi sıcaklık ölçümü yıllardır hatta 200 yılı aşkın süredir çok hassas yapılabilmektedir. Günümüzde de ısı ölçümü her ısı aralığı için onlarca sensör mevcuttur. Bu sensörleri basit yöntemler ile kalibre edilebilmekte ve çok hassas ölçümler elde edilebilmektedir.  Örnek; bir PT100 sensör; buzlu saf su 0°C ve kaynayan saf su 100°C ile iki noktada kalibre edildiğinde; +-0,5°C doğruluk ile ölçüm yapılabilmektedir.

Ancak NEM olayına gelindiğinde, kalibrasyon için gerekli ortam ve gereç özel laboratuvarlar haricinde çok fazla kişinin elinde bulunmamaktadır. Zira NEM, ısıya bağımlı olması nedeni ile isimden de görüldüğü gibi NEM ölçümü MUTLAK değildir. Onun için de ismi Relative Humidity veya Bağıl NEM olarak anılmaktadır. Bu terim Hava içindeki moleküler su oranıdır ve yüzde (%)  olarak verilir.

Nem ölçmenin birçok yolu vardır; bunun en eski yöntemi; bir atkuyruğu kılı ince bir yay ile gerilir, kıl nem ile orantılı olarak genleşir ve bu genleşme nem oranını belirler. Daha yakın tarihlerdeki bir yöntem hava kapasitörü ile yapılmaktadır. Kapasitör bir osilatöre frekans belirleyici komponent olarak takılır ve havdaki nem oranına göre frekans değişir. Bundan başka yöntemler de mevcut. Fakat tüm bu yöntemlerde önemli olan kalibrasyondur. Dolayısı ile hangi yöntem kullanılırsa kullanılsın kalibrasyonsuz ölçüm, ölçüm değildir.

Dolayısı ile herhangi bir sensör içinde geçerli olan, ölçüm dediğimizde 4 konu önemlidir:

  1. HASSASİYET, (Precision) kalibre edilen Ölçüm aralığındaki sapma oranı.
  2. DOĞRULUK, (Linearity) örnek 0°C ve 100°C de hassasiyet %1 olabilir fakat 30°C de bu oran %5 olabilir.
  3. TEKRARLANABİLİRLİK (Repeatability) örnek 100°C ye çıkarıp 30°C ye indiğimizde 30°C ölçebiliyormuyuz. Ve bunun süresi .
  4. DEĞİŞTİRİLEBİLME (Replacebility) örnek aynı sensör tipi değiştirildiğinde aynı ölçümleri alabiliyormuyuz?

Bu sensörlerin özelliği; yukarıdaki özellikler ve kullanım aralığı (-15°C + 70°C – %10Rh-%90) itibarıyla; Sıcaklıkta: %1, Nemde: %2 gibi bir hassasiyeti fabrika kalibrasyonlu olması idi. Ancak piyasada tek olması ve popülerliği nedeni ile bu sensörlerin piyasada fiyatları gittikçe yükselmiştir.

Buna karşılık her zaman olduğu gibi Çinliler. önce ucuz sensörler ürettiler. Fakat bunlar; Nemde %5-%7 gibi bir hassasiyette kaldılar (örnek DHT11).  Bunlar birçok alanda kullanımı uygun olsa da hassas ölçümler için uygun değildir.

Son olarak, AM2315 yine Çinli AOSONG firması tarafından piyasaya sürülmüştür. Hassas ölçümler için kalibreli AM2315 sensör, hem hassasiyeti, hem de kap içinde olması ile dikkati çekiyor.

AM2315 özellikleri:

Haberleşme                       : I2C

Hassasiyet ISI                    : +-1°C max  (-40°C – 125°C)

Hassasiyet NEM               : +-%2 max  (%5 Rh – %95Rh)

Çalışma voltajı                   : 3,5V – 5,5V

Ölçüm sıklığı                       : 2 saniyede bir

Ölçüm akımı                       : 0,5mA (ölçüm yapılmazken 15uA)

AM2315 Sıcaklık, Nem ve Isı Sensörü ile ilgili linkler:

Satın alma linkine buradan ulaşabilirsiniz.

Datasheet linkine buradan ulaşabilirsiniz.

 

AM2315 için sensör olarak ‘datasheet’ine baktığımızda nem normal ortam şartlarında çok nadiren %10 ile %90 aralığının dışına çıkar. Bu alanda ise sensörümüzün +-%1 civarında olduğunu görüyoruz. Isıda ise kullanım alanı -20°C – +75°C olması durumunda hassasiyet +-0,2°C olduğunu görüyoruz.

am2315-i2c-dijital-cikisli-nem-ve-sicaklik-sensor-modulu-2

AM2315 Sıcaklık, Nem ve Isı Sensörü güzel paketlenmiş bir kutu içinde sunuluyor. Kutu içinde 2 adet duvar ve delik montaj aparatı ve hatta 2 adet dübel ve vidaları ile birlikte geliyor. Sensör kablosu yaklaşık 50cm. Ayrıca sensör ile birlikte üretim ve kontrol tarihinin yazdığı bir sertifika geliyor. Bu her kalibre edilen Sensör için önemlidir. Ancak aradan geçen zaman içinde datasheetten de görülebileceği gibi; NEM de yılda %0,5 gibi bir sapma yapabileceğini; organik ortamlarda bu sapmanın daha yüksek olabileceği belirtiliyor.

am2315-i2c-dijital-cikisli-nem-ve-sicaklik-sensor-modulu-3

 

AM2315 Sensör kafası resimlerde görüldüğü gibi 10cm uzunluğunda ve 1,6cm kalınlığındadır.

 

am2315-i2c-dijital-cikisli-nem-ve-sicaklik-sensor-modulu-4

Kullanım;

AM2315, belirtildiği gibi Sensör I2C protokolü ile haberleşmektedir. Burada I2C protokolüne girmeyeceğim, ancak dikkat edilmesi gereken konulara dikkat çekeceğim.

am2315-i2c-dijital-cikisli-nem-ve-sicaklik-sensor-modulu-5

am2315-i2c-dijital-cikisli-nem-ve-sicaklik-sensor-modulu-6

Çinceniz zayıfsa yardımcı olalım 🙂

Besleme Pozitif +             :              KIRMIZI –  (3,3 ~ 5,5V)

Haberleşme DATA           :              SARI       –  SDA

Besleme Negatif              :              SIYAH    –  GND

Haberleşme CLOCK         :              BEYAZ   –  SLC

herhangi bir Arduino ile kullanacaksanız, Adafruit sitesinde bunun için sketch hazırlamışlar, buradaki linkten ulaşabilirsiniz.

AM2315, Bağlantı Kırmızı +5V, Siyah GND ye bağlanır SARI-SDA Arduino da ‘A4’ ve BEYAZ-SCL arduino da ‘A5’ e bağlanır. Tabi her I2C hattında olduğu gibi SDA ve SLC 3K – 10K arası bir direnç ile +5V’a bağlanmalıdır. Sonra örnek sketch’i  kendi programınıza dahil ederek çalıştırabilirsiniz. Örnekte sadece I2C protokolü ile okuma yapılmaktadır. Dolayısı ile bu örneği kendi programınıza dahil etmeniz ve okunan değeri örnek seri porta göndermeniz gerek.

Dikkat edilmesi gereken husus; en fazla saniyede bir okuma yapın zira yarım saniyenin altında bir okuma yapılması durumunda sensör abuk rakamlar verebiliyor.

Sensörümüz Standart hız yani 100Kbit/saniye de kullanılır. Ancak daha sonra da vereceğimiz tüyolarda da belirteceğimiz gibi daha düşük hızlarda kullanıla bilinir.

Programlayıcı tekniği açısından sensör 7 bit ve tek I2C adresleme kullanıyor. Bu adres 0xB8 yani Komut ve yazma gönderirken 0xB8, okuma yaparken 0xB9 kullanılır.

Komut olarak 0X03 registerlerden oku ve  0x10 registerlere yaz

Okunacak önemli registerler

0x00      Nem RH Üst Byte

0x01      Nem RH alt Byte

0x02      ISI Üst Byte

0x03      ISI alt byte

Buna göre alınan değer 16bitlik bir değer yani NEM = (Üst Byte X 256) + Alt Byte. Sonuç RH değeri  X10 yani RH eğer 62,3 ise yukarıdaki değer NEM=623 olacaktır.

Isıda ise durum biraz farklı zira 0 altı ölçümlerde Üst byte’ın 7.biti (MSB) ISI nın negatif olduğunu gösteriyor.

Okuma sonrası bu bit kontrol edilir ve saklanarak sıfırlanır. Sonra prosedür nemde ki gibi aynıdır.

ISI = (ISI Üst Byte x 256) + ISI alt Byte.  Alınan sonuç yine Nem gibi gerçek ISI değerine ulaşmak için 10’a bölünür. Sonra daha önceki sakladığımız eksi biti 1 ise ISI’nın önüne eksi eklenir.

Basit bir C Örneği :

float  CalcTemp()                                                // ISI değeri  ISI_Ust ve ISI_alt değerlerine okunmuş

{

  char Eksi_On =0;

  float  TEMP=0;

  if (ISI_ust  &  0x80) {                                        // MSB (most significant bit) maskele –negatif bit

      Eksi_On=1;

   }

   ISI_Ust &= 0x7F;                                              // Üst değeri al ve varsa negatif işiaretini kaldır

   TEMP=ISI_Ust*256;                                         // Üst byte

   TEM +=ISI_alt;                                                 // ISI değeri şimdi  -10°C ve 90°C için 100  900 arası bir değer

   TEM/=10;                                                          // ISI şimdi gerçek değerinde 10,0°C ve 90,0°C

    if (Minus_On==1) {                                         // eğer sıcaklık eksi değerde ise

       TEM*=-1;                                                      //  eksi 1 ile çarp

     }                        

return TEM;

}

Daha kısa yazılmak istenirse

float  CalcTemp()                                                               // ISI değeri  ISI_Ust ve ISI_alt değerlenine okunmuş

{

  if (ISI_ust  &  0x80) {                                                        // MSB varsa  –negatif bit

      return ((ISI_UST & 0x7F)*256 +ISI_alt)/10;

   }

   else {

      return (((ISI_UST & 7F)*256 + ISI_alt)/10)*-1;

   }

}

 

AM2315 Sıcaklık, Nem ve Isı Sensörü kullanımında programlamada 4 konuya dikkat edilmeli:

  1. Sensör okuması veya uyandırılması programın hemen başlangıcında yapılmamalı. Zira ilk akım geldiğinde okumaya çalışılması durumunda sensörün ayağa kalkması biraz geç kalabiliyor. Dolayısı ile I2C hattını kilitleyebiliyor. Çözüm olarak programın ilk girişine bir yarım saniyelik gecikme bunu önlüyor. Örnek “Delay_ms(500);”
  2. Yaklaşık 1 saniye aralıklar ile okumak; hem kendi kendini ısıtmasından kaynaklanan ölçüm hatalarını, hem de kargaşayı önlüyor.
  3. Sensörü uyandırmak için bir boş komut gönderiliyor. Okuma yaparken okuma komutlarını ADAFRUIT arka arkaya iki kez yapıyor bende öyle yapıyorum sıkıntı çıkmıyor.

AM2315 Sıcaklık, Nem ve Isı Sensörü ile ilgili tüyolar

Sensör kablosu 50cm bunu örnek 2 metreye çıkarabilirmiyiz?

Normalde I2C kısa mesafe protokolüdür (inter integrated circuit). Fakat uzun mesafe için bazı koşulların yerine getirilmesi gerekir. Bunlar I2C standartlarında sinyal yükseliş ve iniş hızlarıdır. Kablolarda bir kapasitif değer vardır bu kablo uzadıkça yükselir. Kablo kapasitesinin şarj edilmesi kullandığımız 3K-10Kohm arası değerleridir. Eğer kablomuz uzun ise ve 10Kohm takmış isek haliyle şarj süresi uzun olacaktır. Ama 3,3Kohm takmış isek şarj süresi kısalacaktır burada SDA & SCL Rise time dikkate alınmalıdır. Bu da maksimum 1000nSaniyedir. Daha küçük direnç takmamız durumunda sensörün maksimum akım çekme sınırı yaklaşık 8mA dir burada iniş hızı dikkate alınmalıdır SDA & SLC Fall Time maksimum 300nSaniye, yani 8mA ile hem direnç yükünü hem kablo şarj yükünü 300nS içinde tamamlaması gerekir. Sonuç olarak ben 2,7Kohm dirençler ile 1,5mlik USB kablosu ile sorunsuz çalışmasını sağladım.

I2C hızını düşürsek sorun olur mu?

Sorun olmuyor örnek olarak ben 40Kbit/san ve 20Kbit/san de denemeler yaptım.

Aynı porta 2 adet veya daha fazla sensör takılabilirmi?

Tüm sensörlerde aynı adres olduğundan kanala başka aynı sensörden takılamıyor. Fakat başka I2C entegreler bağlanabilir.

Uyandırma fonksiyonu

char WakeUpSensor(){                           // uyandırma fonsiyonu              

  char cvp; 

  cvp=I2C1_Start();                                    // returns 0 if OK

  I2C1_Wr(AM2315_I2CADDR);        // send byte via I2C  (device address + W 0xB8)

  I2C1_Stop();

  return cvp;

}

Örnek okuma fonksiyonu

ReadI2HumTemp(){

  char cvp;

  I2C1_Start();                                                      // I2C start sinyali

    I2C1_Wr(AM2315_I2CADDR);                     // I2C üzerine adresi yazma komutu (adres + W =0xB8)

    I2C1_Wr(AM2315_READREG);                    // Okuyacağız komutu (Funksiyon kodu –OKU  = 0x03)

    I2C1_Wr(0x00);                                              // gönder (başlangıç adresi)

    I2C1_Wr(0x04);                                              // gönder (okunacak adres sayısı)

    I2C1_Stop();                                                     // I2C stop sinyali

    Delay_us(100);                                                // biraz bekle – hazmetsin

    I2C1_Start();                                                    // I2C start sinyali

    I2C1_Wr(AM2315_I2CADDR);                     // I2C üzerine adresi yazma komutu (adres + W =0xB8)

    I2C1_Wr(AM2315_READREG);                    // Okuyacağız (Funksiyon kodu –OKU  = 0x03)

    I2C1_Wr(0x00);                                              // gönder (başlangıç adresi)

    I2C1_Wr(0x04);                                              // gönder (okunacak adres sayısı)

    I2C1_Stop();                                                     // I2C stop sinyali

    I2C1_Start();                                                    // I2C start sinyali

    I2C1_Wr(AM2315_I2CADDR+1);                 //  I2C Okuyoruz  (adres + OKU = B9)

    cvp  = I2C1_Rd(1);                                           // Veri  OKU  (acknowledge – Teyit al)  Fonksiyon kodu

    cvp  = I2C1_Rd(1);                                           // Veri  OKU  (acknowledge – Teyit al)  Gelen değer adedi

    NEM_UST = I2C1_Rd(1);                               // Veri  OKU  (acknowledge – Teyit al) NEM_UST

    NEM_Alt  = I2C1_Rd(1);                                // Veri  OKU  (acknowledge – Teyit al) NEM_Alt

    ISI_UST = I2C1_Rd(1);                                    // Veri  OKU  (acknowledge – Teyit al) ISI_UST

    ISI_Alt = I2C1_Rd(1);                                      // Veri  OKU  (acknowledge – Teyit al) ISI_Alt

    cvp  = I2C1_Rd(0);                                           //veri  OKu (NO acknowledge Teyit Alma) CRC checksum

    I2C1_Stop();                                                     // I2C stop sinyali

}

Sonuç: AM2513 hassasiyet açısından rakiplerini arattırmayacak özelliklere sahip bir sensör. Ayrıca alınan değerlerin formüller uygulamadan alınabilmesi ikinci bir artı. Son olarak profesyonel görünümlü kabı olması birçok yerde göreceğiz gibi görünüyor. Örnek olarak depolarda, hastanelerde, eczanelerde vs.

Ayrıca fiyat/performans oranı Direnc.net sayesinde son derece uygun.

Murat Tanatar




3 thoughts on “AM2315 Isı ve Nem Sensörü

  1. Hasan Elmas

    Guzel bir yazı olmuş. Tebrik ederim. Yalnız burada “sıcaklık” yerine sürekli “ısı” demişsiniz. Biliyorsunuz ısı hesaplamak için kütle ve fark sıcaklık degerini bilmeliyiz.

    Reply
    1. admin Post author

      Merhaba,

      Ölçüm değerleri arasında (-) eksi değerler de olduğundan “sıcaklık” yerine “ısı” terimi kullanılmaktadır.

      Reply

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir