Isıya göre fan çalıştırma

Kod:
float sicaklik = 25; // V5 default fan çalışma sıcaklığı

#define DS18B20 12    // V3 ISI
OneWire ourWire(DS18B20);
DallasTemperature sensor(&ourWire);
BlynkTimer timer;

void sendSensor()
{
  sensor.requestTemperatures();
  float tempC=sensor.getTempCByIndex(0);
  Blynk.virtualWrite(V3, tempC);
  if (tempC>=sicaklik){
    digitalWrite(pin2, LOW);
    Blynk.virtualWrite(V2, LOW);}
  else { digitalWrite(pin2, HIGH);
    Blynk.virtualWrite(V2, HIGH);}
    digitalWrite(BUILTIN_LED, LOW);
    timer.setTimeout(1000L , []()
    {
      digitalWrite(BUILTIN_LED, HIGH);
    });
    Serial.print("Sıcaklık : "); Serial.println(tempC);
}

void setup() {
    Serial.begin(115200);
      pinMode(BUILTIN_LED, OUTPUT);
    sensor.begin();
      timer.setInterval(5000L, sendSensor);
}

void loop() {
  Blynk.run();
  timer.run();
  ArduinoOTA.handle();
}

kodun ilgili kısımlarını kırparak paylaştım. tavsiyelerinize açığım. Blynk üzerinden fan başlangıç sıcaklığı değiştirilebiliyor. Default değeri 25 olarak belirledim.
 
Kod:
float sicaklik = 25; // V5 default fan çalışma sıcaklığı

#define DS18B20 12    // V3 ISI
OneWire ourWire(DS18B20);
DallasTemperature sensor(&ourWire);
BlynkTimer timer;

void sendSensor()
{
  sensor.requestTemperatures();
  float tempC=sensor.getTempCByIndex(0);
  Blynk.virtualWrite(V3, tempC);
  if (tempC>=sicaklik){
    digitalWrite(pin2, LOW);
    Blynk.virtualWrite(V2, LOW);}
  else { digitalWrite(pin2, HIGH);
    Blynk.virtualWrite(V2, HIGH);}
    digitalWrite(BUILTIN_LED, LOW);
    timer.setTimeout(1000L , []()
    {
      digitalWrite(BUILTIN_LED, HIGH);
    });
    Serial.print("Sıcaklık : "); Serial.println(tempC);
}

void setup() {
    Serial.begin(115200);
      pinMode(BUILTIN_LED, OUTPUT);
    sensor.begin();
      timer.setInterval(5000L, sendSensor);
}

void loop() {
  Blynk.run();
  timer.run();
  ArduinoOTA.handle();
}

kodun ilgili kısımlarını kırparak paylaştım. tavsiyelerinize açığım. Blynk üzerinden fan başlangıç sıcaklığı değiştirilebiliyor. Default değeri 25 olarak belirledim.
Sizin kodunuzu basit bir "hysteresis" ilavesi ile çalıştırabilirsiniz.
(window comparator)

Arzu ederseniz daha sonra PID ye geçilebilir, avantajları şunlar olur:
PID ile sistem, hedef sıcaklığa daha hassas şekilde yaklaşır. Proportional (P) kısmı, sıcaklık farkına göre hızlı bir tepki verirken, Integral (I) kısmı uzun vadeli hataları düzeltir, Derivative (D) kısmı ise hızlı değişimleri dengeler.
Böylece röle daha az açılıp kapanır.
Özellikle ısıtıcıların gereksiz yere çalışmasını engelleyerek enerji tasarrufu sağlar.
Tabi bunlar büyük çapta düşünüldüğünde yani profesyonel işlerde büyük farklar oluşturur.

Ayrıca siz sadece LED in yanıp sönmesine 1 saniye gecikme koymuşsunuz yani:

digitalWrite(BUILTIN_LED, LOW); // LED yanıyor
timer.setTimeout(1000L , []() { // 1 saniye sonra LED sönecek
digitalWrite(BUILTIN_LED, HIGH);
});

Şimdi, histerezis eklediğinizde bu "1 saniye gecikme"ye gerek kalmıyor, tam tersi, sistemi dengesizleştirebilirsiniz, onun için önce alttaki kodu deneyin sonra gerekirse "gecikme" eklenebilir.

Kod şöyle olabilir:

float sicaklik = 25; // V5 default fan çalışma sıcaklığı
float histerezis = 0.5; // Histerezis aralığı (±0.5 derece)

#define DS18B20 12 // V3 ISI
OneWire ourWire(DS18B20);
DallasTemperature sensor(&ourWire);
BlynkTimer timer;

void sendSensor()
{
sensor.requestTemperatures();
float tempC = sensor.getTempCByIndex(0);
Blynk.virtualWrite(V3, tempC);

// Histerezis ile kontrol
if (tempC >= sicaklik + histerezis) {
// Sıcaklık hedefin üzerine çıktıysa röleyi kapat
digitalWrite(pin2, LOW);
Blynk.virtualWrite(V2, LOW);
}
else if (tempC <= sicaklik - histerezis) {
// Sıcaklık hedefin altına düştüyse röleyi aç
digitalWrite(pin2, HIGH);
Blynk.virtualWrite(V2, HIGH);
}

digitalWrite(BUILTIN_LED, LOW);
timer.setTimeout(1000L, []()
{
digitalWrite(BUILTIN_LED, HIGH);
});
Serial.print("Sıcaklık : "); Serial.println(tempC);
}

