bir kez loop döngüsü
  • Bir sulama projesi yapmayı düşünüyorum RTC ve toprak sensörlerim var.
    yapmak stediğim şu:
    verdiğim saat aralığında (20:00-06:00) "toprak kuruysa" sulama yapacak değilse yapmayacak. bunu yaptım ancak durum şu şekilde oldu. saate bakıp toprak kuruysa suama yapıyor ve istenilen değere gelince duruyor. burada bir problem yok ancak biraz zaman geçince m3sela 300 verdiğim değer 301 olduğu anda tekrar sulama yapıyor. ben bunu istemiyorum sürekli loopa girmesi yerine saat aralığında toprağa bakıp sulasın, 300 yapınca artık o gün sulama yapmasın istiyorum.
    bunu nasıl sağlayabilrim?
    Kodlarım aşağıdaki gibi:
    #include " U8glib.h"
    #include < DS3231.h>
    Time t;

    // onden bakınca en sağdan 1. pin GND 2. pin VCC bir boşluk bırak sırasıyla 12,11,13. en sola geç 1. pin GND 2. pin 3,3v 6. pin GND
    U8GLIB_ST7920_128X64 u8g(13,11,12,U8G_PIN_NONE);
    DS3231 rtc(SDA, SCL);

    int role1 = 4;
    int role2 = 5;
    int role3 = 6;
    int role4 = 7;
    int role5 = 8;


    void draw(void) {
    // graphic commands to redraw the complete screen should be placed here
    //u8g.setFont(u8g_font_5x7);
    u8g.setFont(u8g_font_5x8r);
    u8g.setScale2x2();
    u8g.drawStr(0, 7, rtc.getTimeStr());
    u8g.undoScale();
    u8g.drawStr(85,14,rtc.getDOWStr());
    u8g.drawStr(79,6,rtc.getDateStr());


    u8g.drawFrame(0,18,67,10);
    u8g.drawStr( 2, 26, "CAM:");
    u8g.setPrintPos(21,26);
    u8g.print(analogRead(A0));


    u8g.drawFrame(0,27,67,10);
    u8g.drawStr( 2, 35, "MADAGASK:");
    u8g.setPrintPos( 47,35);
    u8g.print(analogRead(A1));


    u8g.drawFrame(0,36,67,10);
    u8g.drawStr( 2, 44, "ITIR:");
    u8g.setPrintPos( 27, 44);
    u8g.print(analogRead(A2));




    u8g.drawFrame(0,45,128,10);
    u8g.drawStr( 2, 53, "MUM CICEGI:");
    u8g.setPrintPos( 66, 53);
    u8g.print(analogRead(A3));


    u8g.drawFrame(0,54,128,10);
    u8g.drawStr( 2, 62, "KAKTUS:");
    u8g.setPrintPos( 66, 62);
    u8g.print(analogRead(A4));

    }
    void setup()
    {
    // Setup Serial connection
    Serial.begin(115200);
    // Uncomment the next line if you are using an Arduino Leonardo
    //while (!Serial) {}

    // Initialize the rtc object
    rtc.begin();

    // The following lines can be uncommented to set the date and time
    //rtc.setDOW(WEDNESDAY); // Set Day-of-Week to SUNDAY
    //rtc.setTime(13, 43, 0); // Set the time to 12:00:00 (24hr format)
    //rtc.setDate(29, 7, 2018); // Set the date to January 1st, 2014

    pinMode(role1, OUTPUT);
    pinMode(role2, OUTPUT);
    pinMode(role3, OUTPUT);
    pinMode(role4, OUTPUT);
    pinMode(role5, OUTPUT);


    digitalWrite(role1, HIGH);
    digitalWrite(role2, HIGH);
    digitalWrite(role3, HIGH);
    digitalWrite(role4, HIGH);
    digitalWrite(role5, HIGH);
    // flip screen, if required
    u8g.setRot180();


    // set SPI backup if required
    //u8g.setHardwareBackup(u8g_backup_avr_spi);

    // assign default color value
    if ( u8g.getMode() == U8G_MODE_R3G3B2 ) {
    u8g.setColorIndex(255); // white
    }
    else if ( u8g.getMode() == U8G_MODE_GRAY2BIT ) {
    u8g.setColorIndex(3); // max intensity
    }
    else if ( u8g.getMode() == U8G_MODE_BW ) {
    u8g.setColorIndex(1); // pixel on
    }
    else if ( u8g.getMode() == U8G_MODE_HICOLOR ) {
    u8g.setHiColorByRGB(255,255,255);
    }

    }





    void loop()
    { // picture loop
    u8g.firstPage();
    do {
    draw();
    } while( u8g.nextPage() );


    // Send Day-of-Week
    Serial.print(rtc.getDOWStr());
    Serial.print(" ");

    // Send date
    Serial.print(rtc.getDateStr());
    Serial.print(" -- ");


    // Send time
    Serial.print(rtc.getTimeStr());

    Serial.print(" 1-");
    Serial.print(analogRead(A0));
    Serial.print(" 2-");
    Serial.print(analogRead(A1));
    Serial.print(" 3-");
    Serial.print(analogRead(A2));
    Serial.print(" 4-");
    Serial.print(analogRead(A3));
    Serial.print(" 5-");
    Serial.println(analogRead(A4));


    t=rtc.getTime();
    //====================================================================================================================
    if(( t.hour == 22) && (t.min >= 0 && t.min <=59 )&&(analogRead(A0)<=600))<br />{
    digitalWrite(role1,LOW);
    }
    else{
    digitalWrite(role1,HIGH);
    }
    //====================================================================================================================
    if(( t.hour == 22) && (t.min >= 0 && t.min <=59 )&&(analogRead(A1)<=600))<br />{
    digitalWrite(role2,LOW);
    }
    else{
    digitalWrite(role2,HIGH);
    }
    //====================================================================================================================
    if(( t.hour == 22) && (t.min >= 0 && t.min <=59 )&&(analogRead(A2)<=600))<br />{
    digitalWrite(role3,LOW);
    }
    else{
    digitalWrite(role3,HIGH);
    }
    //====================================================================================================================
    if(( t.hour == 22) && (t.min >= 0 && t.min <=59 )&&(analogRead(A3)<=600))<br />{
    digitalWrite(role4,LOW);
    }
    else{
    digitalWrite(role4,HIGH);
    }
    //====================================================================================================================
    if(( t.hour == 22) && (t.min >= 0 && t.min <=59 )&&(analogRead(A4)<=600))<br />{
    digitalWrite(role5,LOW);
    }
    else{
    digitalWrite(role5,HIGH);
    }

    // Wait one second before repeating :)
    delay (1000);
    }
  • NOT:sistemin çalışmasını kontrol etmek için deneme yaptığımdan saati 20:00-06:00 değil de kısa bir aralık seçtim.
    istediğim şekilde olduğunda saatleri düzelteceğim :)
  • (t.min >= 0 && t.min <=59 ) koşuluna gerek yok çünkü zaten dakika 0-59 arasıdır, sürekli true çıkar yani.<br />
    Soruya gelirsek bir global değişken ile toprağın sulanıp sulanmadığını kontrol edebiliriz. Sulandı ise belirlenen saatler içerisinde tekrar sulamaz. Tabi göremediğim bir hata olabilir, denemek lazım.

    if(t.hour >= 20 || t.hour <= 6) {
    for(uint8_t a = 0; a < 5; ++a) {
    uint8_t role = a + 4;
    if(analogRead(a) > 600)
    digitalWrite(role, HIGH);

    else if((sulandi & 1 << a) == 0) {
    digitalWrite(role, LOW);
    sulandi |= 1 << a;
    }
    }
    }
    else
    sulandi = 0;
  • Saat sınırını iki şartı da denemek için kısa tutmustum.o yuzden oyle kalmis.
    Peki ertesi gün tekrar kontrol edip sulayacak mi bu durumda?
    Benim yapmak istediğim günde belirtilen saatlerde ölçüm yapıp bir kez o değere getirmesi.
    Yani o saat dilimi içinde defalarca deger 599'a düşünce 600e tamamlamasin.
  • Aslında bu kod sadece senin yazdığın koda istediğin özelliğin eklenmiş hali. Tabi biraz da kısalttım. Evet belirlenen saatlerde ölçüm yapar ve bir kere suladımı ertesi güne kadar tekrar sulamaz. Saat 7 oldumu durum resetlenir ve yeniden başlanır.

    Ancak bu kodda temelden hatalar var (senin kodda da var). Mesela 6:59'da sulanmaya başlarsa ve 7:00'a kadar durmazsa akşam 20:00'a kadar sulamaya devam eder.

    İkinci sorun da analog ölçümün kritik eşiklerde yapılması. Mesela bir anlık 600 ölçtü ve sulamaya başladı. 1 saniye sonra 601 ölçerse sulama durur ve o gün bir daha çalışmaz.

    Bu sorunları aşmak için yeni bir algoritma kurmak lazım.
  • Sulama durması sıkıntı yaratmaz aslında. 601 olur durur ertesi gün 550 görür 600 yapar vs.
    O günlük sulamaya gerek olmadığı manasına gelir.
    Benim korkum 9 günlük tatilde kuruyup gitmemesi.
    Yani çok kritik değerler değil. O yüzden aslında günde 1 kez istiyorum. Dakikada bir 599 olup olup devreye girmesin diye.
    Aklıma şu geldi aslında.
    Saat aralığı vermesem de.
    Sabah 05:00-05:01 arası ölçüp sulama ihtiyacı varsa sulasa yeter.
    Bu şekilde günde 1 kez komutlarına gerek kalmamış olur sanki?
    Şunu nasıl yapabilriim peki.
    Ölçüm yap, 600 ustundeyse 200 olana kadar sula.
    Yani ölçüm limiti farklı sulama limiti farklı olacak şekilde.
    Bunu yaparsam sık sık çalışmanin önüne geçebilirim. Gerçek sulamaya daha yakın bir simülasyon olur.
    Çünkü geçen ölçüm yaptığımda sulama anında değer 200 oluyor, 20-30 dk içinde 350 civarlarına dusuyordu su aşağı suzuldugunden dolayı.

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.