Автоматический полив растения (скоро Новый год)

Тема в разделе "Глядите, что я сделал", создана пользователем Вячеслав, 24 дек 2012.

  1. Megakoteyka

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

    А версия Adruino IDE у Вас какая? Вроде в ранних версиях в Delay был int, потом переправили на long.
    Только в случае с int задержки вообще не будет, где-то на форуме уже обсуждалось.

    Функцию Music переписать бы, а то много памяти жрет впустую на одинаковые вызовы функций.
    Код (Text):

    // количество звуков
    int m_count = 5;
     
    // каждая строка - тон, длительность и задержка
    int m_args[] = {
      700, 300, 600,
      700, 300, 600,
      700, 300, 600,
      700, 300, 600,
      700, 300, 600 };
     
     
    void Music(int* args, int count)
    {
      for(int i = 0; i < count; i++)
      {
        int i3 = i * 3;
        tone(speaker, i3, i3  +1);
        delay(i3 + 2);  
      }
    }
     
    void Music(int* args, int count)
    {
      int* pArgs = args;
      for(int i = 0; i < count; i++)
      {
        tone(speaker, *pArgs++, *pArgs++);
        delay(*pArgs++);
      }
    }
    Второй вариант поменьше памяти занимает.
     
  2. 1.0.2
     
  3. Код (Text):
    void long_delay(unsigned long seconds){while(seconds--){delay(1000);}}
    Использовать так:
    Код (Text):
    long_delay(40); // Ждём 40 секунд
     
    Вячеслав нравится это.
  4. Megakoteyka

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

    А таймер прицепить не пробовали вместо delay()? А то нехорошо как-то программу вешать на десятки секунд зазря...
     
  5. Спасибо.
    Хороший выход.
    Теперь опять 10 секунд лью воду, 5 мин жду.
    Код (Text):
    /*
     
      # the sensor value description
      # 0  ~650 dry soil
      # 650~700 humid soil
      # 700~800 in water
      # Спикер на D4
    */
    int redLed=12;
    int greenLed=10;
    int blueLed=8;
    int speaker=4;
    int waterPump=3;
    int sensorValue;
    int waterMax=800;
    int waterMin=650;
     
    // the setup routine runs once when you press reset:
    void setup() {
      // initialize serial communication at 9600 bits per second:
      Serial.begin(9600);
      pinMode(redLed, OUTPUT);
      pinMode(blueLed, OUTPUT);
      pinMode(blueLed, OUTPUT);
      pinMode(waterPump, OUTPUT);
      pinMode(speaker, OUTPUT);
    }
     
     
    void Musik() {
    tone(speaker, 700, 300);
    delay(600);
    tone(speaker, 700, 300);
    delay(600);
    tone(speaker, 780, 150);
    delay(300);
    tone(speaker, 700, 150);
    delay(300);
    tone(speaker, 625, 450);
    delay(600);
    tone(speaker, 590, 150);
    delay(300);
    tone(speaker, 520, 150);
    delay(300);
    tone(speaker, 460, 450);
    delay(600);
    tone(speaker, 350, 450);
    delay(600);
    delay(600);
    tone(speaker, 350, 450);
    delay(600);
    tone(speaker, 460, 450);
    delay(600);
    tone(speaker, 520, 150);
    delay(300);
    tone(speaker, 590, 150);
    delay(300);
    tone(speaker, 625, 450);
    delay(600);
    tone(speaker, 590, 150);
    delay(300);
    tone(speaker, 520, 150);
    delay(300);
    tone(speaker, 700, 1350);
    delay(1800);
    tone(speaker, 700, 300);
    delay(600);
    tone(speaker, 700, 300);
    delay(600);
    tone(speaker, 780, 150);
    delay(300);
    tone(speaker, 700, 150);
    delay(300);
    tone(speaker, 625, 450);
    delay(600);
    tone(speaker, 590, 150);
    delay(300);
    tone(speaker, 520, 150);
    delay(300);
    tone(speaker, 460, 450);
    delay(600);
    tone(speaker, 350, 450);
    delay(600);
    delay(600);
    tone(speaker, 350, 450);
    delay(600);
    tone(speaker, 625, 450);
    delay(600);
    tone(speaker, 590, 150);
    delay(300);
    tone(speaker, 520, 150);
    delay(300);
    tone(speaker, 700, 450);
    delay(600);
    tone(speaker, 590, 150);
    delay(300);
    tone(speaker, 520, 150);
    delay(300);
    tone(speaker, 460, 1350);
    delay(5000);
    }
     
    void long_delay(unsigned long seconds){while(seconds--){delay(1000);}}
     
    // the loop routine runs over and over again forever:
    void loop() {
      // read the input on analog pin 0:
      sensorValue = analogRead(A0);
      // print out the value you read:
      Serial.println(sensorValue);
      if (sensorValue<=waterMin) {
          digitalWrite(redLed, HIGH);
          digitalWrite(greenLed, LOW);
          digitalWrite(blueLed, LOW);
          //полив
          Musik();
          digitalWrite(waterPump, HIGH);
          delay(10*1000); //льем 10 секунд
          digitalWrite(waterPump, LOW);
          long_delay(300);//ждем пять минут
        //  delay(30*1000);
      } else if ((sensorValue>waterMin)&(sensorValue<=waterMax)) {
          digitalWrite(redLed, LOW);
          digitalWrite(greenLed, HIGH);
          digitalWrite(blueLed, LOW);
          digitalWrite(waterPump, LOW);
      } else if (sensorValue>waterMax) {
          digitalWrite(redLed, LOW);
          digitalWrite(greenLed, LOW);
          digitalWrite(blueLed, HIGH);
          digitalWrite(waterPump, LOW);
      }
      delay(100);       // delay in between reads for stability
    }
     
  6. Можно и по-другому ;)
    Код (Text):
    void long_delay_min(unsigned long min){unsigned long sec = min * 60; while(sec--){delay(1000);}}
    Использовать так:
    Код (Text):
    long_delay_min(5); // ждём 5 минут
     
  7. PHP:
    /*
     
      # the sensor value description
      # 0  ~650 dry soil
      # 650~700 humid soil
      # 700~800 in water
      # Спикер на D4
    */

    int redLed=12;
    int greenLed=10;
    int blueLed=8;
    int speaker=4;
    int waterPump=3;
    int sensorValue;
    int waterMax=800;
    int waterMin=650;
     
    // the setup routine runs once when you press reset:
    void setup() {
      // initialize serial communication at 9600 bits per second:
      Serial.begin(9600);
      pinMode(redLed, OUTPUT);
      pinMode(blueLed, OUTPUT);
      pinMode(blueLed, OUTPUT);
      pinMode(waterPump, OUTPUT);
      pinMode(speaker, OUTPUT);
    }
     
     
    void Musik() {
    tone(speaker, 700, 300);
    delay(600);
    tone(speaker, 700, 300);
    delay(600);
    tone(speaker, 780, 150);
    delay(300);
    tone(speaker, 700, 150);
    delay(300);
    tone(speaker, 625, 450);
    delay(600);
    tone(speaker, 590, 150);
    delay(300);
    tone(speaker, 520, 150);
    delay(300);
    tone(speaker, 460, 450);
    delay(600);
    tone(speaker, 350, 450);
    delay(600);
    delay(600);
    tone(speaker, 350, 450);
    delay(600);
    tone(speaker, 460, 450);
    delay(600);
    tone(speaker, 520, 150);
    delay(300);
    tone(speaker, 590, 150);
    delay(300);
    tone(speaker, 625, 450);
    delay(600);
    tone(speaker, 590, 150);
    delay(300);
    tone(speaker, 520, 150);
    delay(300);
    tone(speaker, 700, 1350);
    delay(1800);
    tone(speaker, 700, 300);
    delay(600);
    tone(speaker, 700, 300);
    delay(600);
    tone(speaker, 780, 150);
    delay(300);
    tone(speaker, 700, 150);
    delay(300);
    tone(speaker, 625, 450);
    delay(600);
    tone(speaker, 590, 150);
    delay(300);
    tone(speaker, 520, 150);
    delay(300);
    tone(speaker, 460, 450);
    delay(600);
    tone(speaker, 350, 450);
    delay(600);
    delay(600);
    tone(speaker, 350, 450);
    delay(600);
    tone(speaker, 625, 450);
    delay(600);
    tone(speaker, 590, 150);
    delay(300);
    tone(speaker, 520, 150);
    delay(300);
    tone(speaker, 700, 450);
    delay(600);
    tone(speaker, 590, 150);
    delay(300);
    tone(speaker, 520, 150);
    delay(300);
    tone(speaker, 460, 1350);
    delay(5000);
    }
     
    /*
    Функции long_delay и long_delay_min созданы Злой Птичкой.
    http://khimki-forest.ru
    http://vk.com/i_am_angry_bird
    skype: vadik201041
    */

    void long_delay(unsigned long seconds){while(seconds--){delay(1000);}}
    void long_delay_min(unsigned long min){unsigned long sec = min * 60; while(sec--){delay(1000);}}
     
     
    // the loop routine runs over and over again forever:
    void loop() {
      // read the input on analog pin 0:
      sensorValue = analogRead(A0);
      // print out the value you read:
      Serial.println(sensorValue);
      if (sensorValue<=waterMin) {
          digitalWrite(redLed, HIGH);
          digitalWrite(greenLed, LOW);
          digitalWrite(blueLed, LOW);
          //полив
          Musik();
          digitalWrite(waterPump, HIGH);
          long_delay(10); //льем 10 секунд
          digitalWrite(waterPump, LOW);
          long_delay_min(5); //ждем пять минут
      } else if ((sensorValue>waterMin)&(sensorValue<=waterMax)) {
          digitalWrite(redLed, LOW);
          digitalWrite(greenLed, HIGH);
          digitalWrite(blueLed, LOW);
          digitalWrite(waterPump, LOW);
      } else if (sensorValue>waterMax) {
          digitalWrite(redLed, LOW);
          digitalWrite(greenLed, LOW);
          digitalWrite(blueLed, HIGH);
          digitalWrite(waterPump, LOW);
      }
     
  8. Ну да, можно, хотя может это уже и перебор.:)
     
  9. vell65

    vell65 Нерд

    Парни, здравствуйте! Обратите внимание на датчик влажности на этом сайте http://forum.homecitrus.ru/index.php?showtopic=8535&st=160 в посте 172 собран мной данный девайс. Работает уже много времени. Т.к. я в программировании полный ноль поэтому пришлось срастить два МК. Плюсы: медные электроды практически не окисляются, при поливе отрабатывает чётко по установленной влажности, световая индикация о состоянии влажности, второй МК предназначен для отключения полива через заданный промежуток времени если, что-то не так. В этом году буду устанавливать на огороде и в трёх теплицах. Прогон устройства на цветах прошёл успешно. Единственный недостаток при поливе цветов это отсутствие контроля одним из МК нижнего уровня где находится вода для полива, но это при использовании в домашних условиях. На даче у меня это отслеживает система управления насосами закачки в ёмкость и подачи воды в шланги капельного полива. Думаю Вам будет не проблема осуществить всё это на АРДУИНО. Если Вы поможете автору nikr на указанном сайте в написании проги, а он там перешёл на разработку ёмкостного датчика то за этим будущее. Тем более он разрабатывает для использования с горшёчными растениями для квартиры.
     
  10. Dmitriy Kunin

    Dmitriy Kunin Гик

    Ссылку на форум нужно расценивать как рекламу форума?
    Мы сейчас все туда побежим регистрироваться...
    Хотя если честно, то новый вид датчика мне лично интересен, и буду блгодарен, если картинка из 172го поста, к которой у вас есть доступ, окажется сдесь.
    Заранее спасибо!
     
  11. vell65

    vell65 Нерд

    Нет не реклама, там описание логики устройства и мнения единомышленников по достижению желаемой цели. Лучше один раз увидеть самому, чем услышать от другого. Схемы прилагаю. Где два PICа у меня уже работает.
    Датчик влажности емкостной.jpg Датчик влажности с задержкой.GIF Схема емкостного датчика.GIF
     
    nailxx нравится это.
  12. Охренеть.
    Безмерно уважаю людей, которые в этом разбираются.
     
  13. Unixon

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

    А прошивки?
     
  14. Dmitriy Kunin

    Dmitriy Kunin Гик

    Спасибо!
    Надеялся увидеть, что-то новое :)
    Просто мне всё время кажется, что если сунуть печатную плату в землю, она будет потихоньку окисляться, и параметры такого датчика будут меняться во времени.
     
  15. vell65

    vell65 Нерд

    Если говорить про датчик реагирующий на сопротивление, то при постоянном напряжении окисление электродов происходит очень заметно. Здесь же напряжение присутствует переменного характера и при использовании электродов из цветного металла например меди, окисление вообще минимально. Уход параметров за 3 месяца не наблюдался. Если разработать программу для прилагаемой схемы емкостного датчика то уход возможен только из-за температуры и то будет незначительным. Поэтому и нужен спец умеющий писать проги на ATMEGA.
    А прошивки на сайте и это не реклама. Целесообразно не только их скачать ну и почитать, чтоб не иметь вопросов по отстройке и сборке. Тем более они там в свободном доступе ну и не я их создавал.
     
  16. Chanov

    Chanov Нерд

    Может разумно ещё датчик пролива-перелива установить - 2 паралельных провода на полу в какой нить тканевой обёртке например, на всякий случай.
     
  17. vell65

    vell65 Нерд

    Конечно, это должно быть обязательно, либо в поддон, но только на датчики подаваться должно переменное или импульсное напряжение.
     
  18. Chanov

    Chanov Нерд

    А как сие попроще то сгородить?
     
  19. Проще второй датчик влажности кинут на пол.
     
  20. Chanov

    Chanov Нерд

    Ну так об этом то и речь (только датчик пролива обычно немного по другому делают, не 2 куска медной негнущейся проволоки ))) ) ... а вот как "только на датчики подаваться должно переменное или импульсное напряжение" сделать?