Автоматическая система полива растений: схема, код, отчет проекта
Автоматическая система полива растений — полный исходный код, схема и отчет проекта — скачать PDF
Введение
Ежедневные операции, связанные с поливом растений, являются важнейшей агротехнической практикой и наиболее трудоемкой задачей. Какая бы погода ни была — слишком жаркая или холодная, слишком сухая или влажная — критически важно контролировать количество воды, поступающей к растениям. Поэтому эффективно использовать идею автоматической системы полива, которая поливает растения именно тогда, когда им это нужно. Важный аспект проекта: «когда и сколько поливать». Для сокращения ручного труда человека при поливе растений принята идея системы автоматического полива. Метод заключается в непрерывном мониторинге уровня влажности почвы и принятии решения о необходимости полива и количестве воды, необходимом для почвы растения. Проект можно разделить на подсистемы: блок питания, реле, электромагнитный клапан, Arduino GSM-шилд, датчик влажности почвы и ЖК-дисплей.
По сути, система спроектирована и запрограммирована так, что датчик влажности почвы измеряет уровень влажности растений в определенный момент времени. Если уровень влажности ниже заданного порогового значения (определенного согласно потребностям конкретного растения), то подается нужное количество воды до достижения заданного порогового значения.
Система сообщает о своем текущем состоянии и отправляет напоминающие сообщения о поливе растений и необходимости долить воду в бак. Все уведомления реализованы с помощью Arduino GSM-шилда.
Цель проекта:
Поскольку в эпоху передовых технологий и электроники образ жизни человека должен быть умным, проще, легче и удобнее, возникает потребность во многих автоматизированных системах в повседневной рутине для сокращения ежедневных задач. Идея одной такой системы — автоматический полив растений — очень полезна. Многие люди сталкиваются с проблемами полива растений в саду, особенно когда они далеко от дома. Эта модель использует сенсорные технологии с микроконтроллером для создания умного коммутационного устройства, способного помочь миллионам людей.
В своей базовой форме система запрограммирована так: датчик влажности почвы измеряет уровень влажности у растения в определенный момент, если уровень ниже заданного порога (определенного для конкретного растения), то подается нужное количество воды до достижения порогового значения. Система включает датчики влажности и температуры, отслеживающие текущую атмосферу и влияющие на полив. Электромагнитный клапан управляет водопотоком: когда Arduino считывает значение с датчика влажности, он открывает клапан согласно заданному условию. Кроме того, система сообщает о состоянии и отправляет напоминания о поливе, а также получает SMS от получателя. Все уведомления осуществляются через Arduino GSM-шилд.
Предыстория системы
Из школьных учебников по науке известно, что растения крайне важны для человечества во многих аспектах: они поддерживают окружающую среду чистой, выделяя свежий кислород. Автоматические системы полива становятся всё более распространенными с ростом подключения повседневных объектов к передовым технологиям — эти системы внедряются всё быстрее: в домах и на промышленном уровне. Главное их назначение — эффективность и простота использования.
Система полива дает возможность любителям растений заботиться о домашних растениях, пока они отсутствуют — с помощью эффективных и надежных компонентов, таких как различные типы сенсорных технологий.
Существует несколько типов систем полива комнатных растений в зависимости от уровня автоматизации:
- Сферы и шпильки для полива растений
- Капельные системы полива для помещений
- Сенсорные технологии
- Датчики температуры и влажности
- Датчики температуры
- Датчики влажности
- Датчики влажности почвы
- Биметаллические термостаты
- Термисторы
- Сопротивление термометры (RTD)
- Термопары
- Сенсорные IC, LM35
- Цифровые датчики температуры (ADT7301)
- DHT11 и DHT22
- GSM-модуль
- Архитектура GSM
- Реле
- Транзистор
- ЖК-дисплей Hitachi 16×2
Спецификации продуктов и компонентов
| ID требования | SRS-GSM-001 |
|---|---|
| Название | GSM-модуль |
| Описание | Система включает GSM-модуль, отправляющий тревожные SMS получателю и принимающий SMS от пользователя. |
| Версия | 1.0 |
| ID требования | SRS-Microcontroller-001 |
|---|---|
| Название | ATmega328p |
| Описание | Система включает микроконтроллер, обычно идущий с Arduino Uno. Этот микроконтроллер считывает показания с датчиков и управляет всей системой. |
| Версия | 1.0 |
| ID требования | SRS-Temperature-Humidity-001 |
|---|---|
| Название | DHT11 |
| Описание | Система включает датчик температуры и влажности, отслеживающий текущие значения температуры и влажности окружения и передающий их микроконтроллеру. |
| Версия | 1.0 |
| ID требования | SRS-Moisture-001 |
|---|---|
| Название | Grove Soil Moisture Sensor |
| Описание | Система включает датчик влажности почвы, считывающий влажность почвы и передающий показания микроконтроллеру. |
| Версия | 1.0 |
| ID требования | SRS-LCD-001 |
|---|---|
| Название | Hitachi 16×2 LCD |
| Описание | Система включает ЖК-интерфейс для пользователя, отображающий показания различных датчиков системы. |
| Версия | 1.0 |
Автоматизированная система полива на базе Arduino:
Блок-схема автоматического полива
Согласно этой системе, в проекте есть два функциональных компонента: датчик влажности и мотор/насос. В базовой форме датчик влажности измеряет уровень влажности почвы. Затем мотор/насос подает воду растениям.
Принципиальная схема автоматической системы полива и орошения
На схеме выше описывается общее поведение системы. Проект использует Arduino Uno для управления мотором. Состоит из H-моста, управляющего направлением сервомотора (по или против часовой стрелки). Датчик влажности измеряет уровень почвы и посылает сигнал Arduino, затем Arduino открывает сервомотор, если нужен полив. Мотор/насос подает воду растениям до достижения нужного уровня влажности. Это делается с помощью Arduino IDE.
На прототипе датчик влажности измеряет уровень и посылает сигнал Arduino, затем Arduino включает насос с помощью H-моста и поливает конкретное растение.
Проектирование проекта
Этот раздел описывает выполненную работу по программному и аппаратному проектированию. Также дает понимание того, что включает система и почему выбраны те или иные компоненты для создания полностью готовой автоматизированной системы полива. Рассмотрим диаграмму, показывающую базовую концептуальную модель системы с выбранными компонентами.
Функциональность блок-схемы автоматизированной системы полива, показанной выше, проиллюстрирована ниже:
- Система включает GSM-модуль, отправляющий SMS получателю и принимающий SMS от получателя.
- Используются датчики влажности почвы, температуры и влажности воздуха.
- Также включает электромагнитные клапаны вместе с цепями управления клапанами, регулирующими водопоток.
- Датчик влажности определяет уровень влажности конкретного растения. Этот уровень считывается микроконтроллером в цикле: если значение выше заданного порога, GSM-модуль готов отправить SMS получателю.
- Датчик температуры и влажности определяет, не слишком ли жарко для растения или слишком высока влажность. Это считывается чипом ATmega328p на Arduino Uno. Эти показания используются для определения, должны ли все клапаны в системе быть открыты или закрыты.
Более подробные сведения о компонентах можно найти в PDF-файле (ниже).
Аппаратное проектирование
Схема датчиков
На рисунке ниже показана схема цепи датчиков. Все датчики подключены к аналоговым пинам Arduino A0–A3. Пин A0 зарезервирован для датчика температуры и влажности, пины A1–A3 — для датчиков влажности. Все датчики имеют общее питание 5В и землю, как показано на схеме.
Схема ЖК-дисплея:
На рисунке ниже показана схема ЖК-дисплея. Цифровые пины 8–13 зарезервированы для ЖК-дисплея. Пин 1 и Пин 3 — питание и земля, пин 2 — пин контраста, подключенный к потенциометру. Важно при подключении ЖК-дисплея: цифровые пины Arduino и данные пины ЖК-дисплея должны быть подключены в правильном порядке, иначе на экране будет мусор.
Схема электромагнитного клапана
На рисунке ниже показана схема цепи клапана. Цифровые пины 4–7 зарезервированы для клапанов. Схема состоит из реле, транзисторов, резисторов и светодиодов вместо клапанов (в CadStar нет символа клапана). В схеме реле используют 5В. 5В также идет на NO-канал реле, так как в схеме светодиоды заменяют клапаны, работающие на 5В через резистор 220 Ом.
Когда напряжение подается на базу транзистора, транзистор открывается, позволяя катушке реле намагничиваться и переключаться на нормально замкнутый канал, из-за чего светодиод, подключенный к этому реле, загорается. Когда напряжение на базе падает, транзистор закрывается, катушка реле размагничивается, реле переключается обратно на NO-канал, и светодиод гаснет.
После завершения всех схем следующий шаг — сборка на макетной плате. Важно заранее спроектировать цепь на листе планирования макетной платы, так как есть определенные принципы проектирования на макетной плате:
- Сначала разметьте линии питания Vs и GND в правом верхнем углу листа планирования.
- Помните о разрыве дорожки между выводами микросхемы. Отметьте разрывы на диаграмме крестиком.
- Постарайтесь разместить резисторы и осевые конденсаторы плоско на плате. Резисторы обычно требуют зазора 4 отверстия, конденсатор — 8 отверстий.
- Если возможно, пронумеруйте выводы микросхем. Нижняя сторона макетной платы состоит из медных дорожек, по которым течет напряжение горизонтально. Различные варианты дизайна схем на макетной плате показаны ниже.
Программное проектирование
После завершения аппаратной части пришло время протестировать железо с программным обеспечением. В этом разделе реализация программного дизайна описывается детально для каждой технологии автоматизации, используемой в системе. Это включает код Arduino, написанный и загруженный в Arduino.
Первым делом заставили работать цепь клапана и понять, как клапан будет действовать с точки зрения микроконтроллера. Для этого составили небольшую блок-схему, видна в разделе программного потока на рисунке выше.
Arduino IDE использовалась для загрузки ПО в Arduino. Для базовой цепи клапана написана простая программа, мигающая светодиодом каждую секунду. Цифровые пины 4, 5, 6 и 7 были определены для тестирования программы и схемы. При запуске программа делает все базовые инициализации, определяет все выходные пины в void setup() и переходит в void loop(), где постоянно работает и мигает светодиодами каждую секунду.
После этого написана и загружена небольшая программа, считывающая показания с разных датчиков и выводящая их на ЖК-дисплей. Для этого также составили блок-схему (видна в разделе программного потока). Когда программа входит в void loop(), она считывает показания датчиков, выполняет базовые расчеты и выводит на ЖК-дисплей.
Следующий шаг — загрузка ПО для GSM-модуля в Arduino, через который GSM общается с микроконтроллером. Сначала проводился тест модема: базовая инициализация и библиотеки для GSM, получение IMEI и проверка работоспособности модема при обмене с Arduino. Следующий шаг — тест сетевого подключения: инициализация GSM и отображение всех сетей, которые поддерживает GSM-модуль.
После проверки GSM-модуля пришло время использовать его для связи с получателем: отправка SMS и прием SMS. Для этого написаны и загружены две простые программы: одна инициализирует GSM и отправляет SMS получателю, другая — принимает SMS от конечного пользователя.
Наконец, когда всё программное проектирование завершено, пришло время объединить все части и построить итоговое рабочее ПО для системы. Применялись различные алгоритмические подходы (видно в разделе программного потока), чтобы получить работающее ПО, выполняющее свои функции. На рисунке выше показана работа итогового ПО: считывание показаний, отправка SMS, прием SMS и продолжение предыдущей работы.
Примечание: Весь программный код приведен в приложении ниже.
Примечание: Весь код можно просмотреть в приложении. Вывод тестов модема и сетевого подключения не включен в отчет, так как реальный отчет был сделан после сдачи оборудования.
Сборка проекта и тестирование ПО
После успешного завершения аппаратного и программного проектирования пришло время сборки и тестирования проекта. В этом разделе отчета детально описывается, как различные аппаратные решения реализованы и протестированы. Также обсуждаются скрытые проблемы в коде, важные для устранения и успешной сборки. Пошаговый процесс виден в полном отчете в PDF-файле ниже (сборка и процедура тестирования).
Тестирование программного обеспечения
Фаза тестирования ПО — важный аспект разработки проекта. Тестирование ПО — процедура выполнения программы или приложения с целью поиска ошибок. Также можно выразить это как процесс валидации и верификации: программа соответствует техническим требованиям, работает как ожидается и может быть выполнена с похожими характеристиками. Для тестирования использовались разные подходы. Написан документ спецификации требований к ПО (SRS), полностью описывающий ожидаемое поведение программной системы.
| ID требования | SRS-Sensor-010 |
|---|---|
| Название | Датчик |
| Описание | Датчики в системе считывают показания и отправляют их микроконтроллеру. |
| Версия | V 1.0 |
| ID требования | SRS-Data-020 |
|---|---|
| Название | Отображение данных |
| Описание | Когда пользователь пытается получить показания от системы. Дисплей должен показывать данные пользователю: например, значения температуры и влажности, за которыми следуют показания влажности почвы. |
| Версия | V1.0 |
| ID требования | SRS-Microcontroller-030 |
|---|---|
| Название | Микроконтроллер |
| Описание | Микроконтроллер в системе выступает мозгом, управляющим всем в системе. |
| Версия | V1.0 |
| ID требования | SRS-Latch-040 |
|---|---|
| Название | Защелка (Latch) |
| Описание | Защелка в системе расширяет цифровые пины микроконтроллера. |
| Версия | V1.0 |
| ID требования | SRS-GSM-050 |
|---|---|
| Название | GSM |
| Описание | Система реагирует отправкой SMS-тревоги получателю, когда микроконтроллер указывает на это. |
| Версия | V1.0 |
После написания SRS-документа проектирование ПО перешло в фазу статического тестирования, включающую рецензирование документа. Здесь происходит верификация требований. Определены четыре метода верификации:
- Инспекция (I): контроль или визуальная верификация
- Анализ (A): верификация на основе аналитических доказательств
- Демонстрация (D): верификация операционных характеристик без количественных измерений
- Тестирование (T): верификация количественных характеристик с количественными измерениями. Для каждого требования SRS определен метод верификации с аббревиатурой I, A, D, T.
Верификация:
| ID требования | Название требования | Метод |
|---|---|---|
| REQ-010 | Проверить, что датчики системы получают показания | I |
| REQ-020 | Проверить, что данные отображаются на экране | D |
| REQ-030 | Проверить, что микроконтроллер системы управляет/работает правильно, выдавая 100% результат для каждого запроса | D |
| REQ-040 | Проверить, что цепь защелки делает то, что должна: принимает 3 входа и выдает 8 пинов | A |
| REQ-050 | Проверить, что SMS отправлено и получено GSM | D |
Результаты
Все тесты пройдены успешно. Поскольку нет конкретных результатов, требующих документирования. Система работает с датчиками влажности и DHT11 (температура и влажность), считывающими показания согласно текущей комнатной температуре и влажности. Показания датчика влажности в цепи также зависят от текущего уровня влажности для растения. В целом, функциональность цепи была хорошей для мотивации.
Итоговый полный программный код для автоматического полива растений и систем орошения
Примечание: Больше кода, связанного с проектом, можно найти в PDF-файле: пример кода для тестирования электромагнитного клапана, код тестирования системных датчиков, код теста GSM-модема, код сетевого подключения GSM, код отправки SMS-тревоги GSM, код приема SMS GSM.
Итоговый код проекта Auto Watering Plants
#include <dht.h> #define dht_dpin A0 dht DHT; //———————– #include <LiquidCrystal.h> LiquidCrystal lcd (8, 9, 10, 11, 12, 13); //———————————- int plantPotMoisture[3] = {A1, A2, A3}; //——————— #include <GSM.h> #define PINNUMBER “” GSM gsmAccess; // include a ‘true’ parameter for debug enabled GSM_SMS sms; char remoteNumber[] = “0899506304”; String moistureMessage = “Moisture is Low on sensor: “; String SMS_Alert = “Sending SMS!”; String humidityMsg = “Humidity is High. Open All Solenoids”; String tempMsg = “Temperature is too HIGH!..Open ALl Solenoids “; String messageBuffer = “”; char senderNumber[20]; String stringOne = “Opens1”; String stringTwo = “Opens2”; String stringThree = “Opens3”; String stringFour = “OpenAll”; //————— #define solenoidData 5 #define solenoidClockster 4 #define solenoidLatch 6 //————— const int master = 0; const int slave1 = 1; const int slave2 = 2; const int slave3 = 3; boolean takeReadings = true; int serialSolenoidOutput = 0; void setup() { pinMode(solenoidData, OUTPUT); pinMode(solenoidClockster, OUTPUT); pinMode(solenoidLatch, OUTPUT); digitalWrite(solenoidLatch, HIGH); digitalWrite(solenoidLatch, LOW); shiftOut(solenoidData, solenoidClockster, MSBFIRST, 0); digitalWrite(solenoidLatch, HIGH); //————————- Serial.begin(9600); lcd.begin (16, 2); lcd.clear(); lcd.setCursor(0, 0); lcd.print(“Wait Until”); lcd.setCursor(0, 1); lcd.print(“GSM Initialized!”); boolean notConnected = true; while (notConnected) { if (gsmAccess.begin(PINNUMBER) == GSM_READY) notConnected = false; else { Serial.println(“Not connected”); delay(1000); } } } void loop() { if (takeReadings) { moistureSensor(); TempAndHumidity (); if (DHT.humidity > 50 || DHT.temperature > 25 && takeReadings ) { takeReadings = false; if (DHT.humidity > 50) { sendSMS(humidityMsg); } else if (DHT.temperature > 25) { sendSMS(tempMsg); } while (!takeReadings) recieveSMS(); } if (plantPotMoisture[0] > 30 || plantPotMoisture[1] > 30 || plantPotMoisture[2] > 30 && takeReadings) { takeReadings = false; if (plantPotMoisture[0] > 30) { sendSMS(moistureMessage + “1”); } else if (plantPotMoisture[1] > 30) { sendSMS(moistureMessage + “2”); } else { sendSMS(moistureMessage + “3”); } while (!takeReadings) recieveSMS(); } } } void moistureSensor() { for (int i = 0 ; i < 3; i++) { lcd.clear(); plantPotMoisture[i] = analogRead(i); plantPotMoisture[i] = map(plantPotMoisture[i], 550, 0, 0, 100); Serial.print(“Mositure” + i ); lcd.print(“Mositure” + i); Serial.print(plantPotMoisture[i]); lcd.print(plantPotMoisture[i]); Serial.println(“%”); lcd.print(“%”); delay(1000); } } void TempAndHumidity () { DHT.read11(dht_dpin); lcd.setCursor(0, 0); lcd.print(“Humidity=”); Serial.print(“Current humidity = “); Serial.print(DHT.humidity); lcd.print(DHT.humidity); lcd.print(“%”); Serial.print(“%”); Serial.print(“temperature = “); Serial.print(DHT.temperature); Serial.println(“C”); lcd.setCursor(0, 1); lcd.print(“temp=”); lcd.print(DHT.temperature); lcd.print(“C “); delay(1000); lcd.clear(); } void sendSMS(String messageToSend) { Serial.print(“Sending a message to mobile number: “); Serial.println(remoteNumber); Serial.println(“SENDING”); lcd.print(SMS_Alert); Serial.println(); Serial.println(“Message:”); Serial.println(messageToSend); sms.beginSMS(remoteNumber); sms.print(messageToSend); sms.endSMS(); Serial.println(“\nCOMPLETE!\n”); lcd.clear(); lcd.print(“Completed!!!”); } void recieveSMS() { char c; if (sms.available()) { lcd.clear(); lcd.print(“Message received from:”); delay(800); lcd.clear(); sms.remoteNumber(senderNumber, 20); lcd.print(senderNumber); while (c = sms.read()) { Serial.println(c); messageBuffer += c; } Serial.println(messageBuffer); if (messageBuffer == stringOne) { toggleSolenoid1(); takeReadings = true; } else if (messageBuffer == stringTwo) { toggleSolenoid2(); takeReadings = true; } else if (messageBuffer == stringThree) { toggleSolenoid3(); takeReadings = true; } else if (messageBuffer == stringFour) { toggleAll(); takeReadings = true; } else { takeReadings = true; } messageBuffer = “”; Serial.println(“\nEND OF MESSAGE”); // Delete message from modem memory sms.flush(); Serial.println(“MESSAGE DELETED”); } delay(1000); } void toggleSolenoid1() { solenoidWrite(master, HIGH); delay(1000); solenoidWrite(slave1, HIGH); delay(1000); solenoidWrite(slave1, LOW); delay(1000); solenoidWrite(master, LOW); delay(1000); } void toggleSolenoid2() { solenoidWrite(master, HIGH); delay(1000); solenoidWrite(slave2, HIGH); delay(1000); solenoidWrite(slave2, LOW); delay(1000); solenoidWrite(master, LOW); delay(1000); } void toggleSolenoid3() { solenoidWrite(master, HIGH); delay(1000); solenoidWrite(slave3, HIGH); delay(1000); solenoidWrite(slave3, LOW); delay(1000); solenoidWrite(master, LOW); delay(1000); } void toggleAll() { solenoidWrite(master, HIGH); delay(1000); solenoidWrite(slave1, HIGH); delay(1000); solenoidWrite(slave2, HIGH); delay(1000); solenoidWrite(slave3, HIGH); delay(1000); solenoidWrite(slave1, LOW); delay(1000); solenoidWrite(slave2, LOW); delay(1000); solenoidWrite(slave3, LOW); delay(1000); solenoidWrite(master, LOW); delay(1000); } void solenoidWrite(int pin, bool state) { if ( pin >= 0 && pin < 8) { if (state) serialSolenoidOutput |= (1 << pin); else serialSolenoidOutput &= ~(1 << pin); } digitalWrite(solenoidLatch, LOW); shiftOut(solenoidData, solenoidClockster, MSBFIRST, serialSolenoidOutput); digitalWrite(solenoidLatch, HIGH); }
Полный отчет проекта автоматической системы полива растений (PDF) — бесплатное скачивание
- Название: Automated Plant Watering System PDF
- Формат: PDF
- Размер: 4,18 МБ
- Страниц: 77
- Скачать: Здесь
Об авторе
— Department of Engineering School of Informatics & Engineering Institute of Technology, Blanchardstown Dublin 15
Промышленные технологии
- Частые режимы отказа в проверенных электрических системах
- Автоматическое открытие двери по PIR-датчику: схема, принцип работы и применение
- SERENA: Пользовательская система сигнализации на Arduino Mega 2560 с TFT Touchscreen
- Автоматическая система полива растений на Arduino — уходи в отпуск спокойно
- Умная система автополива растений на Arduino Nano
- Умная автоматическая система полива на Arduino
- Успешная миграция систем управления: экспертные стратегии для бесшовного перехода
- Топ нарушений электротехнического кодекса, которых нужно избегать для безопасности дома
- Автоматическая коробка передач: полное руководство — виды, узлы, принцип работы
- Автоматические системы смазки (ALS): принципы, виды, компоненты и преимущества