"Умная" теплица

Kera.80
Offline
Зарегистрирован: 12.04.2017
// ЗАДАЧА: написать скетч для теплицы со следующими параметрами
// при поступлении данных о температуре с датчика сервомотор открывает-закрывает форточку для провертивания
// при поступлении данных с датчика о влажности почвы осуществлять полив путём включения магнитного клапана - через реле
// при наполнении поливочной ёмкости при поступлении данных с датчика уровня воды отключать набор воды путём отключения магнитного клапана - через реле
// НА БУДУЩЕЕ - магнитных клапана должно быть два и осуществлять забор воды в ёмкость путём открытия-закрытия входящего и выходящего клапана

   unsigned long nextTime = 0; //задаём большую переменную для миллес

   #include <DHT.h>                      // Подключаем библиотеку датчика DHT 
   #define DHTTYPE DHT11                 // Определяем используемый тип датчика
   /* типы DHT для библитеки можно менять
   //#define DHTTYPE DHT22               // DHT 22  (AM2302)
   //#define DHTTYPE DHT21*/             // DHT 21 (AM2301)
   #include <CustomStepper.h>            // Подключаем библиотеку управления шаговым двигателем. По умолчанию настроена на двигатель 28BYJ-48-5V
   CustomStepper stepper(8, 9, 10, 11);  // Указываем пины, к которым подключен драйвер шагового двигателя
   #define DHTPIN 2                      // Даём пин для датчика DHT
   DHT dht(DHTPIN, DHTTYPE);             // Определяем что нзвания DHT это пин и тип датчика 
   int Relay1;                           // Переменная реле 1
   #define Relay1Pin 3                   // Даём пин реле 1
   //int Relay2;                         // Переменная реле 2
   //#define Relay2Pin 4                 // Даём пин реле 2 
   int example = 1;                      // Переменная отвечающая за смену режимов
   int PohcvaPin = A0;                   // Даём пин датчику почвы
   int Pohcva = 0;                       // Определяем начальную точку для датчика почвы
   const uint8_t pinSensorV=5;           // Создаём константу для верхнего датчика воды, указывая номер пина к которому подключён датчик
   //const uint8_t pinSensorN=6;         // Создаём константу для нижнего датчика воды, указывая номер пина к которому подключён датчик
   /*занятые пины - 
                    А0(датчик почвы)
                    2 (датчик DHT)
                    3 (Реле1)
                    //4 (Реле2)
                    5 (верхний датчик уровня воды)
                    //6 (нижний датчик уровня воды)
                    8,9,10,11 (шаговый двигатель)
   */

void setup()
{ 
  {// определяем пин реле как выход
   pinMode (Relay1, OUTPUT);
   //pinMode (Relay2, OUTPUT);
    }
  {// определяем пин датчика почвы как вход
   pinMode (Pohcva, INPUT);
    } 
  {// настраеваем шаговый двигатель
   stepper.setRPM(12);                 // Устанавливаем кол-во оборотов в минуту
   stepper.setSPR(4075.7728395);       // Устанавливаем кол-во шагов на полный оборот. Максимальное значение 4075.7728395
    }
  { // настраиваем датчики уровня воды
   pinMode(pinSensorV, INPUT_PULLUP);  // Конфигурируем вывод как вход, подтягивая его до уровня логической «1» через внутренний подтягивающий резистор Arduino
   //pinMode(pinSensorN, INPUT_PULLUP);  // Конфигурируем вывод как вход, подтягивая его до уровня логической «1» через внутренний подтягивающий резистор Arduino
  }
  {// запуск датчик DHT
    dht.begin();
    }
}

void loop()
{ 
  //опреляем переменные для температуры и влажности датчика DHT 
  float h = dht.readHumidity();         // определяем что h-влажность
  float t = dht.readTemperature();      // определяем что t-температура

  if (nextTime <=millis())              // таймер запуска проверки сведений с датчиков

 {// ОТКРЫТИЕ-ЗАКРЫТИЕ ФОРТОЧКИ  
  // паузы на запуск программы 
  nextTime = millis()+(30*60*1000);     // по истечении каждых 30 минут запускает программу (30 минут * 60 секунд (в минуте) * 1000 миллисекунд (в секунде))
    
  if (t>25 and example == 1)            // если температура больше 25 и демонтрационная переменная =1, возвращает true
  { //шаговый двигатель открытие форточки
    stepper.setDirection(CW);           // Устанавливает направление вращения. Может принимать 3 значения: CW - по часовой, CCW - против часовой, STOP
    stepper.rotate(20);                 // Устанавливает вращение на заданное кол-во оборотов
    example = 2;                        // по окончании вращения меняет переменную с 1 на 2
    }
  if (t<25 and example == 2)            // если температура меньше 25 и демонтрационная переменная =2, возвращает true
  { // шаговый двигатель закрытие форточки
    stepper.setDirection(CCW);          // Устанавливает направление вращения.
    stepper.rotate(20);                 // Устанавливает вращение на заданное кол-во оборотов
    example = 1;                        // по окончании вращения меняет переменную с 2 на 1
    }
 }

{ // ПОЛИВ
  // паузы на запуск программы
  nextTime = millis()+(3*60*60*1000);     // по истечении каждых 3-х часов запускает программу (3 часа * 60 минут (в часе)2 минута * 60 секунд (в минуте) * 1000 миллисекунд (в секунде))
 
  if (analogRead (Pohcva > 800))        // если валжность низкая   
  {// включение реле на магнитном клапане
    digitalWrite (Relay1, HIGH);
    //digitalWrite (Relay2, HIGH);
    }
  if (analogRead (Pohcva < 200))        // если влажность высокая
  {// выключение реле на магнитном клапане
    digitalWrite (Relay1, LOW);
    //digitalWrite (Relay2, LOW);
    }
}

{ //ПРОВЕРКА УРОВНЯ ВОДЫ В ЁМКОСТИ
  //паузы на запуск программы
  nextTime = millis()+(2*60*1000);     // по истечении каждых 2 минуты запускает программу (2 минуты * 60 секунд (в минуте) * 1000 миллисекунд (в секунде))
  
  if (!digitalRead(pinSensorV))        // если верхний датчик утонул
  {// выключаем реле 1
      digitalWrite (Relay1, LOW);
  }
    }
    
}

 

Kera.80
Offline
Зарегистрирован: 12.04.2017

Доброго времени суток.

Кому не слишком трудно?

Будет ли работать скетч? Пишу скетч в первый раз.

bwn
Offline
Зарегистрирован: 25.08.2014

А самому попробовать, не?

Kera.80
Offline
Зарегистрирован: 12.04.2017

