У меня дома есть несколько горшков с Dracaena Sanderiana (счастливый бамбук), и мне трудно их поливать.

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

Вот почему у меня возникла идея создать решение IoT, которое сообщит мне, когда почва слишком сухая или слишком влажная. Таким образом, я буду знать, когда поливать, и иметь приблизительный расчет того, сколько поливать.

Оборудование и план

Этот проект разбит на три разных этапа.

На первом этапе речь идет о возможности считывать информацию о влажности почвы и представлять ее. Он также должен оповещать меня о низкой влажности почвы.

Для начала мы будем использовать следующее оборудование:

  1. Ардуино Уно
  2. Датчик влажности почвы Sparkfun (SEN-13322)

Вместо того, чтобы приобретать датчики другого типа по отдельности, я выбрал комплект датчиков Seeed Arduino. Он поставляется с набором общих датчиков, таких как кнопка, акселерометр, датчики влажности и температуры. Он также поставляется с защитным экраном Grove Base Shield, который позволяет мне легко подключать различные датчики через разъемы Grove.

Из этого комплекта я решил использовать зуммер в качестве устройства оповещения. Всякий раз, когда уровень влажности падает ниже определенного значения, он должен гудеть и сообщать мне об этом. Чтобы представить информацию о влажности, я использовал небольшой OLED-дисплей с разрешением 128 x 64.

Так как не хочу выжигать дисплей включенным 24х7, то еще и кнопку подключил. При нажатии на кнопку будет подан сигнал, который включит дисплей на несколько секунд, прежде чем он выключится.

Что касается питания, я получил блок питания с выходом 5 В и бочкообразным разъемом вместо питания от батареи.

На втором этапе я рассмотрю реализацию связи WiFi для Arduino, чтобы она могла отправлять данные о влажности почвы обратно в базу данных. Таким образом, я мог построить приборную панель, чтобы видеть историю влажности почвы.

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

Реализация (написание кода)

С документацией и кодом, предоставленным Sparkfun для влажности почвы, мне удалось заставить датчик влажности почвы начать сообщать свой первый набор значений.

Датчик питается цифровым напряжением 5 В на цифровом выводе 7 Arduino (D7). Вывод данных, также известный как сигнал, подключается к A0 аналоговых выводов Arduino.

Для считывания значения с датчика его необходимо сначала включить. Это делается путем первой настройки цифрового контакта 7 в качестве ВЫХОДА на Arduino, и это делается в функции настройки.

Затем значение влажности считывается из A0 с использованием analogRead в отдельной функции. После чего D7 выключается.

Чтобы получить лучшее представление о значениях, которые возвращает датчик, Serial.println() используется для отправки данных обратно в Serial Monitor среды разработки Arduino через UART. Когда датчик ни к чему не прикасался, возвращаемые значения находились в диапазоне от 0 до 10. Затем я коснулся штырей датчика влажными руками, и показания влажности колебались где-то между 800 и 895. Я даже поместил датчик в миску с водой и Я получаю тот же диапазон от 800 до 895. Сухая рука возвращает значения от 300 до 500.

С этими значениями я работал над реализацией зуммера, который подключен к D5 на базовом щите Grove. Основываясь на моем понимании растения, если влажность почвы составляет от 300 до 600, она, вероятно, слишком сухая.

В этом случае программа вызовет функцию buzzUrgent, и зуммер прозвучит дважды.

Первоначально он срабатывал три раза с задержкой в ​​1,5 секунды, используя цикл while. Тем не менее, сообщество Arduino посоветовало использовать задержки с осторожностью, поскольку это блокирующее действие, которое не позволит Arduino выполнять другие действия. Таким образом, я сделал изменение, чтобы использовать более короткую временную задержку, чтобы создать быстрый звуковой сигнал, который должен привлечь мое внимание.

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

С другой стороны, если почва слишком влажная, зуммер тоже сработает. Первоначально я выбрал значение 850, потому что это было самое высокое значение, которое я получил, когда датчик находился в миске с водой. Несколько дней спустя зуммер продолжал звучать, пока датчик находился в почве, и Arduino перезапустился после того, как я выключил его, переключая розетку. Когда я проверил значение, считываемое датчиком, оно колебалось между 850 и 890. При этом мне пришлось изменить значение с 850 на 900.

В процессе разработки Arduino, датчик и OLED-дисплей хранятся в пластиковом контейнере. После того, как основная застройка будет завершена, мы займемся строительством жилья.

Следующей вещью, которую я реализовал, была кнопка. Мне нужен был способ включать дисплей только тогда, когда мне это нужно, и выключать дисплей через определенное время. Это было сделано для защиты дисплея от выгорания.

Я подключаю кнопку к разъему D4 Grove на Grove Base Shield. Затем к функции цикла добавляется код для определения нажатия кнопки.

isButtonPressed — это простая функция, которая проверяет, находится ли кнопка в высоком состоянии. Если да, возвращает true, в противном случае — false.

С реализацией кнопки программа будет активировать OLED на 5 секунд каждый раз, когда я нажимаю на нее. Это должно дать мне достаточно времени, чтобы прочитать значение.

И последнее, что следует упомянуть, это то, что функция цикла ранее имела задержку блокировки внизу. Я удалил это в пользу неблокирующего таймера. Что он делает, так это получает показания влажности почвы каждые 30 секунд. Для первоначального прототипа это, вероятно, хорошее количество времени, так как я не хочу ждать целую вечность, прежде чем получу новое значение. Как только система станет стабильной, я бы увеличил задержку между показаниями датчика. Раз в тридцать минут не исключено, так как уровень влажности почвы меняется не так быстро (если только у нас не жара и не засуха).

Код к проекту можно найти здесь.

Проблемы и устранение неполадок

Во время реализации я столкнулся с проблемой, которая заставила меня задуматься, не связана ли проблема с оборудованием.

Когда я впервые подключил OLED-дисплей, я не смог заставить его работать. После почти одного дня исследований, а затем проб и ошибок выяснилось, что это из-за того, что я использую Arduino Uno. На основании README, предоставленного здесь: https://github.com/Seeed-Studio/Seeed_Learning_Space/tree/master/Grove%20-%20OLED%20Display%200.96''(SSD1315)V1.0, программное обеспечение I2C должно быть используется вместо этого.

Однако, поскольку я использую библиотеку Arduino_Sensorkit, нет прямого способа использовать программный I2C. Дополнительные исследования указали мне на эту историю коммитов в репозитории Arduino_SensorKit на Github.

При этом я нашел версию 1.0.5 с поддержкой программного обеспечения I2C и установил ее. Я повторно протестировал программу, и OLED-дисплей включился. Затем я мог бы отображать информацию о нем.

Жилье и размещение

Как и в предыдущем проекте IoT, я использовал Lego для жилья.

Забавный факт: кнопка была добавлена ​​в последнюю минуту после того, как корпус был готов, когда я понял, что мне нужен способ включить дисплей после того, как он ушел в спящий режим. Вот почему он болтается снаружи. Необходима переработка корпуса датчика справа.

Как вы можете видеть ниже, зуммер, OLED-дисплей и кнопка подключены к Grove Base Shield через разъемы Grove, а датчик влажности подключен с помощью соединительных кабелей.

Это готовый продукт. Arduino спрятан внутри коробки. Верхняя часть на самом деле представляет собой подвижный клапан, который может дать мне быстрый доступ к оборудованию. OLED-дисплей расположен сбоку с помощью двустороннего скотча, чтобы приклеить его к двум прозрачным кирпичам панели. Добавлена ​​крыша, чтобы «защитить» дисплей от брызг воды сверху. В верхней части дисплея находится кнопка, которая позволяет мне нажать и включить дисплей для быстрого просмотра значения влажности.

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

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

Вот OLED-дисплей в действии после нажатия кнопки. Он показывает текущий уровень влажности почвы. Судя по значению, мне пока не нужно поливать растение.

Эта статья изначально была размещена здесь.