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.
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:
- HASSASİYET, (Precision) kalibre edilen Ölçüm aralığındaki sapma oranı.
- DOĞRULUK, (Linearity) örnek 0°C ve 100°C de hassasiyet %1 olabilir fakat 30°C de bu oran %5 olabilir.
- TEKRARLANABİLİRLİK (Repeatability) örnek 100°C ye çıkarıp 30°C ye indiğimizde 30°C ölçebiliyormuyuz. Ve bunun süresi .
- 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 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 Sensör kafası resimlerde görüldüğü gibi 10cm uzunluğunda ve 1,6cm kalınlığındadır.
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.
Ç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:
- 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);”
- 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.
- 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
}
Bu sensörden en az 15 tane kullandım. Şu ana kadar hiç sıkıntı çıkarmadı başımı ağrıtmadı hatta 5.5metre 4×0,50mm liycy kablo ile kullanıyorum 🙂 ve ne takılma ne donma ne de problem çıkarıyor. 10K’lık direnç takılı. Sanırım her şey yaptığınız yazılımda çözülüyor…