Железо с чрепахами из Китая идет:((

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

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

Лично я начал бы с наброска алгоритма работы всего этого на бумаге и уж потом в код.

bwn
Offline
Зарегистрирован: 25.08.2014

Для начала берем и компилируем в IDE. Если откомпилировалось, значит синтаксис по крайней мере правильный. Потом считаем количество и соответствие фигурных скобок.
Далее обращаем внимание на строки 69, 87, 103 и пытаемся представить, что там происходит и к чему приведет (можно прямо на бумажке).

Kera.80
Offline
Зарегистрирован: 12.04.2017

bwn пишет:

Для начала берем и компилируем в IDE. Если откомпилировалось, значит синтаксис по крайней мере правильный. Потом считаем количество и соответствие фигурных скобок.
Далее обращаем внимание на строки 69, 87, 103 и пытаемся представить, что там происходит и к чему приведет (можно прямо на бумажке).


IDE компилирует, скобки норм. Вопрос как будет работать задержка открыт. Скетч недели две делал так что и без бумажки в голове все прокрутил много раз (слава богу воображение есть).

Kera.80
Offline
Зарегистрирован: 12.04.2017

ulis пишет:

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

Лично я начал бы с наброска алгоритма работы всего этого на бумаге и уж потом в код.


Датчик в землю только на конце думаю трубки медные вместо щупа.
Про концевики ваще не понял т.к. дуб дубом. Если не есть время можно как то поподробней? Спс за внимание и участие.

Kera.80
Offline
Зарегистрирован: 12.04.2017

Сори за ошики с телефона неудобно.

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

Я вас уверяю, что начинать такие проекты с кодирования - это в корне не верно. Сначала сделайте всю "механическую" работу (с учетом того, что этим нужно будет управлять электрически), которая будет открывать, закрывать теплицу, подавать воду, мерить влажность земли, температуру  и т.д., а уж потом поэтапно, считывая значения с датчиков, включать или выключать что-либо. Ведь просто покрутить шаговым - это одно, а заставить его открыть форточку, это несколько другое

bwn
Offline
Зарегистрирован: 25.08.2014

"Скетч недели две делал так что и без бумажки в голове все прокрутил много раз (слава богу воображение есть)."
Вы в этом уверены? Тогда по шагам: В начале запуска nextTime == 0. При входе в loop, считали температуру и тут же попали в If, т.к. условие истинно. Взвели nextTime на 30 минут и проверяем температуры. Далее взвели nextTime на 3 часа и проверяем полив. В итоге взводим nextTime на 2 минуты и проверяем поплавки. loop завершился и перешел к началу. По истечении 2-х минут условие снова истинно и начался второй круг. Все ваши промежуточные, желаемые, задержки остались в далеком прошлом и есть двухминутный бесконечный цикл.

Kera.80
Offline
Зарегистрирован: 12.04.2017

bwn пишет:

"Скетч недели две делал так что и без бумажки в голове все прокрутил много раз (слава богу воображение есть)."
Все ваши промежуточные, желаемые, задержки остались в далеком прошлом и есть двухминутный бесконечный цикл.


Это то меня и волновало. Только не был уверен как работать будет.
В начале была одна общая задежка, потом разделил на три.
Первая щадержка должна раьюботать каждые 2 минуты это правильно. Но на рстальных другое время и при срабатывании первой задежки они не далут истину и соответственно не сработают пока время у них не наступит. (Такая была логика). Если не сработает вернусь к единой задержке.
Огромное спасибо за коменты, такие нюансы еще не могу предполагать.

Kera.80
Offline
Зарегистрирован: 12.04.2017

ulis пишет:

Я вас уверяю, что начинать такие проекты с кодирования - это в корне не верно. Сначала сделайте всю "механическую" работу (с учетом того, что этим нужно будет управлять электрически), которая будет открывать, закрывать теплицу, подавать воду, мерить влажность земли, температуру  и т.д., а уж потом поэтапно, считывая значения с датчиков, включать или выключать что-либо. Ведь просто покрутить шаговым - это одно, а заставить его открыть форточку, это несколько другое


Спс за совет. Я бы так и сделал но руки уж очень чешутся:)) Железо жду и пока что могу просчитываю (в т.ч. и по соединению) но в голове.

Kera.80
Offline
Зарегистрирован: 12.04.2017

Может подскажите как лучше запитать 3-5 шаговых двигателей. Ардуино то не потянет.

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

Kera.80 пишет:
Может подскажите как лучше запитать 3-5 шаговых двигателей. Ардуино то не потянет.

Ну конечно, ардуино не "потянет", для этого есть "усилители мощности", или как их называют - драйвера: http://www.ebay.com/itm/Stepper-Motor-Drive-Controller-Board-Module-L298N-Dual-H-Bridge-DC-For-Arduino-/170926726867?hash=item27cc06ded3:g:s4wAAOSwXeJXe31g

Kera.80
Offline
Зарегистрирован: 12.04.2017

Про драйвера я знаю. Но они на 1-2 идут а больше нельзя? Получается нужно 4 драйвера будет, правильно?

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

Kera.80 пишет:
Про драйвера я знаю. Но они на 1-2 идут а больше нельзя? Получается нужно 4 драйвера будет, правильно?

Получается да, нужно 4 таких платы ....

Есть еще такие: http://www.ebay.com/itm/Motor-Drive-Shield-Expansion-Board-L293D-For-Arduino-Duemilanove-Mega2560-UNO-/221924203360?hash=item33abb69b60:g:2BAAAOSwA4dWLtGO

Можно подключить 2 шаговых, но они не такие мощные, до 1.2А ....

 

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

