Авто полив растений, с датчиком влажности.

Тема в разделе "Arduino & Shields", создана пользователем Крапивин, 23 апр 2015.

  1. Крапивин

    Крапивин Нерд

    Есть проект Авто полив.
    но скетч работает не совсем так как надо.

    Кто нибудь не подскажете, как мне после отработки 1 функции , включить реле но только на 3 мин, реле включается если земля очень сухая, цикл проверки идет 1 раз в 15 мин. если оставить как есть, поливалка работает 15 мин, это много и перелив получается. Перепробовал всё. если просто моргать диодом, это вместо реле, временно, он моргает тоже с интервалом в 15 мин. если по таймеру, то первый цикл проходит как надо, а на втором цикле просто моргнет очень быстро, и не включается на заданное время.

    я уже не знаю где ошибка. работает не стабильно.



    int dat1 = 0; //объявляем глобальную переменную, сенсор влажности.
    int diodRed=5; // В место диода подключить реле для полива.
    int diodBlue;

    float TempMillis;
    int ledState = LOW;


    #define POLL_INTERVAL 150000 // опрос датчика интервал
    #define POLL_PERIOD (20000) // через сколько все отключится

    // bool poll_sensor = false;
    unsigned long time_start;
    unsigned long time_poll;

    long previousMillis = 0; // храним время последнего переключения светодиода
    long interval = 2000;
    void setup(){ // ---------------------------------------------------

    Serial.begin(9600);



    pinMode(diodRed,OUTPUT); // для реле

    }

    void loop() // ------------------------------------------------------------
    {


    if ((time_poll==time_start) || ((millis()-time_poll)>POLL_INTERVAL))
    {
    unsigned long currentMillis = millis(); // ***********



    if (analogRead(2) <= 450) // Очень влажная почва
    {
    // digitalWrite(diodBlue, HIGH);
    Serial.print("Ochen Vlagno ");
    digitalWrite(diodRed, LOW);
    }

    else if( analogRead(2)>450 && analogRead(2)<700)
    {
    Serial.print("Vlagnaya pochva "); // Влажная почва
    digitalWrite(diodRed, LOW);

    }

    else
    {
    digitalWrite(diodRed,HIGH); // Сухая почва Включает реле для полива
    Serial.print("Suhays pochva ");
    if(millis() - previousMillis > interval) {
    // сохраняем время последнего переключения
    previousMillis = millis();

    digitalWrite(diodRed,LOW); // должен выключать реле через заданное время
    digitalWrite(diodRed,!digitalRead(diodRed));
    }
    /*
    lcd.setCursor(12, 0);
    lcd.print(dat1); // выводим значение с датчика на LCD
    delay (500);
    */
    Serial.print("Vlajnost ");
    Serial.print(dat1); // Влажность земли
    Serial.println(" %%");
    Serial.println();

    time_poll = millis();

    }
    }
     
    Последнее редактирование: 24 апр 2015
  2. Уважаемый коллега! Прошу меня извинить, не имею возможности разбирать код. Постоянный цейтнот. Могу дать только идею.
    if (analogRead(2) <= 450) // Очень влажная почва
    {
    // digitalWrite(diodBlue, HIGH);
    Serial.print("Ochen Vlagno ");
    digitalWrite(diodRed, LOW);
    Ставте здесь код выключения мотора.
    }
    А от пауз и задержек откажитесь. Для Вас важно, что бы земля была влажная в нужном диапазоне. Только нужно что бы Вы правильно поэкспериментировали с расположением и заглублением датчика влажности. Не страшно если через короткое время земля будет сухой и включится полив, главное что бы насос выключал полив когда влажность (или залив) достигли нужных значений. У меня поливает примерно раз в сутки. А датчик влажности подальше расположен от шланга и заглублен только в верхний слой почвы.
     
  3. Крапивин

    Крапивин Нерд

    Здравствуйте Александр.
    я понял вашу идею.
    но если ставить выключатель после замера, что земля влажная будет оооочень сильный перелив, почвы.
    показания снимает каждые 15 или 30 мин. за 15 мин, очень много воды может выльется.

    идея тут в том, что если датчик обнаружит что земля сухая, должен включить мотор на 2 или 3 мин.
    через 15 или 30 мин снова проверит влажность, если сухо опять включит.

    если влажно то не включит.

    если делать замеры чаще, то сильно окисляются контакты датчика,
    из за гидролиза, влага + электричество.

    если выключать через delay(300000); то вся программка виснет на это время.

    вот я и пытаюсь разобраться как сделать через millis задержку на 3мин.

    когда включаю ардвинку если сухо реле включается на 2 мин. а через 15 мин если сухо, уже не включается, вот я и не понимаю в чем секрет.
     
    1. Зачем проверять влажность через 15 минут? Не жалейте 190 руб. в год на новый датчик. У меня почти полтора года отработал без позолоты.
    2. Только сейчас заметил. Библиотека которую Вы подключаете предназначена для работы с датчиком влажности и температуры воздуха. А пишите про этот http://amperka.ru/product/soil-moisture-sensor .
    Если решите не жалеть датчики, а они все имеют свой срок жизни. Используйте часть моего кода. Вам задержка в этом случае понадобится, что бы циферки на экране не мелькали.
    Код здесь http://fedoroffalexander.wix.com/smart#!page4/cfvg
    Или еще проще, вот классный готовый проект http://wiki.amperka.ru/projects:irrigator
    Всего наилучшего.
     
    Последнее редактирование: 24 апр 2015
  4. Крапивин

    Крапивин Нерд

    Александр.
    DHT11 это от предыдущего скетча остались. они на работу не влияют. их убрал уже.

    но мерить влажность почвы каждые 2 секунды это тоже не правильно . редко мерить не только для датчика хорошо но и (для экономии акум.) у меня на плате еще и передатчик сидит, и управлять должен по радио. а акум заряжается от солнца. автономная система.

    ставил время измерения и каждые 5 сек. тоже самое нет отработки включения реле повторно.
    только 1 раз.

    Александр вы можете подсказать где в коде ошибка. мне надо просто чтоб при срабатывании пункта, в коде,
    сухая почва реле включалось, на столько сколько мне надо.


    вот я прошу у народа помощи.
    а вы про датчик. что не тот. в земле именно http://amperka.ru/product/soil-moisture-sensor.
     
  5. Крапивин

    Крапивин Нерд

    так тоже пробовал . включается реле и продолжает работать 15мин.

    //проверяем не прошел ли нужный интервал, если прошел то
    if(currentMillis - previousMillis > pauseTime1 * 1000 && ledState == LOW)
    {
    // сохраняем время последнего переключения
    previousMillis = currentMillis;
    ledState = HIGH;
    // устанавливаем состояния выхода, чтобы включить или выключить светодиод
    digitalWrite(ledPin, ledState);
    }

    //проверяем не прошел ли нужный интервал, если прошел то
    if(currentMillis - previousMillis > lightTime1 * 1000 && ledState == HIGH)
    {
    // сохраняем время последнего переключения
    previousMillis = currentMillis;
    ledState = LOW;
    // устанавливаем состояния выхода, чтобы включить или выключить светодиод
    digitalWrite(ledPin, ledState);
    }

    }
     
  6. Не знаю как у Вас там, но у меня такая конструкция работает:
    unsigned long previousMillis = 0; // храним время последнего переключения чего угодно

    Можете в вызове функции передать _interval = 900000, будет 15 минут

    int pause(long _interval)
    {
    unsigned long currentMillis = millis();
    if((currentMillis - previousMillis) > _interval)
    {
    previousMillis = currentMillis;
    return HIGH;
    }
    else
    return LOW;
    }
     
    Последнее редактирование: 24 апр 2015
  7. Крапивин

    Крапивин Нерд

    нет не работает диод даже не загорелся
     
  8. Блин ведь не хотел. Давайте полный код. Схему. Кратко цели и задачи.
     
  9. Крапивин

    Крапивин Нерд

    весь скетч на самом верху.
    http://forum.amperka.ru/threads/Авто-полив-растений-с-датчиком-влажности.4930/#post-39335

    57 else if( analogRead(2)>450 && analogRead(2)<700)
    58 {
    59 Serial.print("Vlagnaya pochva "); // Влажная почва
    60 digitalWrite(diodRed, LOW);
    61
    62 }
    63
    64 else
    65 {
    66 digitalWrite(diodRed,HIGH); // Сухая почва Тут реле влючается
    67 Serial.print("Suhays pochva ");
    68 if(millis() - previousMillis > interval) {
    69 // сохраняем время последнего переключения
    70 previousMillis = millis();
    71
    72 digitalWrite(diodRed,LOW); // должно выключится через заданный интервал
    73 digitalWrite(diodRed,!digitalRead(diodRed));
    74
    75 }
     
  10. Крапивин

    Крапивин Нерд

    проблема на 66 строчке. реле включается когда сухая почва . тут все норм.
    Но надо его выключить через 3 или 4 мин. чтоб не-было перелива, и болота.

    а тут же реле продолжает работать до следующего замера, почвы, а это 15 мин интервал.
    пробовал уже разные коды, не помогает. либо 1 раз моргнет. и больше не включается,
    либо работает и не выключается.
     
  11. Нет-не коллега. Давайте полный код с моими рекомендациями. Там кстати нужно предусмотреть флаг на переключение задач. Схему. Кратко цели и задачи. Иначе толку не будет.
     
  12. Tomasina

    Tomasina Сушитель лампочек Модератор

    Научитесь код вставлять. Такое мало кто будет читать.
     
  13. Крапивин

    Крапивин Нерд

    Реле включается если датчики покажут сухая почва.
    надо чтоб включалось реле на 4 минуты, и выключилось.

    сейчас реле включается и продолжает поливать 15 мин.
    временно убрал 15 мин. поставил цикл, 4 сек. опрос датчика.


    Код (Text):

    int dat1 = 0;                  //объявляем глобальную переменную, сенсор влажности.
    int DAT = 4;                  //присваиваем 8-му пину имя DAT питание на датчик.
    int diodRed=5;      // В место диода подключить реле для полива.
    int diodBlue;
      float  TempMillis;
        #define POLL_INTERVAL 4000  // опрос датчика интервал
      //  #define POLL_PERIOD (20*20*1000) // через сколько все отключится

    //  bool poll_sensor = false;
        unsigned long time_start;
        unsigned long time_poll;
     
        long previousMillis ;        // храним время последнего переключения светодиода
        long interval = 2000;
    void setup(){            // ---------------------------------------------------

    Serial.begin(9600);

      pinMode(diodRed,OUTPUT);  // для реле
    }

    void loop()          //  ------------------------------------------------------------
    {
      //  previousMillis = millis();
      //  if(millis() - previousMillis > interval) {digitalWrite(diodRed,LOW); } //***************

      if ((time_poll==time_start) || ((millis()-time_poll)>POLL_INTERVAL))
          {
    if (analogRead(2) <= 450) // Очень влажная почва
    {
    // digitalWrite(diodBlue, HIGH);
      Serial.print("Ochen Vlagno ");
      digitalWrite(diodRed, LOW);
    }

    else if( analogRead(2)>450 && analogRead(2)<700)
    {
      Serial.print("Vlagnaya pochva ");  // Влажная почва
      digitalWrite(diodRed, LOW);

    }

    else
    {

      previousMillis = millis();      //  **********
    digitalWrite(diodRed,HIGH);      // Сухая почва включается реле для полива
      Serial.print("Suhays pochva ");

      if(millis() - previousMillis > interval) { // должен отключить реле через заданный интервал
      digitalWrite(diodRed,LOW);
     
    // digitalWrite(diodRed,!digitalRead(diodRed));

      }

    // Временно . для вывода на экран как работает датчик и что показывает.
        //  Serial.print("Vlajnost ");
          Serial.print(dat1);  // Влажность земли
          Serial.println(" %%");
          Serial.println();
       
          time_poll = millis();

      }
    }
     
  14. Крапивин

    Крапивин Нерд

    пробовал разные коды для включения. в скетче остались некоторые фрагменты кодов. я их закоментил.
     
  15. Megakoteyka

    Megakoteyka Оракул Модератор

    Код (Text):
    if(прошло 15 минут)
    {
        if(сухая_почва)
        {
          помпа_работает = true;
          включить_помпу();
          время_начала_работы_помпы = millis();
        }
    }

    if(помпа_работает)
    {
      if(прошло 3 минуты)
      {
        помпа_работает = false;
        выключить помпу();
      }
    }
     
  16. Крапивин

    Крапивин Нерд

    ОК попробую
     
  17. Крапивин

    Крапивин Нерд

    проверялка уже не работает if(millis() - previousMillis > interval)
     
  18. Досвидос Амиго! В дело вступили тигры.
     
  19. Крапивин

    Крапивин Нерд

    Александр а у вас есть какие то идеи, почему не срабатывает, включение реле на заданное время ?
    это может зависеть от использованного millis ? что оно уже используется, для контроля за временем включения датчика ?