Автоматическая система полива растений на основе Arduino

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

Внешний вид автоматической системы полива растений на основе Arduino

В основе данной системы будет лежать использование датчика влажности почвы (Soil Moisture Sensor), который будет проверять уровень влажности почвы и если он ниже заданного уровня, то плата Arduino будет включать водяной насос чтобы обеспечить подачу воды растениям. Водяной насос будет автоматически выключаться когда уровень влажности почвы будет соответствовать норме. Всегда при включении и выключении водяного насоса вам на сотовый телефон будет передаваться сообщение с помощью GSM модуля. Представленная система окажет большую помощь на фермах, в садах и домах. Система полностью автоматическая и не требует никакого вмешательства человека.

Необходимые компоненты

Плата Arduino Uno
GSM модуль
Транзистор BC547 (2 шт.)
Соединительные провода
ЖК дисплей 16х2 (опционально)
Источник питания 12v 1A
Реле на 12v
Водяной насос
Датчик влажности почвы (Soil Moisture Sensor)
Резисторы (1 кОм, 10 кОм)
Переменные резисторы (10 кОм, 100 кОм)
Концевой соединитель
Регулятор напряжения (микросхема LM317)

GSM модуль

В этом проекте мы использовали TTL SIM800 GSM модуль. SIM800 представляет собой четырех диапазонный GSM/GPRS модуль, способен работать в диапазонах частот 850/900/1800/1900 МГц и обеспечивать передачу голоса, SMS, данных с низким энергопотреблением. Внешний вид SIM800 показан на рисунке ниже – он достаточно компактный и не займет много места в ваших устройствах. Модуль SIM800 включает:

  • четырех диапазонный GSM/GPRS модуль компактного размера;
  • возможность задействования GPRS;
  • выход TTL.
Внешний вид TTL SIM800 GSM модуля Тыльная сторона TTL SIM800 GSM модуля

Более подробно изучить работу с GSM модулем можно в статье про автоматическую доску объявлений на Arduino. Также можно посмотреть все статьи на нашем сайте, использующие технологию GSM.

Работа схемы

В этом проекте мы использовали самодельный датчик влажности почвы на основе зонда, который будет использоваться для измерения уровня влажности почвы. Для изготовления зонда мы использовали доску, покрытую медью как показано на рисунке ниже (можно использовать ненужный кусок печатной платы). Один контакт зонда будет подсоединен к Vcc (напряжению постоянного тока), а другой – к базе транзистора BC547. К базе транзистора также подключен потенциометр для регулирования чувствительности датчика влажности почвы.

Самодельный датчик влажности почвы

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

GSM модуль используется для передачи SMS пользователю. Мы использовали TTL SIM800 GSM модуль, который имеет выход непосредственно в TTL модуль, но можно использовать и любой другой GSM модуль. Регулятор напряжения LM317 используется для подачи питания на SIM800 GSM модуль. LM317 очень чувствителен к максимально допустимому напряжению и перед его использованием рекомендуется прочитать даташит на него. Его рабочее напряжение составляет от 3.8v до 4.2v (более предпочтительно использовать 3.8v). На следующем рисунке показана схема подачи питания на TTL sim800 GSM модуль:

Схема подачи питания на TTL sim800 GSM модуль

Внешний вид собранной платы подачи питания на TTL sim800 GSM модуль

Если вам нужно использовать SIM900 TTL модуль, то вы должны использовать 5V, а если вы хотите использовать SIM900 модуль, то вы должны подключить 12v в DC Jack slot платы.

Реле 12V используется для управления небольшим водяным насосом, работающим от 220VAC. Реле управляется с помощью транзистора BC547, который в дальнейшем подсоединен к цифровому контакту 11 платы Arduino.

Внешний вид модуля с реле

ЖК дисплей (опционально) используется для отображения статуса устройства и сообщений. Управляющие контакты ЖК дисплея RS и EN подключены к контактам 14 и 15 платы Arduino, а контакты данных D4-D7 непосредственно подключены к контактам 16, 17, 18 и 19 платы Arduino. ЖК дисплей используется в 4-битном режиме и управляется встроенной библиотекой Arduino.

Полная схема устройства представлена на следующем рисунке.

Схема автоматической системы полива растений на основе ArduinoОбъяснение работы проекта

