Havalandırma Sistemine Elle Kontrolün Eklenmesi

Geçen yıl Haziran ayında havalandırma sistemi yapmıştım. Sistemi o zamandan beri sorunsuz kullanıyorum. Hatta bu kadar süre bozulmadan çalışması beni şaşırttı. Çünkü sistemi yapmak için kullandığım bileşenler çok ucuzdu. Bileşenlerden herhangi biri bu kadar süre içerisinde sorun çıkarabilirdi ama çıkarmadılar. Aşağıda nasıl yöntemler uyguladığıma dair yazıların linkleri bulunmaktadır. Bu yazıda da herhangi bir tarayıcı üzerinden Esp8266’ya bağlanıp fan’ı kontrol edebileceğim kod parçasını paylaştım.

Tam otomatik havalandırma sistemiyle bir sorunum yoktu. Kendi halinde düzgün bir şekilde çalışıyordu. Fakat eşim salgın dolayısıyla çamaşır suyuyla temizlik meselesini abarttığı için havalandırma yetersiz kalıyordu. Zaten fan kokuya değil neme duyarlı olarak çalışıyor. Bu nedenle eşimin istediği şekilde çalışmıyordu. Sonuçta kendisinden cihazı el yordamıyla kapayıp açabileceği bir geliştirme “talebi” geldi. Ben de sistemimdeki Esp8266’ya server özelliği katarak bu talebi karşıladım. Artık Esp8266’ya belirli bir ip üzerinden bağlanılabilecek ve el yordamıyla başlatılabilecekti. Nitekim öyle de oldu. Ek olarak açıldığında kapatmayı unutmak kolay olduğundan onu da sınırlandırdım. Sonuç olarak:

  • Nem arttığında kendi çalışan,
  • Herhangi bir tarayıcıdan bağlanıp el yordamıyla açıp kapatabileceğim,
  • Her durumda kapatmayı unutmanın önüne geçen,
  • Nemi tahliye etmedeki başarısından dolayı ıslak hacimdeki küf oluşumunu azaltan,
  • Sorunsuz çalışacağını düşündüğüm,

akıllı bir sistem ortaya çıktı. Kodlar aşağıdaki gibidir:

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

#define PIN_DHT 2
#define HUM_TEMP_LIMIT 65
#define SECOND_IN_MILLISECOND 1*1000
#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.
const char* ssid = "senin_wireless_baglantin";
const char* password = "wireless_parolan";


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

//web page
const char MAIN_page[] PROGMEM = R"=====(
<!DOCTYPE html>
<html>
<body>
<center>
<h1>WiFi Fan Ac/Kapa Uygulamasi</h1><br>
<a href="fanOn" target="myIframe">Ac</a><br>
<a href="fanOff" target="myIframe">Kapat</a><br>
Fan Durumu:<iframe name="myIframe" width="100" height="25" frameBorder="0"><br>
<hr>
</center>
 
</body>
</html>
)=====";


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

//===============================================================
// This routine is executed when you open its IP in browser
//===============================================================
void handleRoot() {
 String s = MAIN_page; //Read HTML contents
 server.send(200, "text/html", s); //Send web page
}
 
void handleFanon() {
 Serial.write(miBufferON, sizeof(miBufferON));
 Serial.println("relay acildi.");
 startTime = millis();
 isRelayOn = true;
 isNetRequest = true;
 server.send(200, "text/html", "Acik"); //Send ADC value only to client ajax request
}
 
void handleFanoff() {
 Serial.write(miBufferOFF, sizeof(miBufferOFF));
 Serial.println("relay kapandi.");
 isRelayOn = false;
 elapsedTime = 0;
 isNetRequest = false;
 server.send(200, "text/html", "Kapali"); //Send ADC value only to client ajax request
}



void setup() {
  Serial.begin(9600); //Röle ile haberleşmesi için bağlantı hızı 9600 olmalı.
  delay(10);
  WiFi.mode(WIFI_STA);
  // relay initial status
  Serial.write(miBufferOFF, sizeof(miBufferOFF));
  Serial.println("relay ilklendirildi.");
  Serial.println();
  // Connect to WiFi network for future features
  Serial.print("Connecting to ");
  Serial.println(ssid);
  // for future feature
  WiFi.begin(ssid, password);

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

  // Server başlıyor
  server.on("/", handleRoot);      //Which routine to handle at root location. This is display page
  server.on("/fanOn", handleFanon); //
  server.on("/fanOff", handleFanoff);
 
  server.begin();                  //Start server
  Serial.println("Server started");

  // IP adresi yazıyor.
  Serial.println(WiFi.localIP());


}

void loop() {
  server.handleClient();
  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);
    server.handleClient();
    delay(1000);
    //return;
  }
  Serial.print("temperature:");
  Serial.print((int) temp);
  Serial.print(" humidity:");
  Serial.print((int) humi);
  Serial.println();

  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));
        Serial.println("relay kapandi.");
        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));
        Serial.println("relay acildi.");
        // 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));
        Serial.println("relay kapandi.");
        // set related flag is false
        isRelayOn = false;
        elapsedTime = 0;
        isNetRequest = false;
        delay(15 * MINUTE_IN_MILLISECOND); // 15 dakika kapalı kalmaksızın asla calisma. Fandan dolayi ekledik bunu. Fan tekrar calismak icin dinlenecek.
      } 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;
        Serial.println("zaman hesabi yapildi");
        Serial.println("gecen zaman.");
        Serial.println(elapsedTime);
      }

    }
  delay(WAIT_TIME);
  } 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
      if (!isNetRequest){
        Serial.write(miBufferOFF, sizeof(miBufferOFF));
        Serial.println("relay kapandi.");
        // the following flag must be false.
        isRelayOn = false;
        elapsedTime = 0;
        delay(WAIT_TIME);
      } else {
          // relay is on
      if (elapsedTime > RUN_DURATION_LIMIT) {
        // fan running time is more than RUN_DURATION_LIMIT
        Serial.write(miBufferOFF, sizeof(miBufferOFF));
        Serial.println("relay kapandi.");
        // set related flag is false
        isRelayOn = false;
        isNetRequest = false;
        elapsedTime = 0;  
      } 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;
        Serial.println("zaman hesabi yapildi");
        Serial.println("gecen zaman.");
        Serial.println(elapsedTime);
        delay(SECOND_IN_MILLISECOND); //
      }
        }
    }
   
  }
  Serial.println("bekleniyor.");
 
}