void setup() {
Serial.begin(115200);
pinMode(BUILTIN_LED, OUTPUT);
pinMode(pin2, OUTPUT); // Röle pininin modu belirlenmeli
sensor.begin();
timer.setInterval(5000L, sendSensor);
}

void loop() {
Blynk.run();
timer.run();
ArduinoOTA.handle();
}


Değişiklikler:
Histerezis Eklenmesi: sicaklik ve histerezis kullanılarak, sıcaklık eşiği civarındaki küçük dalgalanmaların röleyi sürekli açıp kapatması önlendi.

Röle Pin Modu: pinMode(pin2, OUTPUT); komutunu ekledim, rölenin çalışabilmesi için pinin çıkış olarak ayarlanması gerekiyor.
Büyük ihtimalle bu sizde vardı kırparken silmiş olabilirsiniz.

Histerezis Mantığı: Sıcaklık belirli bir aralığın üzerine çıktığında röle kapanıyor, belirli bir aralığın altına indiğinde ise açılıyor.
Bu şekilde, küçük sıcaklık değişimlerinde rölenin sürekli tetiklenmesini önleyebilirsiniz.
 
Son düzenleme:
Sizin kodunuzu basit bir "hysteresis" ilavesi ile çalıştırabilirsiniz.
(window comparator)

Arzu ederseniz daha sonra PID ye geçilebilir, avantajları şunlar olur:
PID ile sistem, hedef sıcaklığa daha hassas şekilde yaklaşır. Proportional (P) kısmı, sıcaklık farkına göre hızlı bir tepki verirken, Integral (I) kısmı uzun vadeli hataları düzeltir, Derivative (D) kısmı ise hızlı değişimleri dengeler.
Böylece röle daha az açılıp kapanır.
Özellikle ısıtıcıların gereksiz yere çalışmasını engelleyerek enerji tasarrufu sağlar.
Tabi bunlar büyük çapta düşünüldüğünde yani profesyonel işlerde büyük farklar oluşturur.

Ayrıca siz sadece LED in yanıp sönmesine 1 saniye gecikme koymuşsunuz yani:

digitalWrite(BUILTIN_LED, LOW); // LED yanıyor
timer.setTimeout(1000L , []() { // 1 saniye sonra LED sönecek
digitalWrite(BUILTIN_LED, HIGH);
});

Şimdi, histerezis eklediğinizde bu "1 saniye gecikme"ye gerek kalmıyor, tam tersi, sistemi dengesizleştirebilirsiniz, onun için önce alttaki kodu deneyin sonra gerekirse "gecikme" eklenebilir.

Kod şöyle olabilir:

float sicaklik = 25; // V5 default fan çalışma sıcaklığı
float histerezis = 0.5; // Histerezis aralığı (±0.5 derece)

#define DS18B20 12 // V3 ISI
OneWire ourWire(DS18B20);
DallasTemperature sensor(&ourWire);
BlynkTimer timer;

void sendSensor()
{
sensor.requestTemperatures();
float tempC = sensor.getTempCByIndex(0);
Blynk.virtualWrite(V3, tempC);

// Histerezis ile kontrol
if (tempC >= sicaklik + histerezis) {
// Sıcaklık hedefin üzerine çıktıysa röleyi kapat
digitalWrite(pin2, LOW);
Blynk.virtualWrite(V2, LOW);
}
else if (tempC <= sicaklik - histerezis) {
// Sıcaklık hedefin altına düştüyse röleyi aç
digitalWrite(pin2, HIGH);
Blynk.virtualWrite(V2, HIGH);
}

digitalWrite(BUILTIN_LED, LOW);
timer.setTimeout(1000L, []()
{
digitalWrite(BUILTIN_LED, HIGH);
});
Serial.print("Sıcaklık : "); Serial.println(tempC);
}

void setup() {
Serial.begin(115200);
pinMode(BUILTIN_LED, OUTPUT);
pinMode(pin2, OUTPUT); // Röle pininin modu belirlenmeli
sensor.begin();
timer.setInterval(5000L, sendSensor);
}

void loop() {
Blynk.run();
timer.run();
ArduinoOTA.handle();
}


Değişiklikler:
Histerezis Eklenmesi: sicaklik ve histerezis kullanılarak, sıcaklık eşiği civarındaki küçük dalgalanmaların röleyi sürekli açıp kapatmasını önlendi.

Röle Pin Modu: pinMode(pin2, OUTPUT); komutunu ekledim, rölenin çalışabilmesi için pinin çıkış olarak ayarlanması gerekiyor.
Büyük ihtimalle bu sizde vardı kırparken silmiş olabilirsiniz.

Histerezis Mantığı: Sıcaklık belirli bir aralığın üzerine çıktığında röle kapanıyor, belirli bir aralığın altına indiğinde ise açılıyor.
Bu şekilde, küçük sıcaklık değişimlerinde rölenin sürekli tetiklenmesini önleyebilirsiniz.
Mantığı şimdi daha iyi anladım. Ledi sensörün çalıştığını anlayabilmek adına koydum. Her seferinde acaba sistem çalışıyor mu düşüncesiyle uygulamayı kontrol etmek yerine lede bakıyorum :)

Destek ve yönlendirmeleriniz için teşekkür ederim
 

Forum istatistikleri

Konular
129,823
Mesajlar
930,519
Kullanıcılar
452,646
Son üye
ayhan600

Yeni konular

Geri
Üst