Спроектированная нами система автоматического полива растений не требует никакого участия человека в своей работе, весь процесс управляется платой Arduino, а GSM модуль используется для передачи сообщений на ваш сотовый телефон. Внешний вид собранной системы показан на следующем рисунке.

Внешний вид собранного устройства для полива растений

Если влага присутствует в почве, то тогда сопротивление между двумя контактами зонда для измерения влажности мало, транзистор Q2 остается в открытом состоянии и на контакт D7 платы Arduino подается напряжение низкого уровня. И когда на контакте D7 напряжение низкого уровня плата Arduino передает пользователю SMS “Soil Moisture is Normal. Motor turned OFF” (уровень влаги в норме, насос выключен), водяной насос при этом остается в выключенном состоянии.

А когда влаги в почве становится очень мало, то транзистор Q2 запирается и на контакт D7 платы Arduino подается напряжение высокого уровня. Как только плата Arduino обнаруживает это, она включает водяной насос и передает пользователю сообщение “Low Soil Moisture detected. Motor turned ON” (низкий уровень влаги, насос включен). Насос автоматически выключится как только уровень влаги в почве достигнет требуемой величины. Более подробно все эти процессы показаны в видео в конце статьи.

На следующем рисунке приведена структурная схема работы нашего проекта.

Структурная схема работы проекта

Исходный код программы

В программе нам сначала необходимо подключить библиотеку последовательной связи (SoftwareSerial library) чтобы задействовать последовательную связь на контактах 2 и 3 платы Arduino, а также подключить библиотеку для работы с ЖК дисплеем.

#include<SoftwareSerial.h>
SoftwareSerial Serial1(2,3);
#include<LiquidCrystal.h>
LiquidCrystal lcd(14,15,16,17,18,19);
int led=13;
int flag=0;
String str="";
#define motor 11
#define sensor 7

Затем в функции void setup () последовательная связь инициализируется на скорость 9600 бод/с и задаются режимы работы (на ввод или вывод данных) для используемых контактов. Функция gsmInit вызывается для инициализации GSM модуля.

Serial1.begin(9600);
Serial.begin(9600);
pinMode(led, OUTPUT);
pinMode(motor, OUTPUT);
pinMode(sensor, INPUT_PULLUP);
lcd.print("Water Irrigaton");
lcd.setCursor(4,1);
delay(2000);
lcd.clear();
lcd.print("Circuit Digest");
lcd.setCursor(0,1);
lcd.print("Welcomes You");
delay(2000);
gsmInit();

Затем в функции void loop () считывается значение с выхода датчика измерения влажности и в зависимости от этого значения включается/выключается мотор водяного насоса и пользователю передаются SMS с помощью функции sendSMS.