А зачем вообще в вашем скетче использовать задержки? На мой взгляд, нужно "работать" в реальном времени - по значениям датчиков. Если температура, допустим, опустилась ниже 20С - то прикрыть форточку на 50%, если выше 25 - открыть на 100% и т.д. Гистерезис 20С - 25С как раз и задаст нужную "задержку". Это, конечно, упрощенно 

Kera.80
Offline
Зарегистрирован: 12.04.2017

ulis пишет:

А зачем вообще в вашем скетче использовать задержки? На мой взгляд, нужно "работать" в реальном времени - по значениям датчиков. Если температура, допустим, опустилась ниже 20С - то прикрыть форточку на 50%, если выше 25 - открыть на 100% и т.д. Гистерезис 20С - 25С как раз и задаст нужную "задержку". Это, конечно, упрощенно 


Насколько я понимаю (из инета) задержка экономит память. Это раз.
Во-вторых, сам понимаю, что не совсем простой для меня скетч, но если просто мигать диодами все время, то ничему не научишься. Я купил ампеку детям а теперь приходится быть "умнее". Это два.
Если бкз задержки то электроклапан будет включаться ажлую секунду или быстрее при сухой земле и полной емкости с водой. Это три.

Kera.80
Offline
Зарегистрирован: 12.04.2017

ulis пишет:

А зачем вообще в вашем скетче использовать задержки? На мой взгляд, нужно "работать" в реальном времени - по значениям датчиков. Если температура, допустим, опустилась ниже 20С - то прикрыть форточку на 50%, если выше 25 - открыть на 100% и т.д. Гистерезис 20С - 25С как раз и задаст нужную "задержку". Это, конечно, упрощенно 


Насколько я понимаю (из инета) задержка экономит память. Это раз.
Во-вторых, сам понимаю, что не совсем простой для меня скетч, но если просто мигать диодами все время, то ничему не научишься. Я купил ампеку детям а теперь приходится быть "умнее". Это два.
Если бкз задержки то электроклапан будет включаться ажлую секунду или быстрее при сухой земле и полной емкости с водой. Это три.

Kera.80
Offline
Зарегистрирован: 12.04.2017

ulis пишет:

Kera.80 пишет:
Про драйвера я знаю. Но они на 1-2 идут а больше нельзя? Получается нужно 4 драйвера будет, правильно?

Получается да, нужно 4 таких платы ....

Есть еще такие: http://www.ebay.com/itm/Motor-Drive-Shield-Expansion-Board-L293D-For-Arduino-Duemilanove-Mega2560-UNO-/221924203360?hash=item33abb69b60:g:2BAAAOSwA4dWLtGO

Можно подключить 2 шаговых, но они не такие мощные, до 1.2А ....

 


Спасибо а чем их питать?

Kera.80
Offline
Зарегистрирован: 12.04.2017

Заметил что с таким скетчем будет включаться выключаться. Надо исправить:)) спс всем за участие.

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011

Kera.80 пишет:

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

Ну вы сами видите, что русло обсуждения уже выходит за рамки скетча и форума .... ваш клапан будет безоговорочно включаться по датчику уменьшения воды в баке ниже нормы, безоговорочно выключаться при заполнении бака и включаться при "усыхании" почвы, скажем ниже 25% и выключаться при достижении, допустим 60% влажности почвы ... где вы видите здесь "каждую секунду? Полив с 25% до 60%, допустим займет 10 минут, далее все будет выключено, пока влажность не упадет до 25%, а это произойдет за пару часов, не меньше

Kera.80
Offline
Зарегистрирован: 12.04.2017

Вижу, что утомил всех. Спасибо большое за советы и обсуждерие. Мне очень помогло. Теперь знаю что делать.

bwn
Offline
Зарегистрирован: 25.08.2014

В принципе ulis совершенно прав. Скетч будет работать.
Для познаний и как осуществлять опросы и действия по времени почитайте здесь. Там есть еще один на эту тему, этот начальный.

ulis
ulis аватар
Offline
Зарегистрирован: 09.03.2011
Kera.80
Offline
Зарегистрирован: 12.04.2017

Спс