Dijital Isı ve Nem Kontrol Sistemi
  • Selamlar kardeşler,

    Fransa'da yaşayan bir kardeşiniz olarak evde peynir yapma hobisi ile ilgileniyorum ve hedefim modifiye buzdolabının nem ve derecelerini modifiye edebilmek. Bunun için internetten iki proje paylaşımından esinlendim, kod için'de yardım aldım fakat fonksyon hataları tespit ettim ve siz değerli abilerimle bu konuyu paylaşmak istedim.

    Kullanılan malzeme :
    Uno yada Mega, Keypad Shield 1602 ekran 6 butonlu, İ2C ekran bağlantı modülü, Nem ve derece ölçer DHT22 modülü, Çift çıkışlı Röle modülü ve vidalı bağlantı sunan screw shield.

    Hedef, shield ekran ile I2C modülü bağlantısı, röle'ler ile (İN1) çıkış nem makinesi, (İN2) çıkış buzdolabı ve butonlar sayesinde derece ve nem ayarı degiștirme imkanı.

    Fakat baglantı sonucu birkaç sorun yașadım, aydınlatma yok, derece rölesi hiç hareket etmiyor ve derece veya nem ayarı her butona basmada 1yazıyor derece veya %1 nem değilde 2-3-7-12.. diye gidiyor. Kodu paylaşıp nerede hata var tespit edip yardımcı olursanız çok memnun olurum, Fritzing üzerinden çizim yaptım paylașıyorum. (Röle pin numaralar değişik olabilir)

    Şimdiden teşekkürler.

    Kod:

    #include < DHT.h>
    #include < Wire.h>
    #include < LCD.h>
    #include < DFR_Key.h>
    #include < LiquidCrystal_I2C.h>


    LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

    const int humidityRelay = 18;
    const int heaterRelay = 19;
    const int DHTPIN = 3;


    int temp = 12;
    int hum = 80;
    int readkey;
    long int lastmillis;
    long int hours;
    long int minutes;
    long int seconds;

    char l2c1;
    char l2c2;
    char l2c3;

    DHT dht (DHTPIN, DHT22);

    DFR_Key keypad(0);

    int localKey = 0;
    String keyString = "";
    int lcd_key = 0;
    int adc_key_in = 0;

    const byte btnRIGHT = 0;
    const byte btnUP = 1;
    const byte btnDOWN = 2;
    const byte btnLEFT = 3;
    const byte btnSELECT = 4;
    const byte btnNONE = 5;

    int read_LCD_buttons()
    {
    adc_key_in = analogRead(0);
    if (adc_key_in > 1000) return btnNONE;
    if (adc_key_in < 50) return btnRIGHT;
    if (adc_key_in < 150) return btnUP;
    if (adc_key_in < 300) return btnDOWN;
    if (adc_key_in < 460) return btnLEFT;
    if (adc_key_in < 690) return btnSELECT;
    }

    void setup()

    {
    pinMode(humidityRelay, OUTPUT);
    pinMode(heaterRelay, OUTPUT);
    lcd.begin(16, 2);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(" control");
    lcd.setCursor(0, 1);
    lcd.print("Instr on Select");
    delay(2500);
    Serial.begin(9600);
    dht.begin();
    delay(1000);
    lcd.clear();

    keypad.setRate(10);
    digitalWrite(humidityRelay, HIGH);
    digitalWrite(heaterRelay, HIGH);

    }

    void loop()

    {
    float h = dht.readHumidity();
    float t = dht.readTemperature();

    if (isnan(t) || isnan(h))

    {

    lcd.begin(16, 2);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Capteur N/C!!");
    delay(10000);
    }

    else

    {
    lcd_key = read_LCD_buttons();
    switch (lcd_key)
    {
    case btnLEFT:
    {
    temp = temp + 1;
    break;
    }
    case btnRIGHT:
    {
    temp = temp - 1;
    break;
    }
    case btnUP:
    {
    hum = hum + 1;
    break;
    }
    case btnDOWN:
    {
    hum = hum - 1;
    break;
    }
    case btnSELECT:
    {
    lcd.begin(16, 2);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Hum Up/Down +-1%");
    lcd.setCursor(0, 1);
    lcd.print("Temp L/R +-1");
    lcd.print((char)223);
    lcd.print("C");
    delay (5000);
    break;
    }
    }
    lcd.setCursor(0, 0);
    lcd.print("Hum: ");
    lcd.print(h);
    lcd.print("%");
    lcd.print("(");
    lcd.print(hum);
    lcd.print("%)");
    lcd.setCursor(0, 1);
    lcd.print("Tem: ");
    lcd.print(t);
    lcd.print((char)223);
    lcd.print("(");
    lcd.print(temp);
    lcd.print((char)223);
    lcd.print(")");

    int H = 70 + 10;
    if (h < 85) digitalWrite(humidityRelay, LOW);
    else if (h >= H) digitalWrite(humidityRelay, HIGH);

    int T = 12 + 2 ;
    if (t < 12 )
    digitalWrite(heaterRelay, LOW);
    else if (t >= T)
    digitalWrite(heaterRelay, HIGH);
    }

    }

  • Kullanılan kütüphaneler
    #include'lere eklenen :
    DHT.h
    Wire.h
    LCD.h
    DFR_Key.h
    LiquidCrystal_I2C.h
  • Yazılımı çalışan bir yerden aldıysanız şayet sorun muhtemelen yazılımda değilim donanımda.
  • Teşekkür ederim abi, dediğin gibi donanımda sorun var, başka bir LiquidCrystal I2C kütüphanesi ile deneyim, çok sağol abim, Arduino Forum'da yerimde sayıyorum ilerleme sağlayamadım.

    İki projeden ilham aldım ikiside Keypad 1602 kullanıyor, biri Keypad ile I2C modül bağlantı metodunu paylaşıyor, diğeri Keypad, Dht22, röle kullanarak butonlar'la değerleri kontrol ediyor.

    Bana ilk projenin mimarisi yardım etti yazılım için, hatta DFR_Key.h ve .cpp dosyalarında değişiklik yaptı ama ne yazık ki donanımda sorun var.

    Aslında Arduino Forum'da bir Fransız arkadaş değişik bir yazılım paylaştı ama onunla hiç görüntü yoktu fakat ekranın aydınlatma da sorun yoktu.

    Bu arada fotoğraf ve kod paylaşım bölümü olmadığından Fritzing şeması için yayınlayamıyorum, ikinci kodu paylaşıyorum.

    Kod


    #include < Wire.h>
    #include < DFR_Key.h>
    #include < DHT.h>
    #include < LiquidCrystal_I2C.h>


    const byte humidityRelay = 18;
    const byte heaterRelay = 19; // PIN 18 ve 19 röle
    const byte DHTPIN = 2; // PIN 2 Dht22 için
    const byte nbColumns = 16;
    const byte nbLines = 2; // Ekran bilgi 16 X 02

    LiquidCrystal_I2C lcd( 0x27, nbColumns, nbLines);

    int temp = 12;
    int hum = 80; // Arzu edilen ısı 12°C - nem %80
    int readkey;
    unsigned long lastmillis;
    long int hours;
    long int minutes;
    long int seconds;

    char l2c1;
    char l2c2;
    char l2c3;


    DHT dht (DHTPIN, DHT22); // kaptör tipi DHT22 (AM2023)


    DFR_Key keypad(0);

    int localKey = 0;
    int lcd_key = 0;
    int adc_key_in = 0;

    const byte btnRIGHT = 0;
    const byte btnUP = 1;
    const byte btnDOWN = 2;
    const byte btnLEFT = 3;
    const byte btnSELECT = 4;
    const byte btnNONE = 5;

    int read_LCD_buttons()
    {
    adc_key_in = analogRead(0);
    if (adc_key_in > 1000) return btnNONE;
    if (adc_key_in < 50) return btnRIGHT;
    if (adc_key_in < 150) return btnUP; // elimdeki DFRobot ekranın tuş verileri
    if (adc_key_in < 300) return btnDOWN;
    if (adc_key_in < 460) return btnLEFT;
    if (adc_key_in < 690) return btnSELECT;
    }

    void setup()

    {
    pinMode(humidityRelay, OUTPUT);
    pinMode(heaterRelay, OUTPUT);
    lcd.begin(16, 2);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(F(" control")); // Macro F () yazılım önerisi
    lcd.setCursor(0, 1);
    lcd.print(F("Select instr")); //
    delay(2500);
    Serial.begin(115200);
    dht.begin();
    delay(1000);
    lcd.clear();


    keypad.setRate(10);
    digitalWrite(humidityRelay, HIGH); // nem rölesi aktif
    digitalWrite(heaterRelay, HIGH); // derece rölesi aktif

    }

    void loop()

    {
    float h = dht.readHumidity();
    float t = dht.readTemperature();

    if (isnan(t) || isnan(h))
    {

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(F("Capteur N/C!!"));
    delay(10000);
    }
    else
    {
    lcd_key = read_LCD_buttons();
    switch (lcd_key)
    {
    case btnLEFT:
    {
    temp = temp + 1;
    break;
    }
    case btnRIGHT:
    {
    temp = temp - 1;
    break;
    }
    case btnUP:
    {
    hum = hum + 1;
    break;
    }
    case btnDOWN:
    {
    hum = hum - 1;
    break;
    }
    case btnSELECT:
    {
    lcd.begin(16, 2);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print(F("Hum Up/Down +-1%")); // utilisé le macro F ()
    lcd.setCursor(0, 1);
    lcd.print(F("Temp L/R +-1"));
    lcd.print((char)223);
    lcd.print(F("C"));
    delay (5000);
    break;
    }
    }
    lcd.setCursor(0, 0);
    lcd.print("Hum: "); // utilisé le macro F () pour tous les lcd.print
    lcd.print(h);
    lcd.print("%");
    lcd.print("(");
    lcd.print(hum);
    lcd.print(F("%)"));
    lcd.setCursor(0, 1);
    lcd.print("Tem: ");
    lcd.print(F(t));
    lcd.print((char)223);
    lcd.print(F("("));
    lcd.print(temp);
    lcd.print((char)223);
    lcd.print(")");

    int H = 70 + 10;

    if (h < 85) digitalWrite(humidityRelay, LOW);

    else if (h >= H) digitalWrite(humidityRelay, HIGH);

    int T = 12 + 2 ;

    if (t < 12 )

    digitalWrite(heaterRelay, LOW);

    else if (t >= T)

    digitalWrite(heaterRelay, HIGH);
    }

    }
  • Fotoğraflarınızı resim yükleme sitelerine yükledikten sonra link paylaşabilirsiniz.
  • Çok teşekkür ederim abi,

    (Şema çiziminde Röle Pin numaraları değişmiş olabilir)

    İlham aldığım 2 proje :

    1- Keypad ile I2C bağlantısı. https://www.instructables.com/id/1602-LCD-Keypad-Shield-Module-With-I2C-Backpack/

    (Montaj'da hiç sorun çıkmadı herşey OK).

    2- Keypad/ Dht22/ Röle çift çıkış. https://www.instructables.com/id/Sky-Control-V1-Temperature-and-Humidity-Controller/

    (Bu proje'de sorun var, dün akşam tekrar denedim, nem rölesi koda göre çalışıyor fakat butonlar'la değişiklik yaptığımda değişiklik sadece ekranda, röle'de olmuyor kod'ta ne yazıyorsa onu uyguluyor. Diğer sorun, ısı rölesi hiç hareket etmiyor, adeta yok hükmünde :)

    Heberger image
    "Bu denemede Nano kullanıyorum aşağıda sağda"

    Bu arada başka bir I2C kütüphanesi önerdi Fransız arkadaş birde onu deneyim bakalım sonuç ne olacak.

    Nem ve ısı kontrolü için ideal bir proje, inşallah başarır ve paylaşırız, ilgilenen tüm kardeşlerimize ilham olur, proje başarılı olursa, denemek ve kullanmak isteyen Vatandaşlarımızın işini kolaylaştırmak adına tüm malzeme ve kütüphaneleri paylaşırım.

    Can Vatanıma Selam Olsun, Saygılar.

    Heberger image
  • bence bu projeyı adım adım gerçekleştirin bir kere lcd ekrana hakımmısınız istediğiniz satıra ıstedıgınız şeyi yazabılıyormusunuz. daha sonra butonları test edın ekrandan bastıgınız komutların tepkısını yazın. daha sonra sensoru nem ve scaıklık fonksıyonlarını deneyın ekrana yazın bu şekılde bır yol alırsanız daha kolay olacak sızın ıcın
  • Müthişsin Okoman abi, aynen tavsiyelerini uygulayacağım,
    ilk önce ekranın datasheet'tini iyice araştırıp yazılım konusunu anlamam lazım,
    sonra butonları test edip komutların tepkisini ve neticede sensor fonksiyonları ile denem lazim,

    Mesajı aldim çok teşekkür ederim Okoman abi, ilerki günlerde inşaallah sonuçları paylaşırım, saygılar.

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Login with Facebook
Açık kaynak kültürü gereği, çözdüğünüz problemlerin çözümlerini paylaşmayı lütfen unutmayın.