void loop()
{
lcd.setCursor(0,0);
lcd.print("Automatic Mode ");
if(digitalRead(sensor)==1 && flag==0)
{
delay(1000);
if(digitalRead(sensor)==1)
{
digitalWrite(led, HIGH);
sendSMS("Low Soil Moisture detected. Motor turned ON");
lcd.begin(16,2);
lcd.setCursor(0,1);
.... ......
..... ......

Функция gsmInit () играет важную роль в нашей программе и, к сожалению, ряд пользователей считают ее достаточно трудной для программирования. Эта функция используется для инициализации GSM модуля. Сначала проверяется соединен ли GSM модуль с сетью при помощи передачи ему соответствующей ‘AT’ команды. Если модуль ответил OK, это значит что он готов к работе. Система будет проверять модуль до тех пор пока не получит от него ответ ‘OK’. Затем выключается режим ECHO (чтобы модуль не повторял в ответе написанную ему команду) с помощью команды ATE0. Затем проверяется доступность сети при помощи команды ‘AT+CPIN?’. Если вставленная карта является SIM картой и PIN присутствует, модуль формирует ответ READY. Эта проверка также осуществляется непрерывно до тех пор пока сеть не будет найдена. Более подробно эти процессы показаны в видео в конце статьи.

void gsmInit()
{
lcd.clear();
lcd.print("Finding Module..");
boolean at_flag=1;
while(at_flag)
{
Serial1.println("AT");
while(Serial1.available()>0)
{
if(Serial1.find("OK"))
at_flag=0;
}
delay(1000);
}
.... .....
..... .....

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

Далее представлен полный текст программы.

#include<SoftwareSerial.h>
SoftwareSerial Serial1(2,3);
#include<LiquidCrystal.h>
LiquidCrystal lcd(14,15,16,17,18,19);
int led=13;
int flag=0;
String str="";
#define motor 11
#define sensor 7
void setup()
{
lcd.begin(16,2);
Serial1.begin(9600);
Serial.begin(9600);
pinMode(led, OUTPUT);
pinMode(motor, OUTPUT);
pinMode(sensor, INPUT_PULLUP);
lcd.print("Water Irrigaton");
lcd.setCursor(4,1);
delay(2000);
lcd.clear();
lcd.print("Circuit Digest");
lcd.setCursor(0,1);
lcd.print("Welcomes You");
delay(2000);
gsmInit();
lcd.clear();
lcd.print("System Ready");
}
void loop()
{
lcd.setCursor(0,0);
lcd.print("Automatic Mode ");
if(digitalRead(sensor)==1 && flag==0)
{
delay(1000);
if(digitalRead(sensor)==1)
{
digitalWrite(led, HIGH);
sendSMS("Low Soil Moisture detected. Motor turned ON");
lcd.begin(16,2);
lcd.setCursor(0,1);
lcd.print("Motor ON ");
digitalWrite(motor, HIGH);
delay(2000);
flag=1;
}
}
else if(digitalRead(sensor)==0 && flag==1)
{
delay(1000);
if(digitalRead(sensor)==0)
{
digitalWrite(led, LOW);
sendSMS("Soil Moisture is Normal. Motor turned OFF");
digitalWrite(motor, LOW);
lcd.begin(16,2);
lcd.print("Motor OFF");
lcd.setCursor(0,1);
lcd.print("Motor OFF");
delay(2000);
flag=0;
}
}
}
void sendSMS(String msg)
{
lcd.clear();
lcd.print("Sending SMS");
Serial1.println("AT+CMGF=1");
delay(500);
Serial1.print("AT+CMGS=");
Serial1.print('"');
Serial1.print("+919610126059"); // number
Serial1.print('"');
Serial1.println();
delay(500);
Serial1.println(msg);
delay(500);
Serial1.write(26);
delay(1000);
lcd.clear();
lcd.print("SMS Sent");
delay(1000);
lcd.begin(16,2);
}
void gsmInit()
{
lcd.clear();
lcd.print("Finding Module..");
boolean at_flag=1;
while(at_flag)
{
Serial1.println("AT");
while(Serial1.available()>0)
{
if(Serial1.find("OK"))
at_flag=0;
}
delay(1000);
}
Serial1.println("ATE0");
lcd.clear();
lcd.print("Finding Network..");
boolean net_flag=1;
while(net_flag)
{
Serial1.println("AT+CPIN?");
while(Serial1.available()>0)
{
if(Serial1.find("READY"))
net_flag=0;
break;
}
delay(1000);
}
Serial1.println("AT+CNMI=2,2,0,0,0");
delay(1000);
Serial1.println("AT+CMGF=1");
delay(1000);
Serial1.println("AT+CSMP=17,167,0,0");
lcd.clear();
Serial1.flush();
}

Видео, демонстрирующее работу схемы

(1 голосов, оценка: 5,00 из 5)
Загрузка...
266 просмотров

Комментарии

Автоматическая система полива растений на основе Arduino — 2 комментария

  1. «Система будет проверять модуль до тех пор пока не получит от него ответ ‘OK’». Тоесть в случае неполучения ответа ‘OK’ получаем глубокий завис всей системы?

    • Да, к сожалению такое возможно. Но если вы не уверены в надежности вашего GSM модуля, то можете добавить глобальную переменную (флаг), в которой будет содержаться результат инициализации модуля. Если он отрицательный, то просто игнорируйте модуль в программе — то есть чтобы система работала, но на GSM модуль ничего не отправляла. Ну и функцию инициализации GSM модуля в этом случае необходимо будет немного изменить чтобы она не зависала при недоступности модуля и устанавливала эту глобальную переменную (флаг).
      К сожалению невозможно написать программу так, чтобы она устраивала абсолютно всех. Но ведь для этого и объясняется она в статье чтобы каждый при желании смог видоизменить ее под себя

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *