11
Oca
2022

DHT11 sensör verilerini Arduino-Python GUI seri haberleşme ile gösterme

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_threadingkütüphaneleri programa eklenmiştir.

Program çalıştırıldığında oluşturulan GUI aşağıdaki şekildedir.

%d blogcu bunu beğendi: