Posted by : MC 27 Şubat 2015 Cuma

Aslında oldukça sık kullanılan bir proje.Neredeyse ısınan her devrede bir sıcaklık sensörü ve bu sıcaklık sensörüne bağlı çalışan bir fan sistemi bulunmakta.Paylaşacağımız devreyi ise evinizdeki fanı oda sıcaklığına bağlı olarak hızlandırıp duruma göre yavaşlatabilirsiniz.


1 nolu analog pine bağlanmış olan lm35 sıcaklık sensöründen bilgi alınıyor.Sonrasında bu sıcaklık bilgisi bizim işleniyor ve sıcaklık durumuna göre DC fan hızlandırılıyor ya da yavaşlatılıyor.Nasıl mı ?

Arduninonun 11 nolu pwm çıkışı analog çıkış olarak kullanılmış.Daha önceki paylaşımlarımızda arduinonun pwm çıkışından nasıl analıg çıkış elde edilir paylaşmıştık.Burada kullanılan kapasitör ise fanın düzensiz çalışmasını engellemek amacı ile yani sarj ve desarj zamanları kullanılarak daha stabil bir base voltajı elde etmek için kullanılmış aynı zaman RC filtre devresi görmektedir.Burada esas husus siz pwm çıkışınızda ne kadar fazla cycle gönderir iseniz fanınız o kadar hızlı dönecektir.

Gelelim işin kod kısmına


#include <LiquidCrystal.h>
LiquidCrystal lcd(7,6,5,4,3,2);//lcd ekran noktaları belirlendi
int tempPin = A1; // lm35 sensörü okuma pini atandı
int fan = 11; // Fanın hız referans noktası
int led = 8; // led pin
int temp;
int tempMin = 30; // Fanın çalışması için min. sıcaklık seti
int tempMax = 70; // Fanın tam kapasitede çalışması için sıcaklık set değeri
int fanSpeed;// fan hızı için değişken tanımlanıyor
int fanLCD;
void setup() {
pinMode(fan, OUTPUT);// 11 nolu pwm çıkış olarak atandı
pinMode(led, OUTPUT);// fan devrede olup olmadıgını takip ledi çıkış atandı
pinMode(tempPin, INPUT);//sıcaklık degerini okuyacagımız 1 nolu analog pin giriş atandı
lcd.begin(16,2);// lcd başlatıldı
}
void loop() {
temp = readTemp(); // sıcaklık bilgisi okundu
if(temp < tempMin) { // sıcaklık bilgisi set degeri ile karsılastırıldı
fanSpeed = 0; // min set degerinden kucuk ise fan devrede degil ledi yakma
digitalWrite(fan, LOW);//fan cıkıs ucuna sıfır ver devreye sokma
}
if((temp >= tempMin) && (temp <= tempMax)) { // Sıcaklık min setten buyuk ise
fanSpeed = map(temp, tempMin, tempMax, 32, 255); // sıcaklık ile fan hızını map et
fanLCD = map(temp, tempMin, tempMax, 0, 100); // fan hızını lcd ye yaz
analogWrite(fan, fanSpeed); // 11 nolu pwm den fana hız ver
}

if(temp > tempMax) { // sıcaklıgımız maks. set degerinden fazla ise
digitalWrite(led, HIGH); // ledi yak
} else { // degilse
digitalWrite(led, LOW);//ledi sondur
}
lcd.print("TEMP: ");
lcd.print(temp); // lcd ye okdugumuz sıcaklık degerini yaz
lcd.print("C ");
lcd.setCursor(0,1); // lcd yazmayı bir alt satıra al
lcd.print("FANS: ");
lcd.print(fanLCD); // alt satıra fan hızını yaz
lcd.print("%");
delay(200);
lcd.clear();
}
int readTemp() { // int donuslu sıcaklık okuma fonksiyonumuz sıcaklıgı santigrata ceviriyor
temp = analogRead(tempPin);
return temp * 0.48828125;
}

Biraz daha bilgi verelim mesela nedir map() fonksiyonu.

Map fonksiyonu 2 fark limitlerdeki deişkenler arasında bir harita olusturur.Bu örnekte kullandığımız gibi fanımız 0 ile 255 (pwm çıkışında cycle kontrolü ile fan hızı kontrolü yapıldığından) ve sıcaklığımızın da min 30 ve maks 70 degerleri var.Map fonksiyonu bu degerler ve limitler arasındaki değişimler için karşılık oluşturur.30 sıcaklık için 10 0 cycle 40 için 50cycle 70 için 100cycle gibi.Bir nevi oransal bir kontrole sahip oluyoruz map fonksiyonu kullanarak.

Sistemin ise işleyişi gayet basit.Daha öncede bahsettiğimiz gibi her bir sıcaklık arasında bir fan hızı oluşturuluyor ve sıcaklıkla orantılı olarak fan kontrol ediliyor.Sıcaklığımız maks limit üzerine çıkarsa da uyarı ledimiz yakılıyor.



{ 17 Comments... read them below or Comment }

  1. temp=readTemp komutunda bir hata olabilir mi?

    YanıtlaSil
    Yanıtlar
    1. readTemp burada kullanıcı tanımlı bir fonksiyon komut degil nasıl bir hata alıyorsunuz paylasabilirseniz yardımcı olmaya çalışırım

      Sil
  2. aynı sorun bendede var hata mesajı
    'readTemp' was not declared in this scope

    YanıtlaSil
  3. 'read' was not declared in this scope
    BU ŞEKİLDE BİRHATA KODU ÇIKIYOR.

    YanıtlaSil
  4. HERKESE İYİ AKŞAMLAR.AYNIHATAYIBENDE GÖRÜYORDUM.HADDİM OLMAYARAK AŞAĞIDAKİİGİBİBİRDEĞİŞİKLİKYAPTIM ANCAK ELİMDE ARDUINO OLMADIĞI İÇİN DENEME ŞANSIM OLMADI. DENEYİP OLUMLU YADA OLUMSUZ BİLGİ VERİRSENİZ ÇOK SEVİNİRİM ÇÜNKÜ DAHA 5 GÜNDEN BERİ BU KONU İLE İLGİLENİYORUM. MAİL ATARSANIZ ÇOK İYİ OLUR. mahmutturkozmen@mynet.com
    #include
    LiquidCrystal lcd(7,6,5,4,3,2);
    int tempPin = A1;
    int fan = 11;
    int led = 8;
    int tempMin = 30;
    int tempMax = 70;
    int fanSpeed;
    int fanLCD;


    void setup()
    {
    pinMode(fan,OUTPUT);
    pinMode(led,OUTPUT);
    pinMode(tempPin,INPUT);
    lcd.begin(16,2);

    }

    void loop()
    {
    int temp = analogRead (tempPin*0.48828125);

    if(temp=tempMin)&&(temp<=tempMax))
    {
    fanSpeed = map(temp,tempMin,tempMax,32,255);
    {
    fanLCD = map(temp,tempMin,tempMax,0,100);
    analogWrite(fan,fanSpeed);
    }
    if(temp<tempMax)
    {
    digitalWrite(led,HIGH);
    }
    else{
    digitalWrite(led,LOW);
    }
    lcd.print("TEMP:");
    lcd.print(temp);
    lcd.print(" C ");
    lcd.setCursor(0,1);
    lcd.print(" FANS: ");
    lcd.print(fanLCD);
    lcd.print(" % ");
    delay(200);
    lcd.clear();
    }

    }



    YanıtlaSil
  5. mahmut senin kodda baya sıkıntı var çalışmıyor ekranda hiç bişey gözükmüyor

    YanıtlaSil
    Yanıtlar
    1. abi doğrudur valla 5 günde ancak bu kadar :) ama doğru yolu bulacam yakındır. tabi desteklerinizle.. Ahmet abi doğruyu bulunca yayınla da hatalarımı öğreneyim. çünkü aklımda çok ciddi projeler var PLC olsa bin defa yaparım ama karta mecburum öğrenmem lazım. takip ettiğin bu konuda eğitim ve örnekler hakkında tavsiye edeceğin site varsa yazarsan sevinirim abi

      Sil
  6. Ahmet abi şunu denermisin bi bende kart yokta
    #include
    LiquidCrystal lcd(7,6,5,4,3,2);
    int tempPin = A1; // sıcaklık sensörünün bağlandığı pin
    int fan = 11; // fan bağlandığı pin
    int led = 8; // aşırısıcaklık LED i
    int tempMin = 30; // sıcaklık minimum değeri
    int tempMax = 70; // sıcaklık maximum değeri
    int fanSpeed; //fan hızı
    int fanLCD; // ekrana fan hız yazdırma


    void setup()
    {
    pinMode(fan,OUTPUT); // fan çıkış pini yapıldı
    pinMode(led,OUTPUT); // led çıkış piniyapıldı
    pinMode(tempPin,INPUT); // sıcaklık sensörü giriş
    lcd.begin(16,2);

    }

    void loop()
    {
    int temp = analogRead (tempPin)*(0.48828125);

    if(temp=tempMin)&&(temp<=tempMax))
    {
    fanSpeed = map(temp,tempMin,tempMax,32,255);
    {
    fanLCD = map(temp,tempMin,tempMax,0,100);
    digitalWrite(fan,fanSpeed);
    }
    if(temp<tempMax)
    {
    digitalWrite(led,HIGH);
    }
    else{
    digitalWrite(led,LOW);
    }
    lcd.clear();
    lcd.print("TEMP:");
    lcd.print(temp);
    lcd.print(" C ");
    lcd.setCursor(0,1);
    lcd.print(" FANS: ");
    lcd.print(fanLCD);
    lcd.print(" % ");
    delay(200);
    lcd.clear();
    }

    }

    YanıtlaSil
  7. devrenin hatasız kodu aşagıdaki gibi kod uygulandı çalışıyor




    #include
    LiquidCrystal lcd(7,6,5,4,3,2); // LCD ekran noktaları belirlendi
    int SicaklikPin = A0; // LM35 sensöre okuma pini atandı
    int fan = 11; // Fanın hız referans noktası
    int led = 8; // led pin
    int Sicaklik;
    int SicaklikMin = 30; // Fanın çalışması için min.sıcaklık seti
    int SicaklikMax = 70; // Fanın tam kapasitede çalışması için sıcaklık set değeri
    int fanSpeed; // Fan hızı için değişken tanımlanıyor
    int fanLCD;

    void setup() {
    pinMode(fan, OUTPUT); // 11 nolu pwm çıkış olarak atandı
    pinMode(led, OUTPUT); // Fan devrede olup olmadığını takip ledi çıkış atandı
    pinMode(SicaklikPin, INPUT); // sıcaklık değerini okuyacagımız 1 nolu analog pin giriş atandı
    lcd.begin(16,2); // LCD başlatıldı
    }

    void loop() {
    Sicaklik = readSicaklik(); // sıcaklık bilgisi okundu
    if(Sicaklik < SicaklikMin) { // sıcaklık bilgisi set degeri ile karsılastırıldı
    fanSpeed = 0; // min set değerinden küçük ise fan devrede değil ledi yakma
    digitalWrite(fan, LOW); // fan çıkış ucuna sıfır ver devreye sokma
    }
    if((Sicaklik >= SicaklikMin) && (Sicaklik <= SicaklikMax)) { // sıcaklık min setten büyük ise
    fanSpeed = map(Sicaklik, SicaklikMin, SicaklikMax, 32, 255); // sıcaklık ile fan hızını map et
    fanLCD = map(Sicaklik, SicaklikMin, SicaklikMax, 0, 100); // fan hızını LCD yaz
    analogWrite(fan, fanSpeed); // 11 nolu pwm den fana hız vwe
    }

    if(Sicaklik > SicaklikMax) { // sıcaklığımız maks set değerinnden fazla ise
    digitalWrite(led, HIGH); // ledi yak
    } else { // değilse
    digitalWrite(led, LOW); // ledi söndür
    }

    lcd.print("Sicaklik: ");
    lcd.print(Sicaklik); // LCD okudugumuz sıcaklık değerini yaz
    lcd.print("C ");
    lcd.setCursor(0,1); // LCD yazmayı bir alt satıra al
    lcd.print("FAN: ");
    lcd.print(fanLCD); // alt satıra Fan hızını yaz
    lcd.print("%");
    delay(200);
    lcd.clear();
    }

    int readSicaklik() { // int dönüşlü sıcaklık okuma fonksiyonumuz sıcaklığı santigrata ceviriyor
    Sicaklik = analogRead(SicaklikPin);
    return Sicaklik * 0.48828125;
    }

    YanıtlaSil
    Yanıtlar
    1. AHMET bey merhaba bu devreyi yapacaktım ama bu arduino'nun ustundeki lcd ekran aparatının adını biliyormusunuz pot ayarıda sol köşesinde ben bulamadım?

      Sil
    2. Sicaklik=readSicaklik(); hata veriyor. read ve Sicaklik ayrımı bitişikmi yazılacak. Bitişik yazılınca hata kalkıyor da. ayrıca lcd aparatın devreye montaj şeması mevcutmu?

      Sil
  8. Arkadaşlar merhaba bir şey soracam hiç bir yerde bulamadım lütfen yardımcı olun..

    örneğin , bir butona 5 sn basılı tutunca HIGH olmasını istiyorum bunu nasıl yazıcam örnek verebilir misin?

    YanıtlaSil
    Yanıtlar
    1. for komutuyla yazabilirsin dögüsel olarak işlem yapar sonuç elde edersin

      Sil
  9. Malzemelerin listesini paylaşabilir misiniz? Ayrıntılı liste olsa çok sevinirim yeni başladım sipariş verip alacağım hemen başlayacağım.

    YanıtlaSil
    Yanıtlar
    1. mstfrdgn123@gmail.com iletişim kurarsanız liste ve kod hakkında yardımcı olabilirim

      Sil
  10. kodları gönderebilir misiniz bugrapolat96@gmail.com

    YanıtlaSil

ELEKTRO BLOGGER A HOŞGELDINIZ

ARAMA YAP

EN COK OKUNANLAR

- Copyright © ELEKTRO-BLOGGER Blogger