29 Mayıs 2014 Perşembe

Dijital termometre


Çeşitli deneylerde kullanmak için sıvılara sokabileceğim ve geniş bir ölçüm aralığına sahip bir termometre yapmak istiyordum. Bu termometrei raspberry pi ile kullanıp periyodik olarak ölçümler yapıp bir dosyaya kaydetmeyi planlamıştım. Termometre için aşağıda özellikleri kısaca listelenmiş olan DS 18S20 sensörünü kullandım.

  • Ölçüm aralığı: -55 °C - 125 °C
  • -10 °C - 85 °C aralığında ±0.5 °C hata
  • 9 bit (sensördeki bazı registerlar ve bir formülle daha duyarlı okumalar yapılabiliyor) çözünürlük
  • Ölçüm için gereken süre maksimum 750 ms

Termometre için raspberry pi ve bağlantılar dışında sadece bir adet 4.7 kohm (dökümanlara göre 5 kohm civarında bir direnç yeterli) dirence ihtiyaç var. Devreyi önce bu linkteki gibi bir test kartında kurdum. Adafruit sayfasında 18S20 yerine 18B20 kullanılmış ama bu modellerin bağlantı özellikleri aynı olduğundan aynı devreyi kullanmak hiç sorun olmadı. Anladığım kadarıyla aradaki tek fark iki sensörün de ölçüm için kullandığı standard çözünürlük ( 18S20 9bit kullanırken, 18B20 9 bit ile 12 bit arasında ayarlanabiliyor). 18S20 ile 9 bitten daha duyarlı ölçümler için bazı registerler okunup üretici firma tarafından verilen formül kullanılabilir ama ben bütün bu işleri raspbian işletim sistemine bıraktım.

Devreyi deney kartında test ettikten sonra sensörün bacaklarını ileride sıvıyla temas etmesin diye ısıya dayanıklı silikon ile kapladıktan sonra üzerlerine bir de makaron geçirdim. Sonuçta aşağıdaki fotoğraftaki gibi bir termometre elde ettim.


Bu termometreyi raspberry pi kartına takmak için de delikli kart yardımıyla aşağıdaki devreyi hazırladım.



Sensörle iletişim için gereken protokolü aktifleştirmek için aşağıdaki komutları kullanmak gerek.

$ sudo modprobe w1-gpio
$ sudo modprobe w1-therm


Bu aşamada /sys/bus/w1/devices/ dizini altında 10-000802c61744 şeklinde bir dizin belirecektir. Eğer DS 18B20 sensörü kullanılmışsa dizin adı 20- şeklinde olacaktır. Dizin adındaki geri kalan kısım ise kullanılan sensörün seri numarasıdır yani başka sensörlerde farklı bir isim çıkması normaldir. Eğer /sys/bus/ altında w1 dizini tanımlı değilse ya protokol etkinleştirilememiştir ya da raspberry pi üzerinde GPIO4 pini yerine başka bir pin kullanılmıştır.

1-wire protokolünün çalışıp çalışmadığını 

$ lsmod 

komutuyla test edebiliriz. Eğer çalışıyorsa komutun çıktısında aşağıdaki gibi satır bulunmalıdır.

$ wire 24629 2 w1_gpio,w1_therm 

Eğer bu modüller raspbian her başlatıldığında yüklensin istiyorsak bu komut işimizi görecektir:

$ sudo echo >> /etc/modules w1-gpio && sudo echo >> /etc/modules w1_therm

Bu komutla termometrenin o anki değeri okunabilir:

$ cat /sys/bus/w1/devices/10-000802c61744/w1_slave

Komutun çıktısı aşağıdaki gibi olacaktır.

27 00 4b 46 ff ff 06 10 8e : crc=8e YES
27 00 4b 46 ff ff 06 10 8e t=19375

t=19375 kısmı sıcaklığın bulunduğu kısımdır. Buradaki örneğe göre sıcaklık 19.375 derecedir. Sıfırın altındaki sıcaklıklar t=-1612 gibi gösterilmektedir ve -1.612 derece demektir.

Yukarıdaki çıktıdan sadece sıcaklık değerini alıp dereceye çevirmek için aşağıdaki skripti kullandım. Bu skripti /usr/bin/temperature dosyasına koydum.

#! /bin/bash
 
tempread=`cat /sys/bus/w1/devices/10-000802c61744/w1_slave`
temp=`echo $tempread | egrep -o '[-]*[0-9]*$'`
temp2=`echo "scale=3; $temp / 1000" | bc | awk '{printf "%f", $0}'` 
timestamp=`date +"%T"` 
echo $timestamp " " $temp2

Bu skripti kullanabilmek için bc paketini kurmak gerekti.

$ sudo aptitude update
$ sudo aptitude install bc
$ chmod +x /usr/bin/temperature


Son komutla yazdığımız skripti çalıştırılabilir hale getirdim. Bu skriptin çıktısını bir dosyaya atmak için başka bir skrip yazıp /usr/bin/acquire_temperature dosyasına koydum.

#! /bin/bash


echo `temperature` >> /home/pi/data/temperature.dat

Bu skripin çıktıyı yazacağı dosya (temperature.dat) benim sistemimde /home/pi/data dizininde yaratılıyor.

$ chmod +x /usr/bin/acquire_temperature

Bu skripti periyodik olarak çalıştırıp sonuçları bir dosyaya atmak için de aşağıdaki komutu kullandım. Bu komut (hemen hemen) her saniye, sıcaklık değerini alıp dosyaya yazan skripti çalıştırıyor.

$ watch -n 0.1 acquire_temperature

Bu komut çalıştıkça dosyaya her satırında önce o anki saat ve sonra da bir boşluktan sonra o ölçülmüş olan anlık sıcaklık değeri bulunan bir kayıt eklenir. Örneğin

09:12:39 21.750000
09.12.40 21.750000
09.12.42 21.812000

Yukarıda yapmış olduğum ölçümlerden birinin başlangıç kısmını koydum. Dikkat edilirse ölçümler bazen bir saniye atlayabiliyor ama bu benim kullanım amacım için ciddi bir sorun oluşturmuyor. Bir başka nokta da sıcaklık değerinin sonundaki sıfırlar. Bunlar temperature skriptindeki bc komutundan sonra kullandığım awk komutundan geliyor ve oradaki printf komutuyla istenirse bu sıfırlar kaldırılabilir.

Bu toplanan verileri gnuplot ile bir grafik haline getirmeyi daha sonraki bir yazıda anlatacağım.

Kaynaklar:

http://kopfkino.irosaurus.com/tutorial-ds18s20-temperatur-sensor-an-einem-raspberry-pi/

https://learn.adafruit.com/adafruits-raspberry-pi-lesson-11-ds18b20-temperature-sensing/hardware


Hiç yorum yok:

Yorum Gönder