Raspberry Pi ile bira sıcaklığı ölçümü

Bir süredir evde bira yapmayı düşünüyordum sonunda karar verdim. 3 hafta kadar önce butikbira.com adresinden hazır bira setlerinden ve stout tipinde bira kiti satın aldım ve hemen o gün seti kurup başladım. Evde bira yapmanın en zor yanları kullanılan malzemenin temizliği ve mayalanma ortamının sıcaklığını korumak. Temizlik için gereken sabır ve dikkat iken sıcaklık konusu biraz daha büyük ve sorunlu bir durum. Mayalanma kovasının sıcaklık kontrolünü daha önceden Çin’den aldığım USB termometre ile yapıyordum ancak güvenilir bulmadım. Biraz araştırıp gerekli cihazın DS18B20 olduğunu öğrendim.

DS18B20’nin üç ayrı modeli var; transistör şeklindeki probe, su geçirmez plastik ile kaplanmış olan ve sıvı ölçümleri için de kullanılabilen probe ve sensörün hazır PCB kartı takılmış hali. Ben belki mayalanma kovasının içine de yerleştirebilirim diye düşünerek su geçirmeyen modelini internetten satın aldım. Bu 3 ayrı modelden PCB dışındakileri kullanabilmek için ek olarak 4.7k Ohm/0,25 W (sarı-mor-kırmızı-altın) bir dirence ihtiyacınız olacak. (PCB olanda direnç PCB’ye gömülmüş durumda olacaktır.)

ds18b20-waterproof

Evde boşta duran Raspberry B+ ‘ı bu iş için kullanmaya karar verdim. Sensörü hazırlamak ve Raspberry’ye bağlamak benim gibi elektronik cahili biri için bile çok basit. Sensörün üç kablosu var ve bunların Raspberry’de hangi GPIO pine bağlanacağı aşağıdaki gibi;

1
2
3
Kırmızı - 3.3v - PIN1
Sarı - Data      - PIN7 (GPIO4)
Siyah - Topraklama - PIN6 (GROUND)

Bağlantıları yaptıktan sonra komutu çalıştırdıktan sonra Raspberry’yi yeniden başlatmanız gerekiyor.

1
echo "dtoverlay=w1-gpio" >> /boot/config.txt

Raspberry yeniden başlatıldıktan sonra ise yapılması gereken DS18B20’nin veri alabilmesi için gerekli kernel modüllerini yüklemek. Bunun için aşağıdaki komutları çalıştırın.

1
2
3
echo "modprobe w1-gpio" >> /etc/modprobe.d/ds18b20-temp
echo "modprobe w1-therm" >>  /etc/modprobe.d/ds18b20-temp
modprobe -a

Modüllerin başarılı bir şekilde yüklendiğini ve sensörün sıcaklık okuyabildiğini aşağıdaki komutla deneyin. Komut çıktısında t=18437 rakamı celcius olarak sıcaklığı veriyor ve bu değeri 1000′ e bölmelisiniz.

1
2
3
root@beerpi:~# cat /sys/bus/w1/devices/w1_bus_master1/28-*/w1_slave
27 01 4b 46 7f ff 0c 10 8d : crc=8d YES
27 01 4b 46 7f ff 0c 10 8d t=18437

Sensörün başarıyla sıcaklık okuduğundan emin olduktan sonra okuma işlemini bir script haline getirerek aldığınız değeri istediğiniz ortama (veritabanı, grafik, log dosyası vb.) aktarabilirsiniz.

BASH script örneği;

1
2
3
4
5
6
7
8
#!/bin/bash
# beertemp.sh
# GPIO bagli DS18B20 sicaklik sensorunden celcius alinan degeri log dosyasina ekleyen script

simdi=$(date "+%Y/%m/%d %H:%M:%S")
temp=$(cat /sys/bus/w1/devices/w1_bus_master1/28-*/w1_slave | grep "t=" | awk -F'=' '{print $2/1000}')

echo "$simdi - $temp" | tee -a /var/log/temp.log

Scripti crontab içerisine ekleyerek istediğiniz zaman aralığı ile sıcaklığın kaydedilmesini sağlayabilirsiniz.

1
echo "*/2 * * * * root /bin/sh /usr/local/bin/beertemp.sh 2>&1

Python script örneği; (Belirli sıcaklık değerleri dışında uyarı gönderecek şekilde değiştirilmiş hali)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/usr/bin/python

import os                                                  # import os module
import glob                                                # import glob module
import time                                                # import time module
import urllib2
import subprocess
import logging
from math import trunc
                               
base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '28*')[0]
device_file = device_folder + '/w1_slave'

logging.basicConfig(filename="/var/log/beertemp.log", level=logging.INFO)
simdi = time.strftime("%Y/%m/%d-%H:%M:%S")

def read_temp_raw():
   f = open(device_file, 'r')
   lines = f.readlines()
   f.close()
   return lines

def read_temp():
   lines = read_temp_raw()
   while lines[0].strip()[-3:] != 'YES':
      time.sleep(0.2)
      lines = read_temp_raw()
   equals_pos = lines[1].find('t=')
   if equals_pos != -1:
      temp_string = lines[1][equals_pos+2:]
      temp_c = float(temp_string) / 1000.0                 # convert to Celsius
      #temp_f = temp_c * 9.0 / 5.0 + 32.0                   # convert to Fahrenheit
      #return temp_c, temp_f
      return temp_c

beerTemp   = read_temp()
degree     = '{:d}'.format(trunc(beerTemp))
notify_url = "http://yourwebpage/notify.php?msg=Bira+Sicakligi:+%s+%s" % (simdi, beerTemp)
log_msg    = "%s - Bira Sicakligi: %s" % (simdi, beerTemp)

if (degree >= 16 or degree <= 25):
        logging.info(log_msg)
else:
        request = urllib2.urlopen(notify_url).read()
        logging.warning(log_msg)

Daha sonra isterseniz sensörü bira mayalanma kovasına yapıştırabilir, isterseniz kova kapağında kablo için delik açıp sensörü şerbete daldırabilirsiniz. Deliğin etrafını Starsan ile arındırıp sıcak silikon uygulayabilirsiniz. Kablonun kova içindeki kısımlarına da Starsan sürmeyi unutmayın 🙂

ds18b20 temperature read test

Leave a Reply


*