Умная теплица на базе Arduino Mega
- Войдите на сайт для отправки комментариев
К следующему сезону хочу сделать умную теплицу . Нашел на форуме тему об этом и решил создать что то подобное.
Что уже имею :
http://www.aliexpress.com/snapshot/6171181258.html
http://www.aliexpress.com/snapshot/6171181257.html
http://www.aliexpress.com/snapshot/6171216243.html
http://www.aliexpress.com/snapshot/6171041917.html
Что хочу сделать на данном этапе :
1. К Arduino Mega подключить датчик влажности и температуры(DHT11) , датчик влажности почвы , экран с кнопками.
2. Отправлять данные с двух датчиков в последовательный порт. Будет необходимо в дальнейшем.
3. При работе устройства на экране показывается произвольное приветствие. Потом планирую выводить время.
4. Выводить на экран информацию с датчиков. Пока размышляю как лучше это сделать. На данном этапе использовать 3 кнопки с шилда с экраном для вывода каждого значения . Температуры , влажности и влажности почвы.
Хотелось бы конечно организованть ввиде меню. Например так : на экране время . есть кнопка МЕНЮ , при нажатии на нее попадаем в список с показаниями - температура , влажность , влажность почвы . Кнопачками ВВЕРХ и ВНИЗ перемещаемся по меню . При нажатии на кнопочту ENTER на экран выводиться показание. Это вообще реально на Arduino сделать ? В принципе можно просто кнопачками ВВЕРХ,ВНИЗ листать сразу значения.
Пока это все :)
Что реализовано :
1. Шилд экрана воткнут в Arduino Mega , DHT11 - земля,+5v,цифровой pin 52 . датчик влажности почвы подключен по схеме - питание цифровые пины 50 и 51 , данные через аналоговый пин а7.
в этом скетче
реализовано вывод температуры и влажности на экран и в порт. Вопрос по этому скетчу , правильно ли все написано ? Можно ли улучшить код ? Почему при быстром нажатии на кнопки они иногда не срабатывают? Что с этим можно сделать ?
Что не реализовано : вывод на экран данных с датчика влажности почвы ввиду замороченного опроса этого датчика .
вот простой скетч для датчика влажности почвы
не могу их корректно объединить.
Не могу редактировать первое сообщение :(
Итак мой скетч
это скетч для датчика влажности почвы
а это скетч предложенный пользователем art100
сейчас буду его смотреть , тестить.
Посмотрел скетч art100 внес в него изменения и вроде постарался объяснить как чего .
копаю дальше....
Основной вопрос это
можно до этого вставлять
И еще можно сделать так чтоб циклы работали раздельно. То есть :
1. цикл отслеживания кнопок работает постоянно и без задержек , думаю это даст нам 100% нажатие кнопок .
2. цикл датчика DHT11 работает со своей задержкой , скажем раз в минуту . а при нажатии кнопки выводится последнее записанное значение.
3. цикл опроса показания с датчика влажности почвы со своей задержкой , скажем раз в час . Опять таки для более долговременной работы датчика (при постоянном напряжении на металических стержнях они быстро разрушаются). А полить на час позже , думаю не страшно.
Просто думаю что кнопки начинаю плохо срабатывать из-за того что цикл идет долго . так ли это ?
//art100 20140823 обьединяем соответсвенно секциям и смотрим чтобы ноги и переменки не перехлестнулись
//подключим все внешние либы
void setSensorPolarity(boolean flip){//это меняет палярность на пинах для питания датчика влажности почвы , может поэтому в скетче примере и идет до loop, чтоб знать как считать val1 и val2 ?
на ваш дки и резстивне кнопки у вас должен быть такой пример
я взял прямо с магазина
в отличии от моего стиля преобразование в обьявления и подпрограмму выненсены
писать долше
я сходжу if-вами разбираю
вы это код для вашего индикатора видели
вставляй в касы ни хачу
так я кнопки и прописал через var . и все правильно <100 одна кнопка , от 100 до 200 вторая и т.д. С этим вроде проблем нет . Фишка вот в чем : например у меня в скетче стоит пауза 5 секунд . я нажимаю на кнопку , var меняет значение . но пока не пройдут эти 5 секунд на экран не выведиться нужная инфа . Так или нет ? Вопрос то вот в чем ардуино постоянно отслеживает var или 1 раз за цикл(loop) ?
второе
опять скетч пример для датчика влажности почвы
в нем подпрограмма
void
setSensorPolarity(boolean flip){ идет до loop , в котором идет опрос значений с изменением полярности
в вашем варианте подпрограмма
void
setSensorPolarity(boolean flip){ идет после loop , это нормально ? Если честно я не совсем понимаю как работает скетч датчика влажности почвы :)
так я его изначально и использовал , а потом ifами переписал :) впринципе это одно и тоже .
Я все три скетча(экран с кнопками , DHT11 и датчик влажности почвы) объединял . Получилось так же как у вас . Но с таким скетчем кнопки плохо работают , редко срабатывают на нажатие . Так же не доконца обнуляется экран, остаются символы от предыдущей информации.
Вот мой скетч с которым я просил помощи изначально
а в итоге вы мне его и возвращаете :) прикол
мне нужен совет как качественно изменить скетч.
Поэтому я и спрашиваю как сделать :
1. цикл отслеживания кнопок работает постоянно и без задержек , думаю это даст нам 100% нажатие кнопок .
2. цикл датчика DHT11 работает со своей задержкой , скажем раз в минуту . а при нажатии кнопки выводится последнее записанное значение.
3. цикл опроса показания с датчика влажности почвы со своей задержкой , скажем раз в час . Опять таки для более долговременной работы датчика (при постоянном напряжении на металических стержнях они быстро разрушаются). А полить на час позже , думаю не страшно.
Так можно сделать ?
Ну и очень хотелось бы чтоб объяснили почему скетч для датчика влажности написан именно так , с использованием подпрограм . Для чего они используются и почему нельзя сделать все в loope ?
Такс понятно. Так дело не пойдет.
1.300$ вперед на вебманей мне.
2.Высылаете ваши все детали мне .
3.Пишите что вы хотите.
Номер кошелька давать?
Свою электронику пришлете или на aliexpress.com укажете мой адрес получателем?
http://www.aliexpress.com/store/product/1602-LCD-Keypad-Shield-Duemilanove-UNO-MEGA2560-MEGA1280-Free-Shipping/110055_620272375.html
http://www.aliexpress.com/store/product/Moisture-Sensor-kit-urban-garden-tool-Soil-Moisture-Sensor-For-328-uno-1280-2560/110055_676775947.html
http://www.aliexpress.com/item/Freeshipping-Mega-2560-R3-Mega2560-REV3-ATmega2560-16AU-Board-USB-Cable-compatible-for-arduino-good-quality/1304207708.html
и что у на там еще градусник?
http://www.aliexpress.com/item/DHT11-Digital-Temperature-and-Humidity-Sensor-Module-For-Arduino-AVR-PIC-New/1773714030.html
и т.д.
Сидеть мне за Вас пару дней писать Вам код на Теоретичском Вашем железе интереса никакого.
я вас не понимаю .
вы попытались мне помочь в меру своих способностей .
я показал вам что то что вы мне советуете тоже самое с чем я пришел сюда искать помощи.
Задал более понятно вопросы , которые меня интересуют.
Вы зачем то заговорили о деньгах , не виртуальных желазках , написании кода за меня .
А как мне надо было ответить вам чтоб вас не обитеть ?
код за меня писать не надо . просто ответьте зависит ли отклик на кнопки от длительности выполнения loopа? как правильно написать чтоб опрос одного датчика был с одной задержкой , а другого с другой? Ну и как бонус объяснить на техническом языке работу скетча датчика влажности почвы. :) Ну не въеду я никак в причинно-следственные связи в этом скетче .
И вообще я рассчитывал на подсказки тех , кто занимается похожим проектом.
просто ответьте зависит ли отклик на кнопки от длительности выполнения loopа?
Возьмите и замерьте, за сколько выполняется loop, тогда и будет понятно, зависит или нет
как правильно написать чтоб опрос одного датчика был с одной задержкой , а другого с другой?
используя millis()
millis() для того чтоб замерить я так понял ?
вот скетч в которм все 2 датчика
чтоб информация на экране появилась надо жать на кнопку примерно секунду.
без датчика влажности почвы кнопки срабатывают нормально .
добавил delay в loop , время реакции на клавишу увеличилось . Отсюда делаю вывод что отклик на нажатие кнопки зависит от времени выполнения loopa .
И как же так сделать чтоб и кнопки реагировали быстро , и датчики опрашивать пореже ?
не проще ли выводить на экран все данные на одну секунду в цикле ? 5 данных - за 5 секунд ничего не нажимая вы их все увидите... как на двухтарифном счётчике электроэнергии с электронным табло.... ( только там каждое выводимое значение уж слишком долго высвечивается :(
экран 4 строки по 20 символов - t воэдуха, влажность воздуха и влажность почвы - за один раз всё вывести на отображение может...
на время выполнения delay() - процессор глух и нем ( типа кушает ) - вот и задержки в обработке нажатий кнопок....
Согласен что так проще . С этого я начинал . Именно так и сделал , только выводил 2 значения , экран 1602 :)
Непонравилось то , что экран мигает. Раз в секунду когда обновляется инфа.
А так как хотелось время тоже показывать , да и кнопки не выбрасывать же :) вот решил придумать как сделать лучше.
на время выполнения delay() - процессор глух и нем ( типа кушает ) - вот и задержки в обработке нажатий кнопок....
это я уже понял :)
Вот и вопрос как же так сделать чтоб кнопочки работали независимо от интервала опроса датчиков ?
А в дальнейшем планировалось сделать меню . В котором должно быть много пунктов . Не только просмотр параметров , но и управление например открытием форточки вручную .
мысли в слух . может в loopе надо только кнопки оставить и циклы для регулирования задержек опросов датчиков . а внутри этих циклов переход к функциям опроса датчиков .
Ну типа loop крутится крутится , следит за кнопками и считает время . В определенное время вызывает функцию , которая опрашивает датчик и перезаписывает значение . Так можно сделать ? :)
мысли в слух . может в loopе надо только кнопки оставить и циклы для регулирования задержек опросов датчиков . а внутри этих циклов переход к функциям опроса датчиков .
Ну типа loop крутится крутится , следит за кнопками и считает время . В определенное время вызывает функцию , которая опрашивает датчик и перезаписывает значение . Так можно сделать ? :)
loop крутится достаточно быстро, чтобы уйти от делей-ев примените millis().
не надо делать "...регулирования задержек опросов датчиков..." - засекли время миллисом, сохранили его в переменную, и в ифе смотрите - разницу между сохранённым миллисом и текущим.... если разница больше или равна периоду опроса датчика, то ветка опроса выполнится, если нет - то этот блок не будет выполняться, loop пойдёт дальше... смотрите пример БЛИНК без делей-ев
резистивная клавиатура изи трёх кнопок - каждому состоянию нажатых отжатых кнопок соответствует своё значение на входе АЦП, в лупе ифом проверяем "нет нажатых кнопок" - да=пропускаемХод, нет=уходим в процедуру обработки показаний с клавиатуры.... кататак :)
можете ли вы выложить схему резистивной клавы ? кнопки и резисторы - что как соединено ?
Вот как раз думаю как millis() прикрутить . Не могу понять как условие срабатывания сделать :(
С кнопками вроде все понятно , ifами и отслеживаю .
вот кнопки
millis() ведь постояноо растет до 2 в 32 степени , потом сбрасывается . Вот чтото не вкурю как условие придумать .
пока вот до этого додумался :)
бегло прочитал.... не всегда надо очищать ВЕСЬ экран, распределите экран под текст и меняйте-перезаписывайте ТОЛЬКО значения с датчиков, под которые выделите соответствующие знакоместа.... мерциний экрана будет меньше
millis() ведь постояноо растет до 2 в 32 степени , потом сбрасывается . Вот чтото не вкурю как условие придумать .
засечка времени - TempMillis = millis( )
отслеживание - if ( millis( ) - TempMillis > TzadannoeSlegeniya ) - то уходим в обработку этого события, нет - пропуск хода
полный скетч к чему щас пришел
покритекуйте плиз .
вниз надо будет добавить функцию для влажности и влажности почвы . Ну и в loope для них сделать свои ifы . Тогда можно будет тестить работу кнопок .
Вопросы :
1. можно ли выводить два значения в функции readSenseDHT11() ? Чтоб в ней не только температура спрашивалась но и влажность .
засечка времени - TempMillis = millis( ) это я так понимаю время прохождения цикла ? если да , то тогда после
отслеживание - if ( millis( ) - TempMillis > TzadannoeSlegeniya ) - то уходим в обработку этого события и здесь присваиваем TempMillis новое значение ?
А то после определенного времени условие будет соблюдаться постоянно .
Но когда millis( ) сбросится надо будет опять присвоить TempMillis новое значение ?
БабушкаМиллис в лупе всё время вяжет носки...
в 11:00 она ещё поставила варить варенье с периодом помешивания его 10 мин...
БабушкаМ запоминает текущее время ( 11:00 ) и период контроля ( 10 мин ), вяжет дальше....
каждую минуту ( это за сколько крутится луп ) она смотрит на часы... видит 11:07 ( прошло 7 мин ) - вяжет дальше...
и вот когда она вычислит, что ( 11:11 - 11:00 > 10 ) она запомнит сначала новое текущее время ( 11:11 ), потом пойдет помешает варенье.....
через ещё 7 мин она будет вычислять разницу ( 11:18 - 11:11 ) - и будет продолжать вязать.... пока разница не станет > 10
.....DI HALT горазд на такие аллегории :)
Возвращает количество миллисекунд с момента начала выполнения текущей программы на плате Arduino. Это количество сбрасывается на ноль, в следствие переполнения значения, приблизительно через 50 дней.
....не надо думать про переполнение миллис(), опрос раз в секунду, а переполнение раз в 50 дней - вы ничего и не заметите :)
присваиваем TempMillis новое значение ?
ДА
замечательный пример :)
спасибо , вроде картинка начинает формироваться.
http://arduino.ru/Reference/Millis
я вот о чем :
TempMillis у нас стал каким то большим числом , а millis( ) сбросился . Ведь теперь нам надо будет очень долго ждать пока выполнится условие . Разве нет ?
вот так в общих чертах
разве при сбросе millis() не будет долгого ожидания длинной примерно в 50 дней ?
Как мне видиться для исправления этого надо в else поставить проверку на отрицательное значение . Так ? или я не туда копаю ? :)
как то так например
тут вопрос какие переменные использовать и как проверка на отрицательность выглядит ? Тупо <0 ?
так ! если отрицательное - сразу фиксируем новое время.... "сбой" будет каждые 50 дней на 5....10 сек
то есть в последнем сообщении я правильно написал с else ? А переменные я правильно обозначил unsigned long и float соответственно ?
строка 14 - var1 должна быть как в строке 01 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
не надо проверять на отрицательное значение.... унсигнет не может быть отрицательным....
за 5 сек до переполнения запомнили миллис, через 5 сек после переполнения разница будет 5000 - 6500000 = всяко больше 10000, ибо тип беззнаковый, значит сразу выполнится переход к опросу датчиков....
сколько не грозили миру проблемой 2000-го года - все системы её пережили же :) ( такое же переполнение было - только масштаб побольше )
#37
строки 10 и 11 будут выполняться каждые 10 сек, процессор в это время сможет решать другие лупные задачи....
строки13....17 - лишние
так значит else нен нужен и var1 соответственно :)
ух , спасибо за такое подробное объяснения . Теперь буду следующие функции ковырять .
то есть в последнем сообщении я правильно написал с else ? А переменные я правильно обозначил unsigned long и float соответственно ?
целое - целое = целое , зачем здесь флоат ?
да, правильно....
только помните, что на каждое событие нужна своя переменная TempMillis
TempMillisТемпература = 10000
TempMillisВлажность = 20000
TempMillisКлава = 500
и т. и д., и т.п.
и все-таки уточню :)
унсигнет - унсигнет = -650000 , но оно берется по модулю и потом сравнивается с 10000 . Так ? :)
нет не так
беззнаковое трёхбитовое число - 0....7
3 - 6 = ? как думаете ? не говорите, что -3
знаковое трёхбитовое число - -3....+3, старший бит отводится под знак, вот и диапазон представляемых чисел ( по модулю ) меньше в два раза....
беззнаковые
011
-
110
=
101
3 - 6 = 5 ( или 4 ? не помню, надо повторить представление чисел в дополнительном коде :( ) !!!!!!!!!!!!! ибо компилятор следит за типом данных :)
Смотрю назвал сколько это стоит напрягатся начал.
Я то я ему полдня сидел слил все в одну простынку без косяков, а в ответ два дня пофиг: ни схемы кнопок ни схемы влажности.
Я еще недорого назвал. Месяц конструктора ~700-1500$ стоит => 1 неделя 350$
Что вы тут какую-то бадягу у теплици про НЕdelay развели?
1.Тупо влажнсти и температуры постоянно непрерывно выгоняй в жки ОН ВЕДЬ ЗАПОМИНАЮЩИЙ(по крайней мере всегда последние 20лет было)
2.if-ами или сравнивай с заранее установленными максимумами и минимуами
3.если событие наступило 1.врубай фотек-ом лампу ДНАТ 2.грей тяни мотором форточку 3.врубай кран полива
4.если событие наступило 1.вырубай лампу ДНАТ 2. тяни моторм форточку3.вырубай кран полива
5.и пара кнопок также вверз вниз
(свет(фотосинтез) температура и влажность должны буть пропорциоанальными всегда )
все вся логика закончиласл Техническое Задание готово ВЫ мне должны 100$
чего тут думать тут тут трясти надо
тут подпрограммы 5 градусник влажность свет мотор мотор все заночились
вы меня окончательно запутать решили ? :) раз без знаковое значит 3 , верно ? без знака и по модулю это одно и тоже получается .