Islak Hacimler İçin Tam Otomatik Havalandırma Sistemi

Neden?

Islak hacimlerde, pasif havalandırmanın, nemi tahliye etmede yetersiz kaldığı durumlarda, evdeki mevcut havalandırma kapağını bozmadan, sıcaklık ve nem değerlerini düzgün bir düzeyde tutmak sık karşılaşılan bir problem. Benim de nemi, banyodan tahliye etmem gerekiyordu. Zira hem sağlıklı bir ortam amaçlıyordum hem de boyanın çürümesinin oluşturacağı kötü etkiyi ortadan kaldırmalıydım. Havalandırma kapağını bozmamalıydım çünkü kiracıyım. Sadece fan ve açma/kapama anahtarı yeterli olmayacaktı çünkü fanı kapatmayı unutuyorduk. O halde, tüm bu sorunlara çözüm üretmeliydim.

Araştırma

İlk olarak, insan için en uygun nem miktarını araştırdım(1). Yüzde 30 ile 60 arası bağıl nemin normal olduğu söylenmiş. İkinci olarak, hangi araçları kullanmalıyım ona karar verdim. Nem ölçmek için sensör, kontrol etmek için mikrodenetleyici ve belki telefon veya internetten de kullanmak için internet bağlantılı mikrodenetleyici (Uygulamamın ilk aşamasında internet özelliğini kullanmayacağım). Fan(fan seçimi için bkz.(2)) ve fanı kontrol etmek için röle. Tüm bu malzemeleri en uygun şekilde almalıydım. Kullanacağım ürünler ticari bir iş yapmadığım için hassas olmayabilirdi. Bu nedenle aşağıdaki ürünlere karar kıldım:

  • Banyo aspiratörü 120’lik (kendi banyonuza göre 2’deki gibi seçim yapabilirsiniz.) (36 TL)
  • Esp8266 (21 TL-Çinden daha ucuza gelebilir.)
  • Tek kanal esp8266 için röle(34 TL).
  • DHT11 sıcaklık nem sensörü (9 TL)

Ürünleri aldıktan sonra nem kontrolünü nasıl yapacağıma karar vermem gerekiyordu. Önce sensörü denedim. Thingspeak platformuyla konuşturdum. Banyo durumunda %90’lara yakın bir nem oranı görülüyor. Sensör, ölçümde nem artışında düzgün şekilde çalışıyor. Fakat derece ve nem miktarı azaldığında aynı hassasiyeti gösteremiyordu. Fanı 40 dk çalıştırdığım halde nem miktarında gözle görülür bir azalma olmasına rağmen, sensörden aynı sonucu okuyamıyordum. Sensörün üstünü sildikten sonra normal bir sonuç verdi. O zaman banyo nemlendiğinde fan ne kadar sürede nemi tahliye edebiliyor onu ölçmem gerekiyordu. Bu sayede sensör yanılsa bile belirli bir süre sonra fan kendiliğinden kapanacak ve olası bozulmaların önüne geçebilecektim. Thinkspeak’ten sensörü temizleyerek ara ara ölçüm aldım. Yaklaşık olarak 20 dk’da hem nemde gözle görülür bir azalma vardı hem de sensör pratikle aynı sonucu gösteriyordu. Thinkspeak ile esp8266 nasıl iletişim kuruyor merak ediyorsanız linki inceleyebilirsiniz. Deep sleep özelliği ile çalıştırdığım kod parçası aşağıdaki gibidir.

#include <ThingSpeak.h>
#include <SimpleDHT.h>
#include <ESP8266WiFi.h>

#define PIN_DHT 2

const char* ssid = "xx";
const char* password = "xx";


//WiFiServer server(80);
SimpleDHT11 dht11(PIN_DHT);
WiFiClient tsClient;

int val;
void setup() {
  Serial.begin(9600); //Röle ile haberleşmesi için bağlantı hızı 9600 olmalı.
  delay(10);
  WiFi.mode(WIFI_STA);
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);



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

  // Server başlıyor
  //server.begin();
  //Serial.println("Server started");

  // IP adresi yazıyor.
  Serial.println(WiFi.localIP());
  //thinkspeak ayarlari yapiliyor
  ThingSpeak.begin(tsClient);
  
 
}

void loop() {

  byte temp, humi = 0;
  int err = SimpleDHTErrSuccess;
  //Serial.print("sicaklik degerleri okunacak...");
  while ((err = dht11.read(&temp, &humi, NULL)) != SimpleDHTErrSuccess) {
    //Serial.print("Read DHT11 failed, err=");
    //Serial.println(err);
    delay(1000);
    //return;
  }
  Serial.print("temperature:");
  Serial.print((int) temp);
  Serial.print(" humidity:");
  Serial.print((int) humi);
  Serial.println();
  
  // Write value to Field 1 of a ThingSpeak Channel
  int httpCode = ThingSpeak.writeField(xx, 1, temp, "xx");
  if (httpCode == 200) {
    Serial.println("Channel write successful.");
  }
  else {
    Serial.println("Problem writing to channel. HTTP error code " + String(httpCode));
  }
  delay(20000);
  httpCode = ThingSpeak.writeField(xxx, 2, humi, "xxxxx");
  if (httpCode == 200) {
    Serial.println("Channel write successful.");
  }
  else {
    Serial.println("Problem writing to channel. HTTP error code " + String(httpCode));
  }
  //delay(20000);
  /*Serial.println("Client disonnected");
     /
  */
  //40 saniye deep sleep
   ESP.deepSleep(40e6);
}

Faydalandığım Kaynaklar ve Uygulama

