31 Mayıs 2014 Cumartesi

gnuplot

Periyodik ölçümleri bir grafikte göstermek için gnuplot kullanılabilir. Örneğin toplanan sıcaklık verileri iki sütun halinde bir dosyada aşağıdaki şekilde tutulabilir:

09:36:57 -4.188
09:36:59 -4.188
09:37:00 -4.125
09:37:01 -4.125
09:37:02 -4.125
09:37:03 -4.063
09:37:04 -4.063

Birinci sütun saat:dakika:saniye formatında ölçümün yapıldığı anı gösteriyor ve ikinci sütun da o anda yapılan ölçümün değeri. Bu dosyada ölçümlerin birimleri tutulmuyor ama bu örnek sıcaklık ölçümünden alındığından birim santigrad.

Önce gnuplot uygulamasını kurmak gerekir:

$sudo apt-get install gnuplot, gnuplot-x11

Paketleri kurduktan sonra aşağıdaki komutlarla grafik ekranda gösterilebilir. 

$ gnuplot

gnuplot> set xdata time
gnuplot> set timefmt "%H:%M:%S"
gnuplot> set format x "%H:%M:%S"
gnuplot> set xlabel 'Zaman'
gnuplot> set ylabel 'Sıcaklık'
gnuplot> plot "/home/pi/data/temperature.dat" using 1:2 with lines

Eğer grafiği PNG formatında bir dosyaya aktarmak istersek plot komutundan önce çıktıyı aşağıdaki gibi yönendirmek gerekir.

gnuplot> set terminal png size 400,300 enhanced font "Helvetica,8"
gnuplot> set output 'output.png'

Bu şekilde kullanılınca gnuplot grafiği sadece dosyaya yazar, ekranda göstermez. Çıktıyı değişik formatlarda kaydetmek de mümkün. output.png dosyası daha sonra buradaki gibi bir web sayfasına ya da başka bir ortama yüklenebilir.






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