سیستم آبیاری خودکار گیاهان مبتنی بر آردوینو به همراه با پیام هشدار

هر زمان که چند روزی از شهر خارج می‌شویم، همیشه نگران گیاهانمان هستیم که به موقع آبیاری شوند. در این آموزش ما یک سیستم آبیاری خودکار با استفاده از آردوینو طراحی می‌کنیم، که به صورت خودکار به گیاهان آب دهد و با فرستادن پیام به تلفن همراه، شما را مطلع نگه دارد.

در این سیستم آبیاری، سنسور سطح رطوبت در خاک را بررسی کرده و اگر سطح رطوبت پایین باشد آردوینو یک پمپ آب را برای آبیاری گیاه باز می‌کند. پمپ‌های آب، زمانی که رطوبت خاک به اندازه کافی رسید خود به خود خاموش می‌شوند. با هربار خاموش یا روشن شدن پمپ، با استفاده از ماژول GSM، سیستم یک پیام ارسال کرده و وضعیت پمپ آب و رطوبت خاک را گزارش می‌کند. این سیستم برای مصارف کشاورزی، باغداری و… بسیار مفید می‌باشد. این سیستم کاملاً خودکار عمل کرده و نیاری به دخالت انسان نیست.

قطعات مورد نیاز برای پروژه‌ی سیستم آبیاری با استفاده از آردوینو

ماژول GSM

در اینجا از ماژول GSM SIM800 TTL استفاده کرده‌ایم. ماژول SIM800 یک ماژول چهاربانده GSM/GPRS است که علاقمندان به راحتی می‌توانند آن را روی بورد جاسازی کنند. ماژول SIM900 GSM یک رابط استاندارد صنعتی فراهم آورده است؛ این ماژول بازدهی مناسب صدا، پیام کوتاه و داده را با توان مصرفی کم روی GSM/GPRS 850/900/1800/1900MHz فراهم آورده است. طراحی ماژول SIM800 GSM نازک و فشرده است و به راحتی در بازار یا به صورت آنلاین در eBay موجود می‌باشد.

  • ماژول چهارباند GSM/GPRS در اندازه‌ی کوچک
  • GPRS فعال
  • خروجی TTL

سیستم آبیاری خودکار گیاهان مبتنی بر آردوینو به همراه با پیام هشدار

سیستم آبیاری خودکار گیاهان مبتنی بر آردوینو به همراه با پیام هشدار

توضیح مدار

در این سیستم آبیاری، از یک پروب سنسور رطوبت خاک دست‌ساز استفاده کرده‌ایم تا سطح رطوبت خاک را حس کند. برای ساختن پروب، مطابق شکل زیر یک بورد پوشیده با مس را برش داده و تراشیدیم. یک طرف پروب مستقیماً به Vcc و ترمینال دیگر پروب به بیس ترانزیستور BC547 وصل می‌شود. برای تنظیم حساسیت سنسور، یک پتانسیومتر به بیس ترانزیستور وصل می‌گردد.

مطلب پیشنهادی:  راه اندازی I2C در آردوینو

سیستم آبیاری خودکار گیاهان مبتنی بر آردوینو به همراه با پیام هشدار

از آردوینو برای کنترل کل پروسه سیستم آبیاری خودکار استفاده می‌شود. خروجی سنسور رطوبت خاک مستقیماً به پین دیجیتال D7 آردوینو وصل می‌شود. یک LED در مدار سنسور استفاده می‌شود، حالت روشن این LED نشان دهنده‌ی وجود رطوبت در خاک و حالت خاموش آن عدم وجود رطوبت در خاک را نشان می‌دهد.

ماژول GSM برای ارسال پیام کوتاه به کاربر به کار می‌رود. در اینجا ما از ماژول TTL SIM800 GSM، که مستقیماً با منطق TTL کار می‌کند (کاربر می‌تواند از هر ماژول GSM دیگری استفاده کند) استفاده کرده‌ایم. یک رگولاتور ولتاژ LM317 برای تغذیه ماژول GSM SIM800 به کار گرفته‌ایم. LM317 به نرخ ولتاژ بسیار حساس بوده و توصیه می‌شود که دیتاشیت آن را پیش از استفاده مطالعه کنید. ولتاژ کاری آن ۳.۸ ولت تا ۴.۲ ولت (بهتر است از ۳.۸ ولت استفاده کنید) می‌باشد. در زیر دیاگرام منبع تغذیه داده شده به ماژول SIM800 GSM نشان داده شده است.

سیستم آبیاری خودکار گیاهان مبتنی بر آردوینو به همراه با پیام هشدار

سیستم آبیاری خودکار گیاهان مبتنی بر آردوینو به همراه با پیام هشدار

اگر کاربر قصد استفاده از ماژول SIM900 TTL را دارد، آنگاه باید از ولتاژ ۵ ولت استفاده کند و اگر کاربر بخواهد از ماژول SIM900 استفاده کند آنگاه باید ولتاژ ۱۲ ولت را در جک DC اسلات برد اعمال کند.

از یک رله ۱۲ ولتی برای کنترل پمپ آب کوچک ۲۲۰ ولتی بهره برده‌ایم. این رله به وسیله‌ی یک ترانزیستور BC547 که به پین دیجیتال ۱۱ آردوینو متصل شده است، درایو می‌گردد.

سیستم آبیاری خودکار گیاهان مبتنی بر آردوینو به همراه با پیام هشدار

یک LCD اختیاری نیز برای نمایش وضعیت و پیام‌ها به کار رفته است. پین‌های کنترل LCD ،RS و EN به پین‌های ۱۴ و ۱۵ آردوینو وصل شده‌اند و پین‌های دیتای LCD، یعنی D4-D7، مستقیماً به پین‌های ۱۶، ۱۷، ۱۸ و ۱۹ آردوینو متصل شده‌اند. LCD در حالت ۴ بیت به کار می‌رود، و توسط کتابخانه LCD داخلی آردوینو راه‌اندازی می‌شود.

دیاگرام مداری سیستم ابیاری با آردوینو و سنسور رطوبت خاک نشان داده شده است.

سیستم آبیاری خودکار گیاهان مبتنی بر آردوینو به همراه با پیام هشدار

توضیح عملکرد

عملکرد سیستم آبیاری خودکار گیاهان بسیار ساده است. اول از همه، این سیستم یک سیستم کاملاً خودکار است و هیچ نیازی به دخالت انسان برای کنترل سیستم نیست. آردوینو برای کنترل کل این پروسه به کار می‌رود و ماژول GSM برای ارسال پیام هشدار روی تلفن همراه کاربر استفاده می‌شود.

مطلب پیشنهادی:  آموزش کار با سنسور‌های دما و رطوبت DHT11 و DHT22 با استفاده از آردوینو

سیستم آبیاری خودکار گیاهان مبتنی بر آردوینو به همراه با پیام هشدار

اگر رطوبت در خاک وجود داشته باشد، بین پروب‌های سنسور رطوبت خاک اتصال برقرار شده و به دلیل همین اتصال، ترانزیستور Q2 در حالت روشن/تریگر باقی مانده و پین D7 آردوینو پایین باقی می‌ماند. وقتی آردوینو سیگنال LOW در D7 را می‌خواند، یک پیام کوتاه به کاربر با موضوع «رطوبت خاک نرمال است. موتور خاموش است.» ارسال می‌کند و پمپ آب در حالت خاموش باقی می‌ماند.

وقتی رطوبتی در خاک وجود نداشته باشد، ترانزیستور Q2 خاموش شده و پین D7 بالا می‌رود. آنگاه آردوینو پین D7 را خوانده و و موتور آب را روشن می‌کند و هم‌چنین یک پیام کوتاه با موضوع «رطوبت خاک پایین تشخیص داده شد. موتور روشن شد.» ارسال می‌کند. وقتی که رطوبت در خاک به حد کافی رسید، موتور به صورت خودکار خاموش می‌شود. برای درک بهتر پروسه عملکرد پروژه بخش نمایش ویدئو و کد را که در انتهای این آموزش قرار داده شده را ملاحظه بفرمایید.

سیستم آبیاری خودکار گیاهان مبتنی بر آردوینو به همراه با پیام هشدار

توضیح برنامه‌نویسی

کد این برنامه بسیار ساده و قابل فهم است. اول از همه، کتابخانه SoftwareSerial را برای تبدیل پین‌های ۲ و ۳ به RX و TX، و کتابخانه LiquidCrystal را برای LCD ضمیمه کرده‌ایم. سپس چند متغیر برای موتور، سنسور رطوبت خاک، LED و … تعریف کرده‌ایم.

#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، ارتباط سریال در 9600bps آغاز گردیده و دستورات مناسب به پین‌های مختلف داده می‌شود. تابع 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 خوانده می‌شود، و مطابق با وضعیت سنسور، موتور خاموش و یا روشن شده و یک پیام کوتاه با استفاده از تابع 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 استفاده می‌شود، که در ابتدا با ارسال دستورات «AT» به ماژول GSM، بررسی می‌شود که آیا اتصالات ماژول GSM درست انجام شده است یا نه، اگر پاسخ OK دریافت گردد، به این معنی است که دستگاه آماده است. سیستم به بررسی ماژول ادامه می‌دهد تا آماده شده یا پیغام «OK» دریافت گردد. ECHO با ارسال دستور ATE0 خاموش می‌شود، در غیر این صورت ماژول GSM همه دستورات را اکو می‌کند. در نهایت دسترسی شبکه از طریق دستور «?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);
     }
      .... .....
      ..... .....

بدین ترتیب با سیستم آبیاری خودکار، هنگامی‌ که در خانه نیستید، نگرانی بابت گیاهانتان نخواهید داشت. می‌توان این پروژه را با مانیتورینگ از طریق اینترنت بهبود داد.

مطلب پیشنهادی:  راه اندازی سنسور دما LM35 با آردوینو

کد

#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();
}

ویدئو

اگر این نوشته‌ برایتان مفید بود لطفا کامنت بنویسید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *