DHT11; 0-50oC derece arasındaki sıcaklık değerleri arasında 1-2oC derece hassasiyetle, %20Rh – %90Rh aralığında nem değerlerini %5 hassasiyetle ölçebilen bir sıcaklık ve nem sensörüdür. Her ölçümde; 8bit tamsayı nem verisi, 8bit ondalık nem verisi, 8bit tamsayı sıcaklık verisi, 8bit ondalık sıcaklık verisi ve 8bit check sum olmak üzere 40bit veri oluşturur.
DHT11 sensörü, Arduino uygulamalarında genellikle şekildeki gibi modül şeklinde kullanılır. Bu yazıda DHT11’den ölçülen sıcaklık ve nem verilerinin Python ile oluşturulan bir arayüzde (GUI) gerçek zamanlı olarak görüntülenmesi gerçekleştirilmiştir.
Malzemeler
- 1 adet Arduino
- 1 adet DHT11 sensör modülü
Bağlantı şeması
Kaynak kod
Arduino için kaynak kod aşağıdaki şekildedir. dht11.h kütüphanesini indirmek için tıklayınız.
#include <dht11.h> int DHT11_pin=7; dht11 DHT11_sensor; void setup() { Serial.begin(9600); } void loop() { int chk = DHT11_sensor.read(DHT11_pin); Serial.println((float)DHT11_sensor.temperature, 2); Serial.println((float)DHT11_sensor.humidity, 2); delay(1000); }
Yukarıdaki kaynak kod çalıştırıldığında Arduino seri port ekranında aşağıdaki şekilde sıcaklık ve nem bilgileri gösterilir.
Seri porttan okunan veriler aşağıdaki Python kodu ile GUI’de gösterilebilir.
import serial import time import tkinter as tk import threading import continuous_threading as ct d = serial.Serial("/dev/cu.usbserial-1420", 9600, timeout=1) gelen = d.readline() gelen = d.readline() dizi = [] def readSerial(): gelen = d.readline() gelen = gelen.decode("UTF-8") dizi.append(gelen) # seri porttan okunan veriyi diziye ekle if len(dizi) == 1: # dizide yalnız 1 veri varsa sadece sıcaklık bilgisi gelmiştir etiket1 = tk.Label(pencere,text = dizi[0]).place(x=80,y=20) elif len(dizi) == 2: # dizide 2 veri varsa hem sıcaklık hem nem bilgisi gelmiştir etiket2 = tk.Label(pencere,text = dizi[1]).place(x=80,y=50) dizi.clear() t1 = ct.PeriodicThread(0.1,readSerial) # readSerial fonksiyonunu periyodik olarak çalıştır pencere = tk.Tk() pencere.geometry("500x300") etiketS = tk.Label(text="Sıcaklık: ") etiketS.place(x=20,y=20) etiketN = tk.Label(text= "Nem: ") etiketN.place(x=20,y=50) t1.start() pencere.mainloop() d.close() # Seri bağlantıyı kapat
Burada dikkat edilmesi gereken, Arduino seri port bilgisinin Python’da doğru girilmesidir. Bunun için Arduino programının araçlar menüsündeki port bilgisi, yukarıdaki d = serial.Serial("/dev/cu.usbserial-1420", 9600, timeout=1)
kod satırındaki çift tırnak içindeki alana doğru şekilde girilmelidir.
Bu programda Arduino seri porttan sıcaklık ve nem olmak üzere iki farklı veri alınmaktadır. Gelen veriler oluşturulan dizi[]
adlı diziye dizi[0]
sıcaklık ve dizi[1]
nem olmak üzere eklenmektedir. Alınan veriler etiket1
ve etiket2
adlı label’lara yazıldıktan sonra dizi.clear()
komutu ile bir sonraki gelecek veriler için dizinin içi boşaltılmaktadır.
t1 = ct.PeriodicThread(0.1,readSerial)
komutu ile her 0,1 saniyede seri port verilerinin okunup etiketlere yazılması işlemi gerçekleştirilmektedir. PeriodicThread
metodunun kullanılabilmesi için threading
ve continuous_threading
kütüphaneleri programa eklenmiştir.
Program çalıştırıldığında oluşturulan GUI aşağıdaki şekildedir.