ESP’de PROGMEM ve ESPAsyncWebServer kullanarak DHT11 ile sıcaklık ve nem ölçümü

Başka bir yazıda DHT11 ile sıcaklık ve nem ölçümü anlatılmıştı. Bu bağlantıdan ESP8266 ve DHT11 ile Sıcaklık ve Nem Ölçülmesi yazısına ulaşabilirsiniz.

Bu yazıda PROGMEM ve ESPAsyncWebServer kullanarak DHT11 ile sıcaklık ve nem ölçümünün nasıl yapılacağı anlatılacaktır.

Kütüphane yöneticisinden ESPAsyncWebServer ve ESPAsyncTCP kütüphanelerinin yüklenmesi gerekmektedir.

PROGMEM ve ESPAsyncWebServer ne olduğu ve nasıl kullanılacağı ESP’de PROGMEM ve ESPAsyncWebServer yazısında anlatılmıştır. Onun için bu yazıda bu bilgiler yinelenmeyecektir.

Araçlar -> Kütüphaneleri yönet yolu ile kütüphane yöneticisi açılır. Aşağıdaki görseldeki gibi ESPAsyncWebServer aratılır.

Benim bilgisayarımda yüklü olduğu için KALDIR butonu görünmekte. Yüklü olmayan bilgisayarda KUR butonu görünecektir. KUR butonuna basılarak kütüphane yüklenir.

Sonra ESPAsyncTCP kütüphanesi yukarıdakine benzer şekilde, aşağıdaki görseldeki gibi yüklenir.

Sırada DHT’nin DHT library from Adafruit ile Adafruit Unified Sensor kütüphanelerinin aşağıdaki görseldeki gibi yüklenmesi var.

Aşağı görseldeki devre hazırlanır. Bu devrede besleme geriliminin 3,3 volt olmasına özen gösterilmelidir.

ESP’ye yazılımın nasıl yükleneceği ESP8266-01 Programlanması yazısında anlatılmıştır. Onun için bu yazıda yinelenmeyecektir.

Yazılım aşağıdan kopyalanıp Arduino IDE’sine yapıştırılır.

// Gerekli kütüphanelerin yüklenmesi
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <Hash.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>

// WiFi bilgileri
const char* ssid = "SUPERONLINE_WiFi_3022";
const char* password = "MVAWJYRM7T3M";

// ESP ucu ve DHT cinsi belirlenmesi
#define DHTPIN 2   
#define DHTTYPE    DHT11 
 
// Web sunucu (port 80)
AsyncWebServer 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,119);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);

// Değişkenlerin tanımlanması
float temp = 0.0;					// Görüntülenecek sıcaklık
float nem = 0.0;					// Görüntülenecek nem
unsigned long currentMillis = 0;	// Ölçü aralarındaki süreyi ölçmek için değişken şimdiki zaman
unsigned long previousMillis = 0;	// Ölçü aralarındaki süreyi ölçmek için değişken önceki zaman
const long interval = 10000;		// İki ölçü arasıhdaki süre
float yeniT = 0.0;					// DHT'den okunan sıcaklık
float yeniN = 0.0;					// DHT'den okunan nem

// DHT sınıf başlatılıyor
DHT dht(DHTPIN, DHTTYPE);


// HTML içeriği PROGMEM'de
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
  <style>
    html {
     font-family: Arial;
     display: inline-block;
     margin: 0px auto;
     text-align: center;
    }
    h2 { font-size: 3.0rem; }
    p { font-size: 3.0rem; }
    .units { font-size: 1.2rem; }
    .dht-labels{
      font-size: 1.5rem;
      vertical-align:middle;
      padding-bottom: 15px;
    }
  </style>
</head>
<body>
  <h2>ESP8266 DHT Server</h2>
  <p>
    <i class="fas fa-thermometer-half" style="color:#059e8a;"></i> 
    <span class="dht-labels">Sıcaklık: </span> 
    <span id="sicaklik">%SICAKLIK%</span>
    <sup class="units">°C</sup>
  </p>
  <p>
    <i class="fas fa-tint" style="color:#00add6;"></i> 
    <span class="dht-labels">Nem: % </span>
    <span id="nem">%NEM%</span>
  </p>
</body>

<script>
setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("sicaklik").innerHTML = this.responseText;
    }
  };
  xhttp.open("GET", "/sicaklik", true);
  xhttp.send();
}, 10000 ) ;

setInterval(function ( ) {
  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      document.getElementById("nem").innerHTML = this.responseText;
    }
  };
  xhttp.open("GET", "/nem", true);
  xhttp.send();
}, 10000 ) ;
</script>

</html>
)rawliteral";

void setup() {
  Serial.begin(115200);	// Seri port başlatılıyor

  // WiFi bağlantısı
  WiFi.config(staticIP, gateway, subnet);
  WiFi.begin(ssid, password);
  Serial.print("WiFi bağlanıyor");

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println();
  Serial.print("Bağlandı! IP adresi: ");
  Serial.println(WiFi.localIP());

  // Ana sayfa gönderimi
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) {
    request->send_P(200, "text/html", index_html);
  });

  // Ölçulen sıcaklığın gönderilmesi
  server.on("/sicaklik", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(200, "text/plain", String(temp).c_str());
  });

// Ölçülen nem bilgisinin gönderilmesi
  server.on("/nem", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(200, "text/plain", String(nem).c_str());
  });
  
  // Server başlat
  server.begin();
}

void loop() {
	// 10 saniyede bir sıcaklığın ölçülmesi
  currentMillis = millis();
  if (currentMillis - previousMillis >= interval ) {
    // Eski zamana şimdiki zamanı yüklenmesi 
    previousMillis = currentMillis;
    // Sıcaklığın santigrad olarak ölçülmesi (Varsayılan)
    yeniT = dht.readTemperature();
    // Sıcaklığın fahrenteit olarak ölçülmesi (isFahrenheit = true)
    //float yeniT = dht.readTemperature(true);
    // Eğer sıcaklık okunamamışsa sıcaklık değerini değiştirme.
    if (isnan(yeniT)) {
      Serial.println("DHT sensorden sıcaklık okunamadı!");
    }
    else {
      temp = yeniT;
      Serial.println(temp);
    }
	
    // 10 saniyede bir nem ölçülmesi
    yeniN = dht.readHumidity();
    // Eğer nem okunamamışsa nem değerini değiştirme. 
    if (isnan(yeniN)) {
      Serial.println("DHT sensorden nem okunamadı!");
    }
    else {
      nem = yeniN;
      Serial.println(nem);
    }
  }
}
Share your love

Leave a Reply

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