Akvaryum.Com
  • Merhaba Led Önerisi Arıyorum


    Profil resmi
    CikletSevdalısı
    18:08
    Merhaba shark akvaryum aydınlatmanın duo serisimi daha iyidir yoksa wolfmar 100cm akvaryum uyumlu led aydınlatmamı

    Shark 4000lira
    Wolfmar2380[IMG]https://foto.akvaryum.com/fotolar/272733/231020261808021.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/272733/231020261808211.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/272733/231020261808211.jpg[/IMG]

    Profil resmi
    ziyasenkaya

    SMD ledli armatürleri hiç denemedim, fakat bazı arkadaşlarım performansının düşük olduğunu söylüyor, hatta bir arkadaşım biyik bir deniz akvaryumuna 2 sıra aynı marka smd armatür almıştı. Ben eskiden beri power led kullanıyorum, ihtiyacıma göre kendim yapıyorum armatürümü. Fakat son bitkili akvaryumumda kenardaki anubias topluluğu yüksek ışık yüzünden çok yosun yapmıştı, sonrasında o bölgedeki aydınlatmayı düşürmek zorunda kaldım. Yani hem balıkların rengi parlasın hem anubias iyi olsun derseniz, ya anubiasları köşelere dibe yerleştirin, ya da armatürün o kısmına hafif bir filtre yapıp ışığı kısın. Aşağıdaki videoyu bir inceleyin derim.

    [VID]https://www.youtube.com/watch?v=krP0sNrzs8A[/VID]

    (3) (183)

    Betta İmbellis


    Profil resmi
    Jolakotturinn
    20:20
    Ölçüler: 30x30x45
    Canlı Türleri: Betta imbellis, kiraz karides
    Bitki Türleri: Nymphaea lotus, Hydrocotyle, Bucephalandra, Bolbitis, Mostera adansonii
    Tankın Yaşı: 1 ay (Aquasoil için 2 yıl)
    Filtrasyon ve Işıklandırma: Sobo kafa motoru, Sera siporax, sünger / Yikeda RGB Led
    Tasarım ve Dekorasyon: Aquasoil, silis kum, mangrov kökleri, guava ve meşe yaprakları
    [IMG]https://foto.akvaryum.com/fotolar/290996/131020262015381.jpg[/IMG]
    [IMG]https://foto.akvaryum.com/fotolar/290996/131020262015231.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/290996/131020262015311.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/290996/131020262015421.jpg[/IMG]

    Sizce bu beta kesinlikle dişi mi? Dişi diye tahmin ediyorum (erkek olarak sipariş verdim, üretim amacım yok çünkü). İleride yanına küçük bir sivrisinek rasbora grubu ekleyebilir miyim?

    Profil resmi
    hvostr

    [QUOTE=Jolakotturinn]
    Bu durumda birkaç tavsiye: Ben bu bettayı Hobihanem’den aldım, fiyat olarak oldukça uygun (tek eleştirim erkek istememe rağmen dişi göndermiş olması ama balık genç ve eski siparişlerimde problem yaşamadım) ancak wild olarak sadece imbellis var. Kışın daha çok tür bulabilirsiniz diye düşünüyorum. Ankara’dan antuta ilanı görmüştüm, çok güzel bir tür ama en azından 80 litrelik bir akvaryum gerekiyor. Nerite konusunda emin değilim çünkü su fazla asidik ve yumuşak gelebilir. Karidesleri de bettadan önce ekleyip biraz üremelerine fırsat verirseniz popülasyon sorunu yaşamazsınız.[/QUOTE] Öncelikle çok teşekkür ederim tavsiyeleriniz için. Şimdiye kadar tüm canlılarımı zaten Hobihanemden aldım çok iyi insanlar. Karides işine gelirsek evet bettadan önce bolca bitki alacağım karidesler ile, onun harici Kiraz Karides yada Green jelly alırım gibime geliyor ama tek tür alıcağım yoksa yabani renklere dönüyorlar. Onun harici Filtre olarak elimde olan Sumsun 602 b var onu mu taksam bilemiyorum yoksa Walstad da deneyebilirim ama walstad deneyimim olmadı önceden ondan muhtemelen direk Sumsun 302 byi geçiririm bu tankada çünkü 150 litrelik Malavi tankımda kullanıyorum filtreyi ve yetersiz olduğunu biliyorum ve üstüne üstlük çok fazla balık var bu nedenle SunSun HW-302ye geçeceğim en yakın zamanda.

    (18) (2219)

    🧿 En Güzel Fotoğraflarınızı Gösterin


    Profil resmi
    Koi-keeper
    01:22
    328 beğeni
    [b]Bu sene çektiğim en güzel resimlerden bir tanesi bu. [/b]
    [b]Tam resmi çekerken yumurta çatladı (en üstteki) kuyruğu çıktı [:)][/b]
    [b][/b] 
    [b]
    [/b][b][img]http://foto.akvaryum.com/fotolar/24552/Yumurtalar.JPG[/img]
    [/b][b]
    [/b][b]Sizinde böyle anlık resimleriniz varsa paylaşalım[/b] [b]BALIK-SEVER DOSTLARIM[/b][EDIT]Hoppala,2026-02-09 00:52:55[/EDIT]

    Profil resmi
    BASARSURMEGOZ

    2 beğeni
    Pembe panter :)

    [IMG]https://foto.akvaryum.com/fotolar/278143/241020261912081.jpg[/IMG]

    (8826) (4419000)

    Esp Tabanlı Akıllı Işık Ve Sıcaklık Ölçüm Sistemi


    Profil resmi
    NightWist
    22:45
    9 beğeni
    ​30 cm akvaryum için 1650 TL armatür fiyatını görünce Türk esnafına inat kendi armatürümü kendim yapmaya karar verdim. Sadece 2-3 LED ve bir sürücü için istenen rakamlar gerçekten gereksiz fazla. Herkesin, özellikle de benim gibi öğrenci olanların bu hobiyi sürdürmesini istemediklerini düşünüyorum.
    ​Kendi yaptığım sistem, LED'leri zamanı gelince otomatik olarak açıp kapatıyor. Ayrıca istediğim zaman telefondan manuel olarak da kontrol edebiliyorum. Eklediğim dijital sıcaklık sensörü ile telefondan anlık sıcaklık takibi yapabiliyor, istersem telefonuma bildirim bile gönderebiliyorum. Bu özelliklere sahip muadillerinin yarı, hatta çeyrek fiyatına mal ettiğim bu sistem üstelik gelişmeye çok açık. İstediğim zaman bir röle daha ekleyip fanla birlikte bir termostat devresine de dönüştürebilirim.
    ​Büyük hobicilere ve Türk esnafına ricamdır: Bu işler böyle yürümez, yaptığınız kâr marjının haddi hesabı yok. Lütfen biraz daha insaflı olun.

    ​Şimdi ise kurduğum sistemi basitçe anlatayım:
    ​ESP8266 Geliştirme Kartı (Sistemin Kalbi): Bütçeniz varsa büyük abisi olan ESP32'yi de alabilirsiniz, aralarında 100-150 TL gibi bir fark var. Ben aldığım sırada stok yoktu, o yüzden tercih etmedim. Bu kartlar kendi içinde Wi-Fi özelliği bulunduruyor. Bu sayede telefona, bilgisayara, kısacası ekranı ve interneti olan her şeye uzaktan bağlanabiliyor. Tüm kodlamaları bu cihaza yaptım.
    ​5V Low Level Trigger Röle Kartı: Bu parça, aldığı sinyalle kapanıp açılarak LED'lerimizi kontrol etmemizi sağlıyor. Normalde aklımda IRL44N gibi bir MOSFET alıp dimmer ayarı yapmak vardı ama stok bulamadım, olan yerlerde de fiyatlar çok uçuktu. O yüzden röle tercih ettim. Rölenin tek eksisi, her açılıp kapandığında "tık" diye ses çıkarması.
    ​LM2596 Voltaj Regülatörü: Hem ESP8266'ya hem de röle kartına güç vermek için kullandım. Voltajı 12V'tan 5V'a düşürüyor, üzerindeki potansiyometre ile istediğiniz şekilde ayar yapabiliyorsunuz.
    ​12V 2 Amper Adaptör: Elimde 12V 2A sigorta tipi bir adaptör vardı, onu değerlendirdim.
    ​Dijital Sıcaklık Sensörü: Hassas ve sapma olmadan ölçüm yaptığı için anlık sıcaklık takibinde kullanıyorum. Kullanacaksanız; ESP8266'nın 3V pini ile kullandığınız veri pini (ben D2'yi kullandım) arasına 4.7K direnç ile köprü (pull-up) atmanız gerekiyor.


    [IMG]https://foto.akvaryum.com/fotolar/240101/100620262244081.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/240101/100620262244091.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/240101/100620262244101.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/240101/100620262244181.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/240101/100620262244251.jpg[/IMG]

    Profil resmi
    NightWist

    2 beğeni
    Güncelleme: Isıtıcı eklemesi yapıldı. Isıtıcı termostatına güvenmediğim için harici termostat olarak ESP8266'yı kullanmaya karar verdim. Isıtıcının fazla çalışmasını engellemek için güvenlik sistemleri ekledim. Örneğin, probu 10 saniye okuyamazsa ısıtıcıyı tamamen kapatıyor ve ışığı açıp kapatarak uyarı veriyor. Aynı şekilde birkaç önlem daha var. Ayrıca ısıtıcının dahili termostatı 28 dereceye ayarlı, istese de daha fazla yükselemez.

    Bütün tesisatı elden geçirdim. Jumper kablolar ile modüler şekilde yaptım; bu sayede istediğim zaman değiştirmem çok kolay olacak. ESP'ye OTA (Over-The-Air) eklemesi yaptım, artık her güncelleme yapmak istediğimde plastik kutuyu açıp laptopu oraya taşımak zorunda değilim. İnternetten kodu doğrudan atabiliyorum. Bu sırada arayüzü de tamamen güncelledim.

    Kodların bir kısmını kendim, bir kısmını yapay zekadan yardım alarak yazdım. Özellikle HTML ve arayüz kısmındaki animasyonları ona yaptırdım, çok başarılı bir şekilde yaptı. 192.168.1.100 üzerinden statik olarak hem bilgisayardan hem de telefondan erişilebiliyor. Telefon uygulaması da mevcut. APK paylaşmayacağım, kendiniz MIT App Inventor üzerinden yapabilirsiniz. Şart değil zaten; WebView şeklinde çalışıyor, yani web sitesini gösteriyor. Yerel ağdan çalıştırıyorum; böylece hem daha güvenli hem de stabil çalışıyor. Bu sefer kodu da paylaşacağım, kullanmak isteyen olursa kullanabilir.

    [IMG]https://foto.akvaryum.com/fotolar/240101/241020261835101.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/240101/241020261835091.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/240101/241020261839551.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/240101/241020261840051.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/240101/241020261840111.jpg[/IMG]


    [QUOTE]
    /*
    Akvaryum Kontrol - ESP8266 (NodeMCU)
    - D1 (GPIO5) : Isıtıcı rölesi (low trigger: LOW=çeker)
    - D2 (GPIO4) : Işık rölesi (low trigger: LOW=çeker)
    - D3 (GPIO0) : DS18B20 data (4.7k pull-up - 3.3V)

    Kütüphaneler (Library Manager): OneWire, DallasTemperature
    Kart: NodeMCU 1.0 (ESP-12E Module)
    */

    #include ESP8266WiFi.h
    #include ESP8266WebServer.h
    #include OneWire.h
    #include DallasTemperature.h
    #include EEPROM.h
    #include time.h
    #include ArduinoOTA.h

    // ======================= AĞ AYARLARI =======================
    const char* WIFI_SSID=internetisminiz";
    const char* WIFI_PASS=sifreniz";

    IPAddress ipAddr (192, 168, 1, 100);
    IPAddress gwAddr (192, 168, 1, 1); // Modem adresi (farklıysa değiştir)
    IPAddress maskAddr(255, 255, 255, 0);
    IPAddress dns1Addr(192, 168, 1, 1);
    IPAddress dns2Addr(8, 8, 8, 8);

    const long GMT_OFFSET_SEC=3 * 3600; // Türkiye UTC+3

    // ======================= PİNLER =======================
    const uint8_t PIN_HEATER=5; // D1
    const uint8_t PIN_LIGHT =4; // D2
    const uint8_t PIN_TEMP =0; // D3
    #define RELAY_ON LOW
    #define RELAY_OFF HIGH

    // RÖLE SÜRME YÖNTEMİ
    // 0=Klasik: AÇIK - LOW, KAPALI - HIGH (pin hep OUTPUT).
    // Bu röle modüllerinde 3.3V HIGH rölenin bırakması için yetmiyor (hep açık kalıyor).
    // 1=Açık-uçlu: AÇIK - LOW, KAPALI - pin boşa alınır (INPUT). Röleler bırakır.
    // Not: Bu modda röle girişi kapalıyken ~4V'ta kalıp hafif ses çıkarabiliyor.
    #define RELAY_OPEN_DRAIN 1

    void relayWrite(uint8_t pin, bool on) {
    #if RELAY_OPEN_DRAIN
    if (on) {
    digitalWrite(pin, LOW);
    pinMode(pin, OUTPUT);
    } else {
    pinMode(pin, INPUT);
    }
    #else
    digitalWrite(pin, on ? LOW : HIGH);
    pinMode(pin, OUTPUT);
    #endif
    }

    // ======================= ISITICI / GÜVENLİK AYARLARI =======================
    const float TARGET_MIN =20.0; // Web'den ayarlanabilecek en düşük hedef
    const float TARGET_MAX =32.0; // Web'den ayarlanabilecek en yüksek hedef
    const float TARGET_DEFAULT =25.0;
    const float HYSTERESIS =0.3; // Aç ile kapat arasındaki fark
    const float EARLY_OFF =0.2; // Isıtıcıyı hedefin bu kadar altında kapat (cam ısı vermeye devam eder)
    // 100W/15L için 0.2. 25-50W ısıtıcıda 0.0 yapabilirsin.
    const float ABS_MAX_C =33.5; // Bunun üstünde ne olursa olsun ısıtıcı kapalı + alarm
    const unsigned long MAX_ON_MS =10UL * 60UL * 1000UL; // Tam güç eşdeğeri en fazla 10 dk ısıtma (POWER_PCT düşükse süre orantılı uzar)
    const unsigned long COOLDOWN_MS =3UL * 60UL * 1000UL; // Sonra 3 dk zorunlu mola

    // GÜÇ SINIRI: Web arayüzünden seçilir (100=tam güç, 50=yarım güç) ve kaydedilir.
    // Yarım güçte ısıtıcı, 5 dk'lık dilimlerin yarısı kadar açık kalır (2,5 dk açık, 2,5 dk kapalı).
    // Tam güçte röle en az tıklar. Aşağıdaki değer sadece ilk kurulumdaki varsayılandır.
    const uint8_t POWER_PCT_DEFAULT=50;
    const unsigned long PULSE_PERIOD_MS=300000UL;
    const unsigned long SENSOR_TIMEOUT_MS=10000; // 10 sn geçerli okuma yoksa kapat
    const unsigned long READ_INTERVAL_MS =3000;

    // ======================= KALICI AYARLAR =======================
    struct Settings {
    uint32_t magic;
    float targetC;
    uint16_t lightOn; // gece yarısından beri dakika
    uint16_t lightOff;
    uint8_t powerPct; // 50 veya 100
    };
    const uint32_t MAGIC=0xA11C0DE1;
    Settings cfg;

    // ======================= DURUM =======================
    ESP8266WebServer server(80);
    OneWire oneWire(PIN_TEMP);
    DallasTemperature sensors(&oneWire);

    float tempC=NAN;
    bool haveReading=false;
    bool sensorOk=false;
    unsigned long lastGoodMs=0, lastRequest=0;
    bool converting=false;
    uint8_t badCount=0;

    bool heaterOn=false;
    unsigned long heaterOnSince=0;
    bool demand=false; // Termostat "ısıt" diyor mu (röle çıkışından bağımsız)
    unsigned long demandSince=0;
    bool cooling=false;
    unsigned long coolStart=0;
    const char* hstate=idle";

    // --- Sıcaklık kaydı: 5 dakikada bir ortalama nokta, son 24 saat (RAM'de tutulur) ---
    const unsigned long LOG_INTERVAL_MS=5UL * 60UL * 1000UL;
    const uint16_t LOG_SIZE=288; // 288 x 5 dk=24 saat
    const int16_t LOG_INVALID=-32768;
    int16_t logTemp[LOG_SIZE]; // 0.1 °C cinsinden
    uint8_t logHeat[LOG_SIZE]; // o aralıkta ısıtıcının açık kaldığı yüzde
    uint16_t logHead=0, logCount=0;
    float accSum=0;
    uint16_t accN=0;
    unsigned long accHeatMs=0, lastAccMs=0, logStartMs=0;
    int lastLogMin=-1; // son kaydın günün kaçıncı dakikası olduğu (-1: saat yok)

    bool lightOn=false; // Işığın mantıksal durumu (arayüzde görünen)
    bool lightRelay=false; // Rölenin fiziksel durumu
    bool blinkInvert=false; // Alarm yanıp sönmesi sırasında röleyi tersler

    // --- Alarm uyarısı: alarm varken ışık 3 kez yanıp söner ---
    const unsigned long ALARM_REPEAT_MS=120000UL; // Alarm sürerken uyarıyı tekrar etme aralığı (2 dk)
    const unsigned long BLINK_STEP_MS =400UL; // Her yanma/sönme süresi
    int8_t blinkStep=-1; // -1: yanıp sönme yok
    unsigned long blinkNext=0, lastAlarmBlink=0;
    bool prevAlarm=false;

    // --- Soğuma izleme: su hedeften soğuk kalıp ısınmıyorsa (ısıtıcı bozuk ya da fişi çıkık) alarm ---
    const float COLD_MARGIN =1.0; // Hedefin bu kadar altına inince izlemeye başla
    const float COLD_MIN_RISE=0.3; // İzleme süresinde en az bu kadar ısınmalı
    const unsigned long COLD_WATCH_MS=60UL * 60UL * 1000UL; // 60 dk
    bool coldWatch=false, coldAlarm=false;
    unsigned long coldSince=0;
    float coldRef=0;

    // --- WiFi ile kod yükleme (OTA) ---
    const char* OTA_HOSTNAME=akvaryum";
    const char* OTA_PASSWORD=akvaryum"; // Arduino IDE yüklerken bu şifreyi sorar
    bool otaBusy=false, otaStarted=false;
    uint8_t lightMode=0; // 0=otomatik, 1=elle açık, 2=elle kapalı (açılışta otomatiğe döner)

    // ======================= WEB ARAYÜZÜ =======================
    const char INDEX_HTML[] PROGMEM=R"rawliteral(
    !DOCTYPE html
    html lang=tr"head
    meta charset=utf-8"
    meta content=width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover"
    meta content=#062b3a"
    title🐠 Akvaryum Kontrol Merkezi/title
    style
    :root{--abyss:#062b3a;--tide:#13707f;--foam:#eaf7f5;--mute:#8dbdc3;--lamp:#f2c879;--coral:#ff8a5b;--ok:#7fe0d2;--bad:#ff6b7a}
    *{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
    [hidden]{display:none!important}
    body{margin:0;min-height:100vh;min-height:100dvh;background:var(--abyss);color:var(--foam);
    font:16px/1.45 ui-rounded,"SF Pro Rounded",Nunito,system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
    padding:max(12px,env(safe-area-inset-top)) 14px max(28px,env(safe-area-inset-bottom))}
    button,input{font-family:inherit}
    button:focus-visible,input:focus-visible{outline:2px solid var(--lamp);outline-offset:2px}
    main{max-width:460px;margin:0 auto}
    h1{font-size:20px;margin:6px 4px 12px;display:flex;align-items:center;gap:8px}
    .dot{width:10px;height:10px;border-radius:50%;background:var(--bad);margin-left:auto}
    .dot.ok{background:var(--ok)}
    .alarm{margin:0 0 12px;padding:12px 14px;border-radius:16px;background:rgba(255,107,122,.18);border:1px solid var(--bad);font-weight:600}

    .tank{position:relative;overflow:hidden;isolation:isolate;border-radius:30px;padding:28px 20px 22px;text-align:center;
    background:linear-gradient(180deg,#0e6070 0%,#08394a 100%);border:1px solid rgba(255,255,255,.1)}
    .tank::before,.tank::after{content:"";position:absolute;left:0;right:0;z-index:-1;opacity:0;transition:opacity .8s;pointer-events:none}
    .tank::before{top:0;bottom:0;background:radial-gradient(120% 70% at 50% -10%,rgba(242,200,121,.5),transparent 65%)}
    .tank::after{bottom:0;height:50%;background:linear-gradient(0deg,rgba(255,138,91,.5),transparent)}
    .tank.lit::before,.tank.heating::after{opacity:1}
    .bub{position:absolute;bottom:-20px;width:var(--s);height:var(--s);border-radius:50%;border:1.5px solid rgba(255,255,255,.4);
    opacity:0;animation:rise var(--d) linear infinite;animation-delay:var(--w)}
    .tank.heating .bub{opacity:1}
    @keyframes rise{to{transform:translateY(-320px)}}
    @media (prefers-reduced-motion:reduce){.bub{animation:none}}
    .temp{font-size:84px;font-weight:800;letter-spacing:-3px;line-height:1;font-variant-numeric:tabular-nums}
    .temp small{font-size:28px;font-weight:600;letter-spacing:0;margin-left:4px;opacity:.7}
    .sub{margin:8px 0 16px;color:var(--mute);font-size:15px}

    .pill{display:inline-block;padding:7px 14px;border-radius:999px;font-weight:600;font-size:15px;background:rgba(255,255,255,.12)}
    .pill.hot{background:var(--coral);color:#3a1204}
    .pill.ok{background:rgba(127,224,210,.2);color:var(--ok)}
    .pill.warn,.pill.on{background:var(--lamp);color:#3a2a05}
    .pill.bad{background:var(--bad);color:#3b0710}
    .pill.sm{font-size:13px;padding:4px 10px;margin-left:auto}

    .panel{margin-top:14px;padding:16px;border-radius:22px;background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.08)}
    h2{font-size:17px;margin:0 0 14px;display:flex;align-items:center;gap:8px}
    .step{display:flex;align-items:center;justify-content:space-between;gap:10px}
    .rb{width:64px;height:64px;border-radius:20px;border:0;background:rgba(255,255,255,.12);color:var(--foam);font-size:32px;font-weight:600}
    .rb:active{background:rgba(255,255,255,.24)}
    .tgt{font-size:44px;font-weight:800;font-variant-numeric:tabular-nums}
    .tgt small{font-size:20px;font-weight:600;color:var(--mute);margin-left:2px}
    .chips{display:flex;gap:8px;margin:14px 0}
    .chip{flex:1;min-height:44px;border-radius:14px;border:1px solid rgba(255,255,255,.2);background:transparent;color:var(--foam);font-size:16px;font-weight:600}
    .chip.on{background:var(--ok);color:#06302b;border-color:var(--ok)}
    .go{width:100%;min-height:52px;border:0;border-radius:16px;font-size:17px;font-weight:700}
    .go.mint{background:var(--ok);color:#06302b}
    .go.amber{background:var(--lamp);color:#3a2a05}
    .go:disabled{opacity:.35}

    .seg{display:grid;grid-template-columns:repeat(3,1fr);gap:6px;padding:5px;border-radius:18px;background:rgba(0,0,0,.25)}
    .seg button{min-height:46px;border:0;border-radius:13px;background:transparent;color:var(--foam);font-size:14.5px;font-weight:600}
    .seg button.on{background:var(--lamp);color:#3a2a05}
    .times{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:14px 0}
    .times label{display:flex;flex-direction:column;gap:6px;font-size:14px;color:var(--mute)}
    .times input{width:100%;min-height:52px;border-radius:14px;border:1px solid rgba(255,255,255,.2);background:rgba(0,0,0,.25);
    color:var(--foam);font-size:20px;font-weight:600;padding:0 12px;color-scheme:dark}

    .seg.mint button.on{background:var(--ok);color:#06302b}
    .seg.two{grid-template-columns:1fr 1fr}
    .seg.hot button.on{background:var(--coral);color:#3a1204}
    .chart{margin-top:12px}
    .chart svg{width:100%;height:auto;display:block;touch-action:pan-y;user-select:none;-webkit-user-select:none}
    .gr{stroke:rgba(255,255,255,.1);stroke-width:1}
    .ax{fill:var(--mute);font-size:10px}
    .cl{fill:none;stroke:var(--ok);stroke-width:2.5;stroke-linejoin:round;stroke-linecap:round}
    .tl{stroke:var(--lamp);stroke-width:1.2;stroke-dasharray:4 4;opacity:.85}
    .hb{fill:var(--coral);opacity:.55}
    .cur{stroke:var(--foam);stroke-width:1;opacity:.6}
    .cc{fill:var(--ok);stroke:var(--abyss);stroke-width:2}
    .empty{padding:34px 8px;text-align:center;color:var(--mute)}
    .info{min-height:22px;margin-top:6px;font-size:14px;text-align:center;font-variant-numeric:tabular-nums}
    .legend{display:flex;gap:14px;justify-content:center;margin-top:6px;font-size:12px;color:var(--mute)}
    .legend span::before{content:"";display:inline-block;width:12px;height:4px;border-radius:2px;margin-right:5px;vertical-align:middle}
    .l1::before{background:var(--ok)}.l2::before{background:var(--lamp)}.l3::before{background:var(--coral)}
    .stats{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:12px}
    .stats div{padding:10px 12px;border-radius:14px;background:rgba(0,0,0,.2);display:flex;flex-direction:column}
    .stats small{font-size:12px;color:var(--mute)}
    .stats b{font-size:20px;font-variant-numeric:tabular-nums}
    .hint{margin:12px 0 0;font-size:12px;color:var(--mute)}
    footer{display:flex;justify-content:space-between;margin:18px 6px 0;font-size:13px;color:var(--mute)}
    .toast{position:fixed;left:50%;bottom:max(22px,env(safe-area-inset-bottom));transform:translate(-50%,30px);padding:12px 18px;
    border-radius:14px;background:var(--foam);color:#06302b;font-weight:600;opacity:0;pointer-events:none;transition:.25s}
    .toast.show{opacity:1;transform:translate(-50%,0)}
    /style/head
    bodymain
    h1🐠 Akvaryum Kontrol Merkezi i/i/h1
    div hidden/div

    section
    i/i
    i/i
    i/i
    i/i
    i/i
    i/i
    i/i
    divspan--.-/spansmall°C/small/div
    divHedef --/div
    divBağlanıyor…/div
    /section

    section
    h2📈 Sıcaklık geçmişi/h2
    div
    button data-n=72"6 saat/button
    button data-n=144"12 saat/button
    button data-n=288"24 saat/button
    /div
    divdivYükleniyor…/div/div
    div/div
    divspanSıcaklık/spanspanHedef/spanspanIsıtıcı açık/span/div
    div hidden
    divsmallEn düşük/smallb--/b/div
    divsmallOrtalama/smallb--/b/div
    divsmallEn yüksek/smallb--/b/div
    divsmall🔥 Isıtıcı açık/smallb--/b/div
    /div
    pHer 5 dakikada bir nokta eklenir. Cihaz yeniden başlayınca geçmiş sıfırlanır./p
    /section

    section
    h2🎯 Hedef sıcaklık/h2
    div
    button aria-label=Azalt"−/button
    divspan--.-/spansmall°C/small/div
    button aria-label=Artır"+/button
    /div
    div/div
    button disabledHedefi kaydet/button
    /section

    section
    h2⚡ Isıtıcı gücü/h2
    div
    button🔥 Tam güç/button
    button🌿 Yarım güç/button
    /div
    pYarım güçte ısıtıcı 2,5 dk açık, 2,5 dk kapalı çalışır. Küçük akvaryumda sıcaklık daha dengeli kalır ama ısınma yavaşlar. Tam güçte röle daha az tıklar./p
    /section

    section
    h2💡 Işık span…/span/h2
    div
    button🤖 Otomatik/button
    button☀️ Açık/button
    button🌙 Kapalı/button
    /div
    div
    label🌅 Açılışinput type=time" oninput=dl()"/label
    label🌇 Kapanışinput type=time" oninput=dl()"/label
    /div
    button disabledSaatleri kaydet/button
    /section

    footerspan🕒 --/spanspan📶 --/spanspan⏱ --/span/footer
    div/div
    /main
    script
    const $=id=document.getElementById(id);
    const clamp=(v,a,b)=Math.min(b,Math.max(a,v));
    let S=null,pt=null,dirtyT=false,dirtyL=false;

    async function api(p){const r=await fetch(p,{cache:'no-store'});if(!r.ok)throw new Error(await r.text());return r.json()}
    function toast(m){const t=$('toast');t.textContent=m;t.classList.add('show');clearTimeout(toast.h);toast.h=setTimeout(()=t.classList.remove('show'),1800)}
    function up(x){const d=Math.floor(x/86400),h=Math.floor(x%86400/3600),m=Math.floor(x%3600/60);return d?d+' g '+h+' sa':h?h+' sa '+m+' dk':m+' dk'}

    function showTarget(){
    $('tgt').textContent=pt.toFixed(1);
    $('saveT').disabled=!dirtyT;
    document.querySelectorAll('.chip').forEach(b=b.classList.toggle('on',Math.abs(+b.dataset.v-pt)0.05));
    }
    function adj(d){if(!S)return;pt=clamp(Math.round((pt+d)*10)/10,S.min,S.max);dirtyT=true;showTarget()}
    function pick(v){if(!S)return;pt=clamp(v,S.min,S.max);dirtyT=true;showTarget()}
    function dl(){dirtyL=true;$('saveL').disabled=false}

    async function saveT(){
    try{S=await api('/api/temp?t=+pt);dirtyT=false;render();toast('✅ Hedef kaydedildi')}
    catch(e){toast('⚠️ Hedef kaydedilemedi')}
    }
    async function setMode(m){
    try{S=await api('/api/light?mode=+m);render()}
    catch(e){toast('⚠️ Işık modu değişmedi')}
    }
    async function setPower(p){
    try{S=await api('/api/power?p=+p);render();toast(p===100?'✅ Tam güç seçildi':'✅ Yarım güç seçildi')}
    catch(e){toast('⚠️ Güç ayarı değişmedi')}
    }
    async function saveL(){
    try{S=await api('/api/light?on=+encodeURIComponent($('tOn').value)+'&off=+encodeURIComponent($('tOff').value));
    dirtyL=false;render();toast('✅ Işık saatleri kaydedildi')}
    catch(e){toast('⚠️ Saatler kaydedilemedi, iki saati de seç')}
    }

    function render(){
    const s=S;
    $('temp').textContent=s.temp===null?'--.-':s.temp.toFixed(1);
    $('sub').textContent=Hedef '+s.target.toFixed(1)+' °C';
    const A={sensor:'⚠️ Sıcaklık probu okunamıyor. Güvenlik için ısıtıcı kapalı tutuluyor. Prob kablosunu ve 4.7k direnci kontrol et.',
    over:'🚨 Su çok sıcak! Isıtıcıyı fişten çek ve rölenin yapışıp yapışmadığını kontrol et.',
    cold:'🥶 Su hedeften soğuk ve uzun süredir ısınmıyor. Isıtıcı çalışmıyor olabilir, fişini ve bağlantıları kontrol et.'};
    $('alarm').hidden=!A[s.alarm];$('alarm').textContent=A[s.alarm]||'';

    const H={heating:['🔥 Isıtıyor','hot],idle:['😌 Sıcaklık yerinde','ok],sensor:['⛔ Prob yok, ısıtıcı kapalı','bad],
    cooldown:['🧊 Güvenlik molası','warn],over:['🚨 Aşırı sıcak, ısıtıcı kapalı','bad]};
    const h=H[s.hstate]||H.idle;
    $('hpill').textContent=h[0];$('hpill').className=pill '+h[1];
    $('tank').classList.toggle('heating',s.heater);
    $('tank').classList.toggle('lit',s.light);

    if(!dirtyT){pt=s.target}
    showTarget();

    let lp;
    if(s.mode===0&&!s.timeOk)lp=⏳ Saat bekleniyor';
    else lp=(s.light?'💡 Açık':'🌙 Kapalı')+(s.mode===0?' (otomatik)':' (elle)');
    $('lpill').textContent=lp;$('lpill').className=pill sm'+(s.light?' on':'');
    document.querySelectorAll('#seg button').forEach((b,i)=b.classList.toggle('on',i===s.mode));
    if(!dirtyL){$('tOn').value=s.on;$('tOff').value=s.off}
    $('saveL').disabled=!dirtyL;

    $('fTime').textContent=🕒 '+s.now;
    $('fWifi').textContent=📶 '+s.rssi+' dBm';
    $('fUp').textContent=⏱ '+up(s.up);
    document.querySelectorAll('#pw button').forEach((b,i)=b.classList.toggle('on',(i===0?100:50)===s.power));
    if(LG&&render.tg!==s.target){render.tg=s.target;drawLog()}
    }

    async function refresh(){
    try{S=await api('/api/status');$('dot').classList.add('ok');render()}
    catch(e){$('dot').classList.remove('ok')}
    }

    let LG=null,rng=288,CH=null;
    const f1=v=v.toFixed(1),pad2=n=String(n).padStart(2,'0');
    function hm(m){m=((m%1440)+1440)%1440;return pad2(Math.floor(m/60))+':'+pad2(m%60)}
    async function loadLog(){try{LG=await api('/api/log');drawLog()}catch(e){}}
    function setRng(n){rng=n;document.querySelectorAll('#rng button').forEach(b=b.classList.toggle('on',+b.dataset.n===n));drawLog()}

    function drawLog(){
    if(!LG)return;
    const n=Math.min(LG.t.length,rng),box=$('chart'),st=$('stats');
    const T=LG.t.slice(LG.t.length-n),Hh=LG.h.slice(LG.h.length-n);
    const vals=T.filter(v=v!==null).map(v=v/10);
    if(!vals.length){box.innerHTML=divHenüz kayıt yok. İlk nokta 5 dakika içinde eklenir./div';st.hidden=true;CH=null;$('lgInfo').textContent=';return}
    st.hidden=false;
    const W=340,HT=180,L=36,R=8,TP=10,B=24,pw=W-L-R,ph=HT-TP-B,tg=S?S.target:null;
    let lo=Math.min(...vals,tg===null?99:tg),hi=Math.max(...vals,tg===null?-99:tg);
    lo=Math.floor((lo-.3)*2)/2;hi=Math.ceil((hi+.3)*2)/2;
    if(hi-lo2){const c=(hi+lo)/2;lo=c-1;hi=c+1}
    const X=i=L+(n1?i*pw/(n-1):pw/2),Y=v=TP+ph*(1-(v-lo)/(hi-lo));
    let g=';
    for(let k=0;k=4;k++){const v=lo+k*(hi-lo)/4,y=Y(v);
    g+=`line x1=${L}" x2=${W-R}" y1=${f1(y)}" y2=${f1(y)}"/text x=${L-5}" y=${f1(y+3.5)}" text-anchor=end"${f1(v)}/text`}
    const bw=Math.max(1,pw/n*.8);
    Hh.forEach((p,i)={if(p0){const h=p/100*24;g+=`rect x=${f1(X(i)-bw/2)}" y=${f1(TP+ph-h)}" width=${f1(bw)}" height=${f1(h)}"/`}});
    if(tg!==null)g+=`line x1=${L}" x2=${W-R}" y1=${f1(Y(tg))}" y2=${f1(Y(tg))}"/`;
    let d=',pen=false;
    T.forEach((v,i)={if(v===null){pen=false;return}d+=(pen?'L':'M')+f1(X(i))+' '+f1(Y(v/10))+(pen?'':' h.01');pen=true});
    for(let k=0;k4;k++){
    const i=Math.round(k*(n-1)/3),ago=(n-1-i)*LG.step;
    const lab=LG.end=0?hm(LG.end-ago):(ago?'-'+Math.round(ago/60)+' sa':'son');
    g+=`text x=${f1(X(i))}" y=${HT-6}" text-anchor=${k===0?'start':k===3?'end':'middle'}"${lab}/text`}
    box.innerHTML=`svg viewBox=0 0 ${W} ${HT}" role=img" aria-label=Sıcaklık grafiği"${g}path d=${d}"/`+
    `line y1=${TP}" y2=${TP+ph}" x1=0" x2=0"/circle r=4"//svg`;
    CH={n,T,Hh,X,Y,W,L,pw};
    const sv=$('svg');sv.addEventListener('pointerdown',probe);sv.addEventListener('pointermove',probe);
    const mn=Math.min(...vals),mx=Math.max(...vals),av=vals.reduce((a,b)=a+b,0)/vals.length;
    const mins=Hh.reduce((a,p)=a+p,0)/100*LG.step;
    $('sMin').textContent=f1(mn)+'°';$('sAvg').textContent=f1(av)+'°';$('sMax').textContent=f1(mx)+'°';
    $('sHeat').textContent=mins=60?Math.floor(mins/60)+' sa '+Math.round(mins%60)+' dk':Math.round(mins)+' dk';
    $('lgInfo').textContent=Grafiğe dokun, o andaki değeri gör';
    }

    function probe(e){
    if(!CH)return;
    const r=$('svg').getBoundingClientRect(),x=(e.clientX-r.left)/r.width*CH.W;
    let i=CH.n1?Math.round((x-CH.L)/CH.pw*(CH.n-1)):0;i=Math.max(0,Math.min(CH.n-1,i));
    const v=CH.T[i],cur=$('cur'),cc=$('cc'),px=CH.X(i),ago=(CH.n-1-i)*LG.step;
    const when=LG.end=0?hm(LG.end-ago):(ago?(ago=60?Math.round(ago/60)+' sa önce':ago+' dk önce'):'en son');
    cur.setAttribute('x1',px);cur.setAttribute('x2',px);cur.style.display=';
    if(v===null){cc.style.display=none';$('lgInfo').textContent=🕒 '+when+' veri yok';return}
    cc.setAttribute('cx',px);cc.setAttribute('cy',CH.Y(v/10));cc.style.display=';
    $('lgInfo').textContent=🕒 '+when+' 🌡️ '+f1(v/10)+' °C 🔥 %'+CH.Hh[i];
    }

    [24,26,28,30].forEach(v={
    const b=document.createElement('button');b.className=chip';b.dataset.v=v;b.textContent=v+'°';
    b.onclick=()=pick(v);$('chips').appendChild(b);
    });
    refresh();loadLog();
    setInterval(()={if(!document.hidden)refresh()},3000);
    setInterval(()={if(!document.hidden)loadLog()},60000);
    document.addEventListener('visibilitychange',()={if(!document.hidden)refresh()});
    /script/body/html
    )rawliteral";

    // ======================= YARDIMCI FONKSİYONLAR =======================
    void saveSettings() {
    EEPROM.put(0, cfg);
    EEPROM.commit();
    }

    void loadSettings() {
    EEPROM.get(0, cfg);
    if (cfg.magic != MAGIC || isnan(cfg.targetC) || cfg.targetC TARGET_MIN || cfg.targetC TARGET_MAX ||
    cfg.lightOn=1440 || cfg.lightOff=1440) {
    cfg.magic =MAGIC;
    cfg.targetC =TARGET_DEFAULT;
    cfg.lightOn =10 * 60; // 10:00
    cfg.lightOff=20 * 60; // 20:00
    cfg.powerPct=POWER_PCT_DEFAULT;
    saveSettings();
    }
    // Eski kayıtta güç alanı yoktu: geçersizse varsayılana al (hedef ve ışık saatleri korunur)
    if (cfg.powerPct != 50 && cfg.powerPct != 100) {
    cfg.powerPct=POWER_PCT_DEFAULT;
    saveSettings();
    }
    }

    bool timeOk() { return time(nullptr) 1700000000; }

    int nowMinutes() {
    time_t t=time(nullptr);
    struct tm* lt=localtime(&t);
    return lt-tm_hour * 60 + lt-tm_min;
    }

    String nowString() {
    if (!timeOk()) return "--:--:--";
    time_t t=time(nullptr);
    struct tm* lt=localtime(&t);
    char b[9];
    snprintf(b, sizeof(b), "%02d:%02d:%02d", lt-tm_hour, lt-tm_min, lt-tm_sec);
    return String(b);
    }

    String fmtHM(int m) {
    char b[6];
    snprintf(b, sizeof(b), "%02d:%02d", m / 60, m % 60);
    return String(b);
    }

    int parseHM(const String& s) {
    int c=s.indexOf(':');
    if (c 1) return -1;
    int h=s.substring(0, c).toInt();
    int m=s.substring(c + 1).toInt();
    if (h 0 || h 23 || m 0 || m 59) return -1;
    return h * 60 + m;
    }

    // ======================= SICAKLIK OKUMA (bloklamadan) =======================
    void updateTemperature() {
    unsigned long now=millis();
    if (!converting) {
    if (now - lastRequest=READ_INTERVAL_MS) {
    sensors.requestTemperatures();
    converting=true;
    lastRequest=now;
    }
    } else if (now - lastRequest=800) {
    converting=false;
    float t=sensors.getTempCByIndex(0);
    if (t == DEVICE_DISCONNECTED_C || t == 85.0 || t -20.0 || t 60.0) {
    if (++badCount=10) { // ~30 sn hatalı okuma: probu yeniden tara
    sensors.begin();
    sensors.setWaitForConversion(false);
    badCount=0;
    }
    } else {
    tempC=t;
    accSum += t;
    accN++;
    haveReading=true;
    lastGoodMs=now;
    badCount=0;
    }
    }
    }

    // ======================= ISITICI KONTROLÜ =======================
    void setHeater(bool on) {
    if (on == heaterOn) return;
    heaterOn=on;
    relayWrite(PIN_HEATER, on);
    if (on) heaterOnSince=millis();
    Serial.printf("Isitici %s (%.1f C, hedef %.1f)\n", on ? "ACIK" : "KAPALI", tempC, cfg.targetC);
    }

    void controlHeater() {
    unsigned long now=millis();
    sensorOk=haveReading && (now - lastGoodMs SENSOR_TIMEOUT_MS);

    if (otaBusy) { // Kod yüklenirken ısıtıcı kapalı kalır
    setHeater(false);
    hstate=idle";
    return;
    }

    if (cooling && now - coolStart=COOLDOWN_MS) {
    cooling=false;
    demandSince=now; // Mola bitti, süre sayacı baştan başlar
    }

    hstate=idle";
    bool want=false;

    if (!sensorOk) {
    demand=false; // Prob yoksa ısıtıcı kapalı
    hstate=sensor";
    } else if (tempC=ABS_MAX_C) {
    demand=false; // Mutlak üst sınır
    hstate=over";
    } else {
    // 1) Termostat: ısıtma talebi var mı (histerezisli)
    float offAt=cfg.targetC - EARLY_OFF;
    bool d=demand;
    if (tempC=offAt) d=false;
    else if (tempC=offAt - HYSTERESIS) d=true;
    if (d && !demand) demandSince=now;
    demand=d;

    // 2) Süre limiti: talep, tam güç eşdeğeri MAX_ON_MS'yi aşarsa zorunlu mola
    unsigned long pct=constrain(cfg.powerPct, 10, 100);
    if (demand && !cooling && now - demandSince=MAX_ON_MS * 100UL / pct) {
    cooling=true;
    coolStart=now;
    }

    // 3) Çıkış: talep varsa ve mola yoksa, güç sınırına göre darbeli aç
    if (demand) {
    if (cooling) {
    hstate=cooldown";
    } else {
    hstate=heating";
    bool pulseOn=true;
    if (pct 100) pulseOn=((now - demandSince) % PULSE_PERIOD_MS) (PULSE_PERIOD_MS * pct / 100);
    want=pulseOn;
    }
    }
    }

    setHeater(want);
    }

    // ======================= IŞIK KONTROLÜ =======================
    bool scheduleSaysOn() {
    if (!timeOk()) return false;
    int m=nowMinutes();
    int a=cfg.lightOn, b=cfg.lightOff;
    if (a == b) return false;
    if (a b) return m=a && m b;
    return m=a || m b; // Gece yarısını aşan program (örn. 18:00 - 02:00)
    }

    void controlLight() {
    bool want;
    if (lightMode == 1) want=true;
    else if (lightMode == 2) want=false;
    else want=scheduleSaysOn();
    if (want != lightOn) {
    lightOn=want;
    Serial.printf("Isik %s\n", want ? "ACIK" : "KAPALI");
    }
    bool phys=(want != blinkInvert); // Alarm yanıp sönerken röle tersine çevrilir
    if (phys != lightRelay) {
    lightRelay=phys;
    relayWrite(PIN_LIGHT, phys);
    }
    }

    // ======================= SICAKLIK KAYDI =======================
    void logTick() {
    unsigned long now=millis();
    if (heaterOn) accHeatMs += now - lastAccMs;
    lastAccMs=now;

    if (now - logStartMs=LOG_INTERVAL_MS) {
    logStartMs += LOG_INTERVAL_MS;
    int16_t v=accN ? (int16_t)roundf(accSum / accN * 10.0f) : LOG_INVALID;
    unsigned long pct=accHeatMs * 100UL / LOG_INTERVAL_MS;
    if (pct 100) pct=100;
    logTemp[logHead]=v;
    logHeat[logHead]=(uint8_t)pct;
    logHead=(logHead + 1) % LOG_SIZE;
    if (logCount LOG_SIZE) logCount++;
    lastLogMin=timeOk() ? nowMinutes() : -1;
    accSum=0;
    accN=0;
    accHeatMs=0;
    }
    }

    void sendLog() {
    String j;
    j.reserve(3200);
    uint16_t start=(logHead + LOG_SIZE - logCount) % LOG_SIZE;
    j += F("{\"step\":");
    j += (int)(LOG_INTERVAL_MS / 60000UL);
    j += F(",\"end\":");
    j += lastLogMin;
    j += F(",\"t\":[");
    for (uint16_t k=0; k logCount; k++) {
    int16_t v=logTemp[(start + k) % LOG_SIZE];
    if (k) j += ',';
    if (v == LOG_INVALID) j += F("null");
    else j += (int)v;
    }
    j += F(],\"h\":[");
    for (uint16_t k=0; k logCount; k++) {
    if (k) j += ',';
    j += (int)logHeat[(start + k) % LOG_SIZE];
    }
    j += F(]}");
    server.sendHeader("Cache-Control", "no-store");
    server.send(200, "application/json", j);
    }

    // ======================= WEB SUNUCU =======================
    const char* alarmCode() {
    if (sensorOk && tempC=ABS_MAX_C) return "over";
    if (!sensorOk && millis() 20000) return "sensor";
    if (coldAlarm) return "cold";
    return "";
    }

    // Alarm varken ışığı 3 kez ters çevirip eski haline getirir (bloklamadan).
    // Alarm başlar başlamaz hemen bir kez, sonra ALARM_REPEAT_MS aralığıyla tekrar eder.
    void alarmBlinkTick() {
    unsigned long now=millis();
    bool alarm=alarmCode()[0] != '\0';
    if (alarm && !prevAlarm) lastAlarmBlink=now - ALARM_REPEAT_MS; // yeni alarm: hemen uyar
    prevAlarm=alarm;

    if (blinkStep 0) {
    if (!alarm || now - lastAlarmBlink ALARM_REPEAT_MS) return;
    blinkStep=0;
    blinkNext=now;
    lastAlarmBlink=now;
    }
    if ((long)(now - blinkNext) 0) return;

    if (blinkStep=6) { // 3 yanıp sönme bitti
    blinkInvert=false;
    blinkStep=-1;
    return;
    }
    blinkInvert=(blinkStep % 2 == 0); // çift adım: ters çevir, tek adım: eski haline getir
    blinkStep++;
    blinkNext=now + BLINK_STEP_MS;
    }

    // Su hedeften soğukta kalıp 60 dk boyunca ısınmıyorsa "cold" alarmı verir.
    void coldWatchTick() {
    if (!sensorOk) return;
    unsigned long now=millis();
    if (tempC=cfg.targetC - COLD_MARGIN) {
    if (!coldWatch) {
    coldWatch=true;
    coldSince=now;
    coldRef=tempC;
    } else if (tempC=coldRef + COLD_MIN_RISE) { // Isınıyor: pencereyi yenile
    coldRef=tempC;
    coldSince=now;
    coldAlarm=false;
    } else if (now - coldSince=COLD_WATCH_MS) {
    coldAlarm=true;
    }
    } else {
    coldWatch=false;
    coldAlarm=false;
    }
    }

    // ======================= WIFI İLE KOD YÜKLEME (OTA) =======================
    void startOta() {
    ArduinoOTA.setHostname(OTA_HOSTNAME);
    ArduinoOTA.setPassword(OTA_PASSWORD);
    ArduinoOTA.onStart([]() {
    otaBusy=true;
    setHeater(false); // Yükleme sırasında ısıtıcı kapalı
    Serial.println("OTA basladi: isitici kapatildi");
    });
    ArduinoOTA.onEnd([]() { Serial.println("OTA bitti"); });
    ArduinoOTA.onError([](ota_error_t e) {
    otaBusy=false;
    Serial.printf("OTA hata: %u\n", (unsigned)e);
    });
    ArduinoOTA.begin();
    otaStarted=true;
    Serial.println("OTA hazir");
    }

    String statusJson() {
    String j;
    j.reserve(420);
    j += F("{\"temp\":"); j += sensorOk ? String(tempC, 1) : String("null");
    j += F(",\"target\":"); j += String(cfg.targetC, 1);
    j += F(",\"min\":"); j += String(TARGET_MIN, 1);
    j += F(",\"max\":"); j += String(TARGET_MAX, 1);
    j += F(",\"power\":"); j += (int)cfg.powerPct;
    j += F(",\"heater\":"); j += heaterOn ? "true" : "false";
    j += F(",\"hstate\":\""); j += hstate; j += '"';
    j += F(",\"light\":"); j += lightOn ? "true" : "false";
    j += F(",\"mode\":"); j += (int)lightMode;
    j += F(",\"on\":\""); j += fmtHM(cfg.lightOn); j += '"';
    j += F(",\"off\":\""); j += fmtHM(cfg.lightOff); j += '"';
    j += F(",\"timeOk\":"); j += timeOk() ? "true" : "false";
    j += F(",\"now\":\""); j += nowString(); j += '"';
    j += F(",\"alarm\":\""); j += alarmCode(); j += '"';
    j += F(",\"rssi\":"); j += (long)WiFi.RSSI();
    j += F(",\"up\":"); j += (unsigned long)(millis() / 1000);
    j += '}';
    return j;
    }

    void sendStatus() {
    server.sendHeader("Cache-Control", "no-store");
    server.send(200, "application/json", statusJson());
    }

    void handleRoot() {
    server.send_P(200, PSTR("text/html; charset=utf-8"), INDEX_HTML);
    }

    void handleTemp() {
    if (!server.hasArg("t")) { server.send(400, "text/plain", "t eksik"); return; }
    float t=server.arg("t").toFloat();
    if (t TARGET_MIN || t TARGET_MAX) { server.send(400, "text/plain", "aralik disi"); return; }
    cfg.targetC=roundf(t * 10.0f) / 10.0f;
    saveSettings();
    Serial.printf("Yeni hedef: %.1f C\n", cfg.targetC);
    sendStatus();
    }

    void handlePower() {
    if (!server.hasArg("p")) { server.send(400, "text/plain", "p eksik"); return; }
    int p=server.arg("p").toInt();
    if (p != 50 && p != 100) { server.send(400, "text/plain", "50 veya 100"); return; }
    cfg.powerPct=p;
    saveSettings();
    Serial.printf("Isitici gucu: %%%d\n", p);
    sendStatus();
    }

    void handleLight() {
    if (server.hasArg("mode")) {
    int m=server.arg("mode").toInt();
    if (m 0 || m 2) { server.send(400, "text/plain", "mod hatali"); return; }
    lightMode=m;
    }
    if (server.hasArg("on") || server.hasArg("off")) {
    int a=parseHM(server.arg("on"));
    int b=parseHM(server.arg("off"));
    if (a 0 || b 0) { server.send(400, "text/plain", "saat hatali"); return; }
    cfg.lightOn=a;
    cfg.lightOff=b;
    saveSettings();
    }
    controlLight();
    sendStatus();
    }

    // ======================= WIFI =======================
    void connectWifi() {
    WiFi.mode(WIFI_STA);
    WiFi.config(ipAddr, gwAddr, maskAddr, dns1Addr, dns2Addr);
    WiFi.begin(WIFI_SSID, WIFI_PASS);
    }

    void checkWifi() {
    static unsigned long lastTry=0;
    if (WiFi.status() == WL_CONNECTED) return;
    if (millis() - lastTry 20000) {
    lastTry=millis();
    WiFi.disconnect();
    connectWifi();
    }
    }

    // ======================= SETUP / LOOP =======================
    void setup() {
    // Röleleri en başta KAPALI yap
    relayWrite(PIN_HEATER, false);
    relayWrite(PIN_LIGHT, false);

    Serial.begin(115200);
    Serial.println();

    EEPROM.begin(64);
    loadSettings();

    sensors.begin();
    sensors.setWaitForConversion(false);
    lastRequest=millis() - READ_INTERVAL_MS;
    logStartMs=lastAccMs=millis();

    WiFi.persistent(false);
    WiFi.setAutoReconnect(true);
    WiFi.setSleepMode(WIFI_NONE_SLEEP);
    connectWifi();
    unsigned long t0=millis();
    while (WiFi.status() != WL_CONNECTED && millis() - t0 20000) {
    delay(250);
    }
    if (WiFi.status() == WL_CONNECTED) {
    Serial.print("Baglandi: ");
    Serial.println(WiFi.localIP());
    } else {
    Serial.println("WiFi baglanamadi, arka planda denenecek");
    }

    configTime(GMT_OFFSET_SEC, 0, "pool.ntp.org", "time.google.com", "time.cloudflare.com");

    server.on("/", handleRoot);
    server.on("/api/status", sendStatus);
    server.on("/api/temp", handleTemp);
    server.on("/api/light", handleLight);
    server.on("/api/power", handlePower);
    server.on("/api/log", sendLog);
    server.on("/favicon.ico", []() { server.send(204); });
    server.onNotFound([]() { server.send(404, "text/plain", "Bulunamadi"); });
    server.begin();
    }

    void loop() {
    ArduinoOTA.handle();
    if (!otaStarted && WiFi.status() == WL_CONNECTED) startOta();
    server.handleClient();
    updateTemperature();
    controlHeater(); // WiFi olmasa bile çalışır
    alarmBlinkTick();
    controlLight();
    logTick();
    coldWatchTick();
    checkWifi();
    }
    [/QUOTE][EDIT]NightWist,2026-10-24 18:40:22[/EDIT]

    (11) (2759)

    Beylikdüzü'lü akvaristler kaynaşalım...


    Profil resmi
    anlkrtkn
    01:06
    Merhaba arkadaşlar Beylikdüzün de oturan akvaristlerin birbiriyle kaynaşması ve yardımlaşması için konuyu açma gereği duydum bu konu altından umarım güzel arkadaşlıklar çıkar. Herkese sağlıklı hobiler diliyorum... :)

    Profil resmi
    alfpetshop

    Merhaba herkese Alf Petshop Beylikdüzü olarak foruma katıldık.
    Akvaryum hobisine gönül veren arkadaşları çay kahve içmeye sohbete bekleriz.
    Emre.

    (1165) (553912)

    80 30 40h Low Tech Bitki Gübre Ve Işık Önerisi


    Profil resmi
    Shadowzen
    14:52
    Herkese merhabalar,
    Elimde 80 30 40h ölçülerinde ön tarafı dışa doğru bombeli bir akvaryumum var.Bu mevcut akvaryumu yeniden dizayn etmek istiyorum.Bu konu için siz değerli üstatlarımın yardımına ve fikirlerine ihtiyacım var.
    İlk olarak tabana 2.5 3 cm kalınlığında lav kırığı ve üstüne 3-4 cm siyah bazalt kum koyacağım.Akvaryumun sağ köşesinde sobo sf 550f modeli ve içinde seramik halka+lav kırığı+bio ring mevcut.Armatür olarak 1 wattlık 30 adet(3 royal blue+6 deep red+2 uv+19 6500 beyaz) kendim yapacağım power led armatür kullanacağım ve bu armatür akvaryumun 10 cm üzerinden aydınlatma verecek.bitki olarak akvaryum içinde sesliflora-tütün bitkisi-limon-eledoa-tilki kuyruğu ve rizomları taşa bağlı anubias ve java fern, kökleri akvaryum içinde yaprakları dışarıda kalacak şekilde 4 kök cam güzeli-1 bambu-1 salon sarmaşığı ve 1 kırmızı gövdeli malabar ıspanağı Riparyum saksılarına takılı olacak.Balık olarakda 7 neon tetra+6 transgenetik tetra+ 4 elma salyangozu +4 kuhli olacak.co2 yok tabi ki.Sıvı gübre veya kapsül gübre mi kullanmalıyım, müdahale etmem gereken bir yer var mı acaba?
    Şimdiden herkese keyifli forumlar iyi günler dilerim.

    Profil resmi
    Shadowzen

    Armatürüm hazır fotoğraflardan da anlaşılacağı üzere:5 adet full spectrum+2 adet royal blue+1 adet ultra viole+ 4 adet deep red+ 8 adet 6500+10 adet 10000k

    Bunlarda su üstü biklilerim
    [IMG]https://foto.akvaryum.com/fotolar/292379/241020261727041.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/292379/241020261727091.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/292379/241020261727141.jpg[/IMG]

    (6) (1214)

    Parlak Kılıçkuyruk


    Profil resmi
    ErenYildiz
    20:55
    [IMG]https://foto.akvaryum.com/fotolar/256237/270520252047451.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/256237/270520252047551.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/256237/270520252048051.jpg[/IMG]
    Cümleten hayırlı akşamlar herkese;

    Akvaryumda siyah bir kılıçkuyruk olmamasına rağmen bu şekil bir yavru aldım. İlginç bir şekilde soğuk tonlu, metalik–yeşilimsi bir parlama var, sanki vahşi forma yakın gibi 41 günlük yavru. Acaba genetik mutasyon mu yoksa resesif bir gen aktarımımı emin değilim bilgili arkadaşları yorumlara bekliyorum.

    Bu arada eklemek isterim tankta tek dişi var ve dişiden 4 sefer yavru aldım ilk defa böyle bir yavru çıktı. Dişi ve erkekler tamamen turuncu.

    Profil resmi
    Fatih_hakankaan

    Annesi babası turuncu olan bu genç balığın rengi böyle çıktı, anaç balık bu renkten ve vahşi gri formundaki renktende çok doğurdu [IMG]https://foto.akvaryum.com/fotolar/273216/241020261713451.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/273216/241020261714211.jpg[/IMG]

    (18) (5979)

    Bu Bitkinin Türü Nedir


    Profil resmi
    Furkanrs

    Selamunaleyküm monte carlo diye almıştım ama türü farklı galiba bu bitkinin türü nedir bilen biri yanıtlarsa çok sevinirim şimdiden teşekkür ederim

    [IMG]https://foto.akvaryum.com/fotolar/292241/241020261708301.jpg[/IMG]

    (0) (54)

    Discus Çiftim


    Profil resmi
    ErenBugra

    4 beğeni
    Ortalama 2 buçuk yıldır yavrudan büyütttüğümüz Discuslarımız arasından çıkan çiftimizden nihayetinde yavru aldık![:3][:nazar:]
    [K]Hep beraber büyüdükleri zamanlar yıl 2025[/K]
    [IMG]https://foto.akvaryum.com/fotolar/203162/241020260929451.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/203162/241020260929481.jpg[/IMG]
    [K]Dişimiz ilk Discusumuz.
    Kim bilebilirdi ki onun anne olacağını[/K] [:)]
    [IMG]https://foto.akvaryum.com/fotolar/203162/241020260929511.jpg[/IMG]
    [K]Ve beraber yaşamaya karar verdiler[/K] [3)] [:D]
    [IMG]https://foto.akvaryum.com/fotolar/203162/241020260931231.jpg[/IMG]
    [K]Aşkın meyveleri[/K][:3]
    [IMG]https://foto.akvaryum.com/fotolar/203162/241020260933081.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/203162/241020260933111.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/203162/241020260933141.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/203162/241020260933171.jpg[/IMG]
    [VID]https://www.youtube.com/watch?v=VXq0YKiwbwY[/VID][:3][EDIT]ErenBugra,2026-10-24 12:24:25[/EDIT]

    Profil resmi
    ~Emre

    Maşşallah ne güzelde bakıyorlar yavrularına.
    Yavrular büyüyünce anne babası gibi olacaklar inanılmaz. Şimdiden şekil almaya başlamışlar. Ayrıca discusu yavrudan büyütmek eminim çok zevkli olacaktır. Herşeyin hayırlısı olsun. Güle güle besleyin.[:nazar:][:nazar:][EDIT]~Emre,2026-10-24 16:52:02[/EDIT]

    (1) (164)

    Japon Balıkları


    Profil resmi
    okearos
    17:12
    [IMG]https://foto.akvaryum.com/fotolar/293645/231020261709491.jpg[/IMG]

    Merhaba 2 adet teleskop 4 adet normal japon ve 1 adet aslan japon balıgım var ayrıca 2 adet vatozum var toplam 9 balık mevcut biraz yapay zekalardan arastırma yaptım ve 96 litrelik tankım ıcın biyolojik yükün asırı oldugunu soyluyor filitrem sunsun hw503B dıs filitresi en alt katmanı sünger orta katmanda zeoit ve matrix en üstte elyaf var 3 sepetli bir filitre acaba balıklarım bodur kalır mı [:'(]

    Profil resmi
    ~Emre

    Merhaba öncelikle 30 litreden böyle bir tanka geçmenizi tebrik ederim. Hatalar olacak elbet ama önemli olan telafi etmek. Benim konumada bakabilirsiniz. Aynı durum bendede var ancak balıklar çok büyümeden sayıyı azaltacağım. Yani benim tankta 10-12 balık var su kapasitesi sizinkiyle aynı sayılır hızlı gelişenler duracak kalan 7-8 tanesini sahiplendircem.
    Size tavsiyem şuan balıklarınız 6-7 cm kuyrukla beraber. Çok büyümeden 10 cm geçmeden teleskopları vatozu çıkarın 3-4 adet kalsın.

    (7) (401)
  • SON MESAJLAR

    GÜNCEL 100 TANITIM

    SON İLANLAR

    FORUM İSTATİSTİKLERİ

    • 3,797,668 Mesaj
    • 408,613 Konu
    • 91 Forum
    • 145,128 Forum Üyesi
    • 1,466 Özel Forum Üyesi
    • 29 Kıdemli Akvarist
    • 1,941 Dün Giriş Yapan Üye

    Şu ana kadar en fazla 1365 kişi 27.03.2012 23:21 tarih ve saatinde çevrim içi oldu.

    Akvaryum Tanıtımı

    Yeni Bir Bitkili Akvaryum '''''''' Aquaterapist ''''''''


    Profil resmi
    AliAltınöz - 16:36

    Ölçüler:100x50x50

    Canlı Türleri: ember / apistogramma baenschi inka / karidesler vs

    Tasarım ve Dekorasyon: Kök deki yaşam 2

    [IMG]https://foto.akvaryum.com/fotolar/154487/051020261627021.jpg[/IMG]

    [IMG]https://foto.akvaryum.com/fotolar/154487/051020261627451.jpg[/IMG]

    [IMG]https://foto.akvaryum.com/fotolar/154487/051020261628481.jpg[/IMG]

    [IMG]https://foto.akvaryum.com/fotolar/154487/051020261629501.jpg[/IMG]

    [IMG]https://foto.akvaryum.com/fotolar/154487/240420262224231.jpg[/IMG]

    [IMG]https://foto.akvaryum.com/fotolar/154487/051020261630361.jpg[/IMG]

    [IMG]https://foto.akvaryum.com/fotolar/154487/051020261631221.jpg[/IMG]

    [IMG]https://foto.akvaryum.com/fotolar/154487/051020261632301.jpg[/IMG]

    [IMG]https://foto.akvaryum.com/fotolar/154487/051020261633001.jpg[/IMG]

    [IMG]https://foto.akvaryum.com/fotolar/154487/051020261633241.jpg[/IMG]

    [IMG]https://foto.akvaryum.com/fotolar/154487/051020261633531.jpg[/IMG]

    [IMG]https://foto.akvaryum.com/fotolar/154487/051020261634101.jpg[/IMG]

    [IMG]https://foto.akvaryum.com/fotolar/154487/051020261634481.jpg[/IMG]

    [IMG]https://foto.akvaryum.com/fotolar/154487/051020261635171.jpg[/IMG]

    İYİ SEYİRLER...

    (8) (26) (14)
    Canlı Tanıtımı

    Aequidens Diadema (kral Acara)


    Profil resmi
    flanormimar - 21:39

    Kral Acara (Aequidens Diadema - Royal Cichlid) 👑 Yeni yuvalarına yavaş yavaş alışmaya çalışan bu Güney Amerika’lı dostlarımıza merhaba deyin 👋

    Daha ilk günlerden itibaren beni camın önüne gelerek selamlıyor, meraklı gözlerle akvaryumun dışında neler olup bittiğini keşfetmeye çalışıyorlar. Pek çok kaynakta pek çok farklı yaşama-üretim su değerleri paylaşılmış bu da farklı su değerlerine yeterince toleranslı olduklarını gösteriyor. Bakalım ilerleyen günler ne gösterecek 🧡

    https://www.instagram.com/reel/Dctsm2aOenZ/?igsi=bGt5MGxtZjN2eXJ2

    [IMG]https://foto.akvaryum.com/fotolar/258303/310820262131261.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/258303/310820262131321.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/258303/310820262131381.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/258303/310820262131431.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/258303/310820262131481.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/258303/310820262131531.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/258303/310820262131571.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/258303/310820262132011.jpg[/IMG]

    (1) (15) (8)

    En Güncel 50 İlan


    Forumda Son Konular


    SON MESAJLAR

    Dıy Co2-O2 Difüzör


    Profil resmi
    BuRAK - 19:14

    Gerekli Malzemeler:

    Yapım Aşamaları:
    Makyaj temizlik ürününü kesiyoruz.
    Hortumu şırınganın içine sokacağımız için içine girebilecek hortumun içine makyaj temizlik ürününü sokuyoruz.
    İstenilen uzunlukta kesiyoruz adam tahminimce 1 cm civarı kesmiş.
    Hortumu şırınganın içine sokuyoruz var alt kısıma da hava hortumunu sokuyoruz.
     
    Video:
    [VID]http://www.youtube.com/watch?v=2y2QhbVo6HI&NR=1[/VID]
     
    Kendim deneyemedim uygun çapta hortum bulduğumda deneyim resimlerini siteye yükleyeceğim.
    Konu www.vimi.lt alıntıdır.
     
     
     
    Kendim denemedim şırıngama uygun hortum bulduğumdan deneyim siteye resimlerini yükleyeceğim.
     
    KaPTaN2011-09-22 00:29:14

    Cevapsız Konu
    Mangrow Kökü

    Profil resmi
    YavuzHan -

    Uzunluk 28 cm yükseklik 19 cm mangrow kökü 1250 tl.

    Orta Amerika'ya Dönüş


    Profil resmi
    Frkn -

    Ölçüler: 100x50x50
    Canlı Türleri: Amerikan Zebra, Rainbow, Sajica, Ateş Ağız vb Orta Amerika türlerinden bir veya iki çift.
    Bitki Türleri: Anubias
    Tankın Yaşı: 8
    Filtrasyon ve Işıklandırma: Canlı yükü az olacağından büyük boy pipo filtre (değişebilir), 1 adet osram 90 santim 30 watt 865 kodlu 6500K dayligt floresan.
    Tasarım ve Dekorasyon: İki adet büyük boy Mangrowe kökü, taşlar, silis kum (eklenecek), toprak küp (çift olursa bir küp daha eklenecek), ayrıca zamanla taş, kuru dallar ve yapraklarla dekor tamamlanacak.

    Merhaba sevgili dostlarım. Elimdeki emektar 250 litrelik akvaryumu, önce makul fiyata ilanlara koysam da, daha sonra sevgili hobici kardeşlerime ve çevreme hediye etmeye çalışsam da, alan olmayınca bu sevda yeniden depreşti ve bir solukta kiler de yatan emektarın tozunu alıp eve atmam bir oldu.[:)] iyi de oldu.[:D] Büyük tanka alışan ben, küçük tankla bir türlü tatmin olamadım.[:)))] Sonuçta da çoktandır aklımda olan Orta Amerikanlar ile yola devam etme kararı aldım.

    Bu kurulumu aceleye getirmeden, malzemeleri temin ettikçe birlikte tamamlayacağız inşallah. Gerçi ana malzemelerin birçoğu hazır. Eksik olan silis kumu özenle araştırıp, türe uygun olanı bulunca alıp ekleyeceğim. Daha sonra dal, yaprak, bitki gibi malzemeleri zamanla tamamlayarak güzel bir ortam ve görsel elde edeceğimizi düşünüyorum. Her zamanki gibi değerli katkılarınızı bekliyor ve sağlıklı hobiler diliyorum.

    [IMG]https://foto.akvaryum.com/fotolar/217431/250520231425301.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/217431/250520231426001.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/217431/250520231426151.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/217431/250520231426351.jpg[/IMG][IMG]https://foto.akvaryum.com/fotolar/217431/250520231426521.jpg[/IMG]

    (167) - (5995825)

    Ekstrem Akvaryum


    Ekstrem Akvaryum mağzaları 2009 yılında ilk olarak Ankara’da kurulmuştur. Bu sektörde hizmet vermeye başladığından itibaren kaliteli ürün satışını hedeflemiştir. Ülkemizi dünyanın önde gelen markaları ile tanıştırmıştır ve tanıtmaya devam eden bir kuruluştur. Ekstrem Akvaryum mağazaları Ankara ve İstanbul olmak üzere modern ve en sağlıklı canlı ithalatlarını gerçekleştirmeyi hedefleyerek akvaryum sektöründe haklı yer edinmiştir. Ürün fiyatlarımız Avrupa ile aynı rakamlara sahiptir ve her yeni piyasaya çıkan ürün yakından takip edilerek sizlere sunulmaya devam etmektedir. Ekstrem akvaryum gerek fiyat polikası ve gerekse canlıların sergilendiği akvaryumların çağın standartlarına uygun olmasıyla deniz akvaryumu üzerine söz sahibi bir firmadır. Dünyanın önde gelen markaları ile yapılan distribütörlük anlaşmaları ile en kaliteli ekipmanları en uygun koşullar altında müşterilerine sunar. Yapılan canlı ithalatları gerekli prosüdürlere tam uyumluluk ile gerçekleştirilir.

    www.ekstremakvaryum.com.tr

    Ankara

    Son 50 Tanıtım


    Profil Yorumları

    Bitkili Doğal Akvaryumlarım


    Profil resmi
    nurtensultan - 23:49

    Ölçüler:60x40x37,5 iki tane akvaryum
    Canlı Türleri:Adi salyangoz
    Bitki Türleri:
    Kara bitkisi: barış çiçeği
    Su üstü: su mercimeği, su marulu
    Su içi: tilki kuyruğu
    Köklü bitkiler: gül, limon, zeytin, saz, Bacopa minöre, kripto türleri, Çınar, Lotus, rotala, Ceratopteris thalictroides,subulata
    Tankın Yaşı: 20 günlük
    Filtrasyon ve Işıklandırma:
    Filitre yok
    Twinstar b60
    Tasarım ve Dekorasyon: Walstad yönetimi uygulamaya çalıştım. İki farklı bölgeden toprak aldım. Tabanın 2,5 cm toprak 2,5 cm dere çakılı olacak şekilde ayarladım. Daha eklemem gereken bitkiler var. Java fern ve Patos sarmaşığı düşünüyorum. İçinde kök olarak sanırım Mangrow ve yati bulunuyor. Onları da 20 gün suda beklettim. Canlı eklemek için 2 ay bekleyeceğim. Yüzey yağlanmam mevcut daha önceki tankımda da olmuştu. Şu an için her şey yolunda gözüküyor. Bitkiler oturdukça daha da güzel olacağından eminim. Işıklandırmam gün doğumu batımı simülasyonu ve %25 ile başladım kademeli ilerliyorum. 7 saat aydınlatma sürem bulunuyor.[IMG]https://foto.akvaryum.com/fotolar/240573/220720262333551.jpg[/IMG]

    (6137219)
    Canlı Tanıtımı

    Red tail big ear ribbon yavrum


    Profil resmi
    -

    http://www.akvaryum.com/Yarisma/resimler/02032019001203840.jpg

    () (21) (8)
    Blue lace big dorsal

    Profil resmi
    -

    http://www.akvaryum.com/Yarisma/resimler/07032019235747486.jpg

    () ()
    Sohbeti tam ekranda aç  

    Ana sayfa gösterim biçimi: Günün ilk açılışında genel bakışı, kalanında akışı göster. (Varsayılan) Her zaman akışı göster. Her zaman genel bakışı göster.

    İstanbul


    Trend Akvaryum

    240 adet akvaryumda satışa sunulan balıklar, bitkiler ve karidesler, geniş malzeme ve yem stoğu ile hem deniz hem tatlı su canlıları satışı yapmakta olan Trend Akvaryum Türkiye'nin en büyük tatlı su akvaryumcusudur. Geniş ürün yelpazeli sanal mağazası da bulunan firma Üsküdar'da bulunmaktadır.

    İzmir


    Malawi İzmir

    Malawi ve Tanganyika Cichlidleri'nin çeşidi kadar, Dennerle bayisi olması ile bitkili ve tropikal türlerde de oldukça iddialı bir akvaryumcu.

    Ankara


    Doğa Akvaryum

    Tetra türleri, canlıdoğuranlar, cüce cichlidler, discus ve pek çok bitki türünü bulabileceğiniz bir akvaryumcu.

    Adana


    Guppy Pet Shop

    Geniş yelpazeli sanal mağazası ve dükkanıyla Anadolu'nun en öne çıkan firmalarından.

    Son 24 Saatte En Çok Mesaj Gelen Konular


    Son 24 Saatte En Çok Beğeni Alan Konular