Fanı hazırlamak için yukarıdaki youtube videosundan faydalandım. Burada tek fark ben normal bir banyo aspiratörü kullandım. Örnekte ise bilgisayar fanı kullanılmış. Arada çok fark yok.

Esp8266 ile ilgili çok fazla kaynak var. Ben kablolama için linkteki siteyi kullandım. Programı yazmak için arduino ide kullandım.

Kullandığım tek kanal röle, esp8266 için doğrudan bağlantı soketi sunuyor. Bu nedenle onunla ilgili bir çalışma yapmama gerek kalmadı. Sadece röleyi açacak ve kapayacak kodlar ürünü aldığım firmanın sitesinde mevcuttu. Değilse de ürünlerin hepsi aynı olduğu için yazdığım koddan faydalanabilirsiniz.

Rölenin gpio pin çıkışı olmadığı için lehimle doğrudan esp8266 üzerinden çıkış aldım ve dht11’in sinyal pinine bağladım. Linkteki siteden faydalanabilirsiniz. Benim röle, dht11 ve esp8266 troykam aşağıdaki gibi oldu.

Esp8266’yı aşağıdaki kodla programladım. Burada benim özel durumuma göre bir algotirma uygulandı. Benim durumumda, sensör hatalı çalıştığı için eğer 20 dk’da nemde bir düşme olmazsa fanı durduruyor ve 15 dk bekliyor. Bunun dışında nemi ölçüyor %65’ten fazlaysa fan çalışmaya başlıyor.

#include <SimpleDHT.h>
#include <ESP8266WiFi.h>

#define PIN_DHT 2
#define HUM_TEMP_LIMIT 65
#define MINUTE_IN_MILLISECOND 60*1000*1
#define RUN_DURATION_LIMIT (20*MINUTE_IN_MILLISECOND)
#define WAIT_TIME (1*MINUTE_IN_MILLISECOND)

const byte miBufferON[] = {0xA0, 0x01, 0x01, 0xA2}; //The hex code opens relay.
const byte miBufferOFF[] = {0xA0, 0x01, 0x00, 0xA1};//The hex code closes relay.


SimpleDHT11 dht11(PIN_DHT);

bool isRelayOn = false;
unsigned long currentTime = 0;
unsigned long elapsedTime = 0;
unsigned long startTime = 0;

void setup() {
  Serial.begin(9600); // for relay
  delay(10);
  // relay initial status
  Serial.write(miBufferOFF, sizeof(miBufferOFF));
  Serial.println();
}

void loop() {

  byte temp, humi = 0;

  int err = SimpleDHTErrSuccess;
  //Serial.print("sicaklik degerleri okunacak...");
  while ((err = dht11.read(&temp, &humi, NULL)) != SimpleDHTErrSuccess) {
    Serial.print("Read DHT11 failed, err=");
    Serial.println(err);
    delay(1000);
    //return;
  }

  if (humi > HUM_TEMP_LIMIT) {
    // humidity is more than limit
    if (!isRelayOn) {
      // Relay is not on
      if (elapsedTime > RUN_DURATION_LIMIT) {
        // and fan running time is more than RUN_DURATION_LIMIT then
        // fan must be turn off (relay is already off this statement is not sense)
        Serial.write(miBufferOFF, sizeof(miBufferOFF));
        isRelayOn = false;
      } else {
        // fan running time is less than RUN_DURATION_LIMIT but relay is not on then
        // Turn on must be turn on
        Serial.write(miBufferON, sizeof(miBufferON));
        // start time must be set
        startTime = millis();
        // relay flag is true
        isRelayOn = true;
      }

    } else {
      // relay is on
      if (elapsedTime > RUN_DURATION_LIMIT) {
        // fan running time is more than RUN_DURATION_LIMIT
        Serial.write(miBufferOFF, sizeof(miBufferOFF));
        // set related flag is false
        isRelayOn = false;
        elapsedTime = 0;
        delay(15 * MINUTE_IN_MILLISECOND); //
      } else {
        // fan running time is less than RUN_DURATION_LIMIT
        // do nothing cause relay has already turned on.
        // measure time
        currentTime = millis();
        elapsedTime = currentTime - startTime;
      }

    }

  } else {
    // humidity is less than HUM_TEMP_LIMIT
    if (isRelayOn) {
      // this is adverse(undesirable) condition so hum is less than limit and relay is on.
      // nevertheless we close the relay
      Serial.write(miBufferOFF, sizeof(miBufferOFF));
      // the following flag must be false.
      isRelayOn = false;
      elapsedTime = 0;
    }
  }

  delay(WAIT_TIME);


}

Sonuç

Fanı istediğimiz zaman kapayabilmemiz için fiziksel bir anahtarla birlikte monte ettim ve teste koydum. Sonuçta aşağıdaki gibi bir görüntü ortaya çıktı. Ev kullanımı için biraz şekilsiz. Düzgün çalıştığına kanaat getirirsem kutulayacağım.


Referanslar

  1. https://web.archive.org/web/20180225160138/http://www.brighthubengineering.com/hvac/81719-best-indoor-humidity-range-for-people-books-and-electronics/
  2. https://web.archive.org/save/http://www.aksamotorfan.com/aksamotor/sayfalar.asp?LanguageID=1&ID=4&cid=136
  3. https://web.archive.org/web/20180401043839/https://www.hobbyist.co.nz/?q=esp8266-firmware-update
  4. https://web.archive.org/web/20190504015935/https://community.thingspeak.com/tutorials/esp8266/building-the-internet-of-things-with-the-esp8266-wi-fi-module-and-thingspeak/
  5. https://web.archive.org/web/20171031050845/http://www.elec-cafe.com/esp8266-temperature-humidity-webserver-with-a-dht11-sensor/