ESP8266 ve DHT11 ile Sıcaklık ve Nem Ölçülmesi

DHT11 sıcaklık ve nem ölçen ucuz bir sensordur. Piyasada 4 ve 3 bacaklı tipleri satılmaktadır. Bu projede 4 bacaklı olan kullanılmıştır. Duyarlığı ve doğru ölçümü tartışmalı olabilir.

Bu proje Arduino IDE ile yapılacaktır. Öncelikle DHT ile ilgili kütüphanelerin yüklenmesi gerekmektedir. Yüklenecek kütüphaneler DHT library from Adafruit ile Adafruit Unified Sensor‘dür. Bunun için Araçlar -> Kütüphane Yöneticisi açılır. Arama çubuğuna yukarıdaki isimler teker teker yazılarak kütüphane aranır. Aşağıdaki iki görselde arama sonuçlarında görüntüler verilmiştir. Benim bilgisayarımda her iki kütüphanede yüklü olduğu için Kaldır düğmesi görünmektedir. Yüklü olmayanlarda Yükle düğmesi görünecektir.

Kütüphaneler yüklendikten sonra aşağıdaki görselde görünen bağlantılar yapılır. Kullanılan direnç 4,7 kOhm’dur. Besleme geriliminin 3,3 Volt olmasına dikkat edilmelidir.

Aşağıdaki program ESP8266 ya yüklenir. ESP’ye programın nasıl yükleneceği ESP8266-01 Programlanması yazısından açıklanmıştır.

/*********
  Bu projede ESP8266-01 ve DHT11 ile sıcaklık ve nem ölçülmesi
  değerlerin web sunucu üzerinden yayınlanması anlatılmaktadır.
  ckerdem.com
*********/

// ESP8266 WiFi ve DHT Kütüphaneleri eklenir
#include <ESP8266WiFi.h>
#include "DHT.h"

// Kullanılacak DHT tipinin önündeki ik bölü kaldırılır. Diğerlerine eklenir
#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321

// Kullanılacak kablosuz ağa göre ağ adı ve şifre düzenlenir
const char* ssid = "************";
const char* password = "**********";

// Web Server port 80 dedir
WiFiServer server(80);

// Bağlantının sabit IP ile yapılması için ayarlar (Kullanılacak ağa göre düzenlenir)
IPAddress staticIP(192,168,1,112);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);

// DHT Sensor
const int DHTPin = 2;
// DHT sensör başlatılır.
DHT dht(DHTPin, DHTTYPE);

// Sıcaklık değişkenleri
static char celsiusTemp[7];
static char fahrenheitTemp[7];
static char humidityTemp[7];

// Başlangıçta bir kere çalışır
void setup() {
  // Seri port başlatılır
  Serial.begin(115200);
  delay(10);

  dht.begin();
  
  // Kablosuz ağa bağlanma
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.config(staticIP, gateway, subnet);
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  
  // Sunucuyu başlatma
  server.begin();
  Serial.println("Web server running. Waiting for the ESP IP...");
  delay(10000);
  
  // ESP IP adresini seri porttan yazdırma
  Serial.println(WiFi.localIP());
}

// Bu bölüm sürekli tekrarlanır
void loop() {
  // Yeni istemci için kanal dinlenir
  WiFiClient client = server.available();
  
  if (client) {
    Serial.println("New client");
    // HTTP isteğinin ne zaman sona erdiğini belirten boolean değer.
    boolean blank_line = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        
        if (c == '\n' && blank_line) {
            // Sensör okumaları 2 saniyeye kadar 'eski' olabilir (çok yavaş bir sensör).
            float h = dht.readHumidity();
            // Sıcaklığı Santigrat cinsinden okunur (varsayılan).
            float t = dht.readTemperature();
            // Sıcaklığı Fahrenheit cinsinden okuyun (isFahrenheit = true)
            float f = dht.readTemperature(true);
            // Okuma işlemlerinde herhangi bir başarısızlık olup olmadığını kontrol edilir, başarısız olan durumlarda tekrar denemek için erken çıkış yapılır.
            if (isnan(h) || isnan(t) || isnan(f)) {
              Serial.println("Failed to read from DHT sensor!");
              strcpy(celsiusTemp,"Failed");
              strcpy(fahrenheitTemp, "Failed");
              strcpy(humidityTemp, "Failed");         
            }
            else{
              // Santigrat ve Fahrenheit cinsinden sıcaklık ve nem değerlerini hesaplar.
              float hic = dht.computeHeatIndex(t, h, false);       
              dtostrf(hic, 6, 2, celsiusTemp);             
              float hif = dht.computeHeatIndex(f, h);
              dtostrf(hif, 6, 2, fahrenheitTemp);         
              dtostrf(h, 6, 2, humidityTemp);
            }
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");
            client.println("Connection: close");
            client.println();
            // Sıcaklık ve nemi gösteren gerçek web sayfası
            client.println("<!DOCTYPE HTML>");
            client.println("<html><head><meta charset=\"UTF-8\">");
            client.println("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
            client.println("<link rel=\"stylesheet\" href=\"https://use.fontawesome.com/releases/v5.7.2/css/all.css\" integrity=\"sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr\" crossorigin=\"anonymous\">");
            client.println("<style>");
            client.println("html {font-family: Arial;");
            client.println("display: inline-block;");
            client.println("margin: 30px auto;");
            client.println("text-align: center;}");
            client.println("h1 { font-size: 3.0rem;}");
            client.println("h2 { font-size: 2.5rem; }");
            client.println("i { font-size: 3.0rem; }");
            client.println("</style>");
            client.println("</head><body>");
            client.println("<h1>ESP8266 - Sıcaklık ve Nem</h1>");
            client.println("<i class=\"fas fa-thermometer-half\" style=\"color:#059e8a;\"></i><h2>Sıcaklık:");
            client.println(celsiusTemp);
            client.println("*C  Santigrad</h2><h2>Sıcaklık : ");
            client.println(fahrenheitTemp);
            client.println("*F  Fahrenheit</h2>");
            client.println("<i class=\"fas fa-tint\" style=\"color:#00add6;\"></i> ");
            client.println("<h2>Nem: % ");
            client.println(humidityTemp);
            client.println("</h2><h2>");
            client.println("</body></html>");     
            break;
        }
        if (c == '\n') {
          // yeni bir satır okumaya başladığında
          blank_line = true;
        }
        else if (c != '\r') {
          // mevcut satırda bir karakter bulduğunda
          blank_line = false;
        }
      }
    }  
    // istemci bağlantısı kapatılır
    delay(1);
    client.stop();
    Serial.println("Client disconnected.");
  }
}   
Share your love

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir