"Умная" теплица
- Войдите на сайт для отправки комментариев
Ср, 12/04/2017 - 00:38
// ЗАДАЧА: написать скетч для теплицы со следующими параметрами // при поступлении данных о температуре с датчика сервомотор открывает-закрывает форточку для провертивания // при поступлении данных с датчика о влажности почвы осуществлять полив путём включения магнитного клапана - через реле // при наполнении поливочной ёмкости при поступлении данных с датчика уровня воды отключать набор воды путём отключения магнитного клапана - через реле // НА БУДУЩЕЕ - магнитных клапана должно быть два и осуществлять забор воды в ёмкость путём открытия-закрытия входящего и выходящего клапана 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); } } }
Доброго времени суток.
Кому не слишком трудно?
Будет ли работать скетч? Пишу скетч в первый раз.
А самому попробовать, не?
Железо с чрепахами из Китая идет:((
А как вы собираетесь измерять влажность почвы, датчик влажности в матушку-землю зароете? А как вы узнаете, что форточка открыта или закрыта - только по числу шагов двигателя? А вдруг сбой и будет ваш моторчик шестеренки крутить ... может на всякий случай дополнить концевиками?
Лично я начал бы с наброска алгоритма работы всего этого на бумаге и уж потом в код.
Для начала берем и компилируем в IDE. Если откомпилировалось, значит синтаксис по крайней мере правильный. Потом считаем количество и соответствие фигурных скобок.
Далее обращаем внимание на строки 69, 87, 103 и пытаемся представить, что там происходит и к чему приведет (можно прямо на бумажке).
Для начала берем и компилируем в IDE. Если откомпилировалось, значит синтаксис по крайней мере правильный. Потом считаем количество и соответствие фигурных скобок.
Далее обращаем внимание на строки 69, 87, 103 и пытаемся представить, что там происходит и к чему приведет (можно прямо на бумажке).
IDE компилирует, скобки норм. Вопрос как будет работать задержка открыт. Скетч недели две делал так что и без бумажки в голове все прокрутил много раз (слава богу воображение есть).
А как вы собираетесь измерять влажность почвы, датчик влажности в матушку-землю зароете? А как вы узнаете, что форточка открыта или закрыта - только по числу шагов двигателя? А вдруг сбой и будет ваш моторчик шестеренки крутить ... может на всякий случай дополнить концевиками?
Лично я начал бы с наброска алгоритма работы всего этого на бумаге и уж потом в код.
Датчик в землю только на конце думаю трубки медные вместо щупа.
Про концевики ваще не понял т.к. дуб дубом. Если не есть время можно как то поподробней? Спс за внимание и участие.
Сори за ошики с телефона неудобно.
Я вас уверяю, что начинать такие проекты с кодирования - это в корне не верно. Сначала сделайте всю "механическую" работу (с учетом того, что этим нужно будет управлять электрически), которая будет открывать, закрывать теплицу, подавать воду, мерить влажность земли, температуру и т.д., а уж потом поэтапно, считывая значения с датчиков, включать или выключать что-либо. Ведь просто покрутить шаговым - это одно, а заставить его открыть форточку, это несколько другое
"Скетч недели две делал так что и без бумажки в голове все прокрутил много раз (слава богу воображение есть)."
Вы в этом уверены? Тогда по шагам: В начале запуска nextTime == 0. При входе в loop, считали температуру и тут же попали в If, т.к. условие истинно. Взвели nextTime на 30 минут и проверяем температуры. Далее взвели nextTime на 3 часа и проверяем полив. В итоге взводим nextTime на 2 минуты и проверяем поплавки. loop завершился и перешел к началу. По истечении 2-х минут условие снова истинно и начался второй круг. Все ваши промежуточные, желаемые, задержки остались в далеком прошлом и есть двухминутный бесконечный цикл.
"Скетч недели две делал так что и без бумажки в голове все прокрутил много раз (слава богу воображение есть)."
Все ваши промежуточные, желаемые, задержки остались в далеком прошлом и есть двухминутный бесконечный цикл.
Это то меня и волновало. Только не был уверен как работать будет.
В начале была одна общая задежка, потом разделил на три.
Первая щадержка должна раьюботать каждые 2 минуты это правильно. Но на рстальных другое время и при срабатывании первой задежки они не далут истину и соответственно не сработают пока время у них не наступит. (Такая была логика). Если не сработает вернусь к единой задержке.
Огромное спасибо за коменты, такие нюансы еще не могу предполагать.
Я вас уверяю, что начинать такие проекты с кодирования - это в корне не верно. Сначала сделайте всю "механическую" работу (с учетом того, что этим нужно будет управлять электрически), которая будет открывать, закрывать теплицу, подавать воду, мерить влажность земли, температуру и т.д., а уж потом поэтапно, считывая значения с датчиков, включать или выключать что-либо. Ведь просто покрутить шаговым - это одно, а заставить его открыть форточку, это несколько другое
Спс за совет. Я бы так и сделал но руки уж очень чешутся:)) Железо жду и пока что могу просчитываю (в т.ч. и по соединению) но в голове.
Может подскажите как лучше запитать 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
Про драйвера я знаю. Но они на 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А ....
А зачем вообще в вашем скетче использовать задержки? На мой взгляд, нужно "работать" в реальном времени - по значениям датчиков. Если температура, допустим, опустилась ниже 20С - то прикрыть форточку на 50%, если выше 25 - открыть на 100% и т.д. Гистерезис 20С - 25С как раз и задаст нужную "задержку". Это, конечно, упрощенно
А зачем вообще в вашем скетче использовать задержки? На мой взгляд, нужно "работать" в реальном времени - по значениям датчиков. Если температура, допустим, опустилась ниже 20С - то прикрыть форточку на 50%, если выше 25 - открыть на 100% и т.д. Гистерезис 20С - 25С как раз и задаст нужную "задержку". Это, конечно, упрощенно
Насколько я понимаю (из инета) задержка экономит память. Это раз.
Во-вторых, сам понимаю, что не совсем простой для меня скетч, но если просто мигать диодами все время, то ничему не научишься. Я купил ампеку детям а теперь приходится быть "умнее". Это два.
Если бкз задержки то электроклапан будет включаться ажлую секунду или быстрее при сухой земле и полной емкости с водой. Это три.
А зачем вообще в вашем скетче использовать задержки? На мой взгляд, нужно "работать" в реальном времени - по значениям датчиков. Если температура, допустим, опустилась ниже 20С - то прикрыть форточку на 50%, если выше 25 - открыть на 100% и т.д. Гистерезис 20С - 25С как раз и задаст нужную "задержку". Это, конечно, упрощенно
Насколько я понимаю (из инета) задержка экономит память. Это раз.
Во-вторых, сам понимаю, что не совсем простой для меня скетч, но если просто мигать диодами все время, то ничему не научишься. Я купил ампеку детям а теперь приходится быть "умнее". Это два.
Если бкз задержки то электроклапан будет включаться ажлую секунду или быстрее при сухой земле и полной емкости с водой. Это три.
Получается да, нужно 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А ....
Спасибо а чем их питать?
Заметил что с таким скетчем будет включаться выключаться. Надо исправить:)) спс всем за участие.
Если бкз задержки то электроклапан будет включаться ажлую секунду или быстрее при сухой земле и полной емкости с водой.
Ну вы сами видите, что русло обсуждения уже выходит за рамки скетча и форума .... ваш клапан будет безоговорочно включаться по датчику уменьшения воды в баке ниже нормы, безоговорочно выключаться при заполнении бака и включаться при "усыхании" почвы, скажем ниже 25% и выключаться при достижении, допустим 60% влажности почвы ... где вы видите здесь "каждую секунду? Полив с 25% до 60%, допустим займет 10 минут, далее все будет выключено, пока влажность не упадет до 25%, а это произойдет за пару часов, не меньше
Вижу, что утомил всех. Спасибо большое за советы и обсуждерие. Мне очень помогло. Теперь знаю что делать.
В принципе ulis совершенно прав. Скетч будет работать.
Для познаний и как осуществлять опросы и действия по времени почитайте здесь. Там есть еще один на эту тему, этот начальный.
http://arduino.ru/forum/proekty/umnaya-teplitsa
Спс