راه اندازی ماژول رطوبت سنج YL-100 و نمایش روی LCD تمام رنگ TFT

راه اندازی ماژول رطوبت سنج YL-100 و نمایش روی LCD تمام رنگ TFT
نوشته شده توسط

سلام به همه شما مایکروالکامی ها. ممکنه اکثر شما ایده ساخت گلدان هوشمند به ذهنتون خورده باشه و مهم ترین ویژگی این وسیله آن است که در زمان نیاز (کمبود رطوبت خاک) گیاه بتونه میزان آب خودش را تامین کند. در این آموزش با استفاده از ماژول رطوبت خاک YL-100 و راه اندازی آن رطوبت را بررسی و اندازه گیری کرده و روی نمایشگر TFT نمایش خواهیم داد. در صورت کمبود رطوبت خاک خروجی رله فعال خواهد شد. پس با من تا انتهای مطلب همراه باشید. همچنین شما میتونید سایر مطلب من رو از این قسمت مطالعه کنید.


معرفی برد آردوینو

اکثر شما با این برد بسیار محبوب آشنایی دارید. برد های آردوینو Arduino از سری برد های امبدد بوده که در بحث اینترنت اشیا نیز معروف می‌باشند. برد آردوینو اونو (Arduinio UNO) از معروف ترین های این دسته بندی است. میکروکنترلر به کار رفته در آن ATMEGA328P بوده و دارای 6 ورودی آنالوگ، 14 پایه دیجیتال که 6 عدد از آنها پایه های PWM هستند.


معرفی ماژول رطوبت خاک YL-100

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

در این آموزش از ماژول YL-100 استفاده شده است. ماژول رطوبت خاک YL-100 علاوه بر خروجی دیجیتال، خروجی آنالوگ نیز دارد. این ماژول همان طور که در عکس مشاهده می‌کنید دارای دو پایه (شاخک) است که داخل خاک قرار گرفته و رطوبت خاک را می‌تواند اندازه گیری کند.

ماژول رطوبت خاک YL-100
ماژول رطوبت خاک YL-100

اتصالات ماژول رطوبت خاک به آردوینو

Yl-100 Arduino
VCC VCC
GND GND
D0 ***
A0 A0


معرفی LCD نمایشگر TFT

این نمایشگر 2.4 اینچی دارای 8 پایه برای راه اندازی با پروتکل SPI است. یکی از مهم ترین ویژگی های این نمایشگر این است که می‌توان با کد هگز در قسمت برنامه نویسی هر رنگی را روی نمایگشر به نمایش گذاشت. برای راه اندازی این ماژول از کتابخانه های Adafruit_ST7735  Adafrruit_GFX و از محیط برنامه نویسی Arduino IDE استفاده شده است.

نمایشگر LCD TFT
نمایشگر LCD TFT

اتصالات نمایشگر TFT

TFT LD Arduino
VCC 5V
GND GND
CS 10
RESET 8
A0 9
SDA 11
SCK 13
LED 3.3V

برنامه نویسی برای اندازه گیری رطوبت خاک با ماژول YL-100

//******************************* TFT
#include  <Adafruit_ST7735.h>
#include  <Adafruit_GFX.h>

//************************ paye TFT
//#define TFT_CS     10
//#define TFT_RST    8
//#define TFT_DC     9
Adafruit_ST7735 tft = Adafruit_ST7735(10,  9, 8);

#define TFT_SCLK 13
#define TFT_MOSI 11
//**************************** sensor rotobat
int moisture;
int moisture_S = 0;
//*******************************  khoroji rele
int rele = 2;
void setup() {
  Serial.begin(9600);
  pinMode(rele, OUTPUT);
  //**************************** backgraound tft aval siah bashe
  tft.initR(0XFFFFFF);
  tft.fillScreen(0XDF7FF);

  //*************************tarahie haye avalie tft
  printText(0X16587C, 10, 70, 1);
  tft.print("In the name of god");
  delay(600);
  printText(0X16587C, 10, 90, 2);
  tft.print("Arman.H.R");
  printText(0X16587C, 10, 110, 1);
  delay(600);
  tft.print("  soile moisture");
  delay(2000);
  tft.initR(0XFFFFFF);
  tft.fillScreen(0XDF7FF);


  tft.fillRect(-10, 40, 140, 3, 0XFF3DF7);
  tft.fillRect(-10, 45, 140, 3, 0XFF3DF7);
  tft.fillRect(-10, 50, 140, 3, 0XFF3DF7);

   tft.fillRect(-10, 150, 140, 3, 0XFF3DF7);
  tft.fillRect(-10, 145, 140, 3, 0XFF3DF7);
 tft.fillRect(-10, 140, 140, 3, 0XFF3DF7);
 
  
  printText(0X16587C, 10, 65, 3);
  tft.println("Wet");
}

void loop() {
  //**************************************** moarefi paye magol rotobat khak be arduino
  moisture = analogRead (A0);
  //**************************************** tabdil addad sensor be baze bain 0 ta 100
  moisture = map(moisture, 210, 971, 0, 99);
  moisture = map(moisture, 0, 99, 99, 0);
  Serial.println(moisture);

//************************************* namayash addad rotobat dar tft 
  printText(0X16587C, 80, 70, 2);
  tft.print(moisture)&& tft.print("%");

//************************************  pak kardan addad ghadim 
  if (moisture_S != moisture) {
    moisture_S = moisture;
    tft.fillRect(80, 70, 35, 15, 0XDF7FF);
  }
  //******************************** if ha baraye roshan va khmosh kardan khroji rele va neveshtan barkhi matn ha mar boat be kambod rotobat ... 
if (moisture < 30) {
    digitalWrite(rele, HIGH);
    printText(0X16587C, 25,110,1);
    tft. println("move watering");

  tft.fillRect(32, 120, 60, 7, 0XDF7FF);
 delay(200);
    printText(0X16587C, 32, 120,1);
    tft. println("need water");
     delay(600);
  }

      
  else if (moisture >= 60) {
     

    digitalWrite(rele, LOW);
      printText(0X16587C, 32, 110,1);
    tft. println("watering full");
    delay(1000);
  }
 
  tft.fillRect(25, 105, 80, 25, 0XDF7FF);

}
//***********************************************************♣♣♣ tarif tabe baraye kod nevisi kamtar marbot be namayeshgar tft
void printText( uint16_t color, int x, int y, int textSize) {

  tft.setCursor(x, y);
  tft.setTextColor(color);
  tft.setTextSize(textSize);
  tft.setTextWrap(true);
}

تحلیل کد ها

ابتدا کتابخانه های مربوطه را معرفی می‌کنیم.

#include  <Adafruit_ST7735.h>
#include  <Adafruit_GFX.h>

به هیمن ترتیب در خطوط پایین تر پایه های cs ،rst ،dc مربوط به نمایشگر برای اتصال به آردوینو را تعریف کردیم.

//#define TFT_CS     10
//#define TFT_RST    8
//#define TFT_DC     9
Adafruit_ST7735 tft = Adafruit_ST7735(10,  9, 8);

#define TFT_SCLK 13
#define TFT_MOSI 11
  

تعریف پایه خروجی مربوط به رله

Serial.begin(9600);
  pinMode(rele, OUTPUT);

با این دو دستور رنگ پس زمینه مربوط به نمایشگر را می‌توان تعیین کرد.

tft.initR(0XFFFFFF);
  tft.fillScreen(0XDF7FF);

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

معرفی تابع printText

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

(سایز نوشته ,مختصات محور Y , مختصات محور x , رنگ نوشته)printText

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

//*************************tarahie haye avalie tft
  printText(0X16587C, 10, 70, 1);
  tft.print("In the name of god");
  delay(600);
  printText(0X16587C, 10, 90, 2);
  tft.print("Arman.H.R");
  printText(0X16587C, 10, 110, 1);
  delay(600);
  tft.print("  soile moisture");
  delay(2000);
  tft.initR(0XFFFFFF);
  tft.fillScreen(0XDF7FF);

با استفاده از دستور زیر، مستطیل در سایز و مختصات های متفاوت را رسم می‌کنیم. دستور tft.fillRect برای رسم مستطیل توپر است که استفاده از آن به شرح زیر می‌باشد.

(رنگ مستطیل , عرض مستطیل, طول مستطیل,مختصات محور Y برای شروع اولیه , مختصات محور X برای شروع اولیه رسم)Tft.fillRect

tft.fillRect(-10, 40, 140, 3, 0XFF3DF7);
tft.fillRect(-10, 45, 140, 3, 0XFF3DF7);
tft.fillRect(-10, 50, 140, 3, 0XFF3DF7);

 tft.fillRect(-10, 150, 140, 3, 0XFF3DF7);
tft.fillRect(-10, 145, 140, 3, 0XFF3DF7);
tft.fillRect(-10, 140, 140, 3, 0XFF3DF7);

این بخش از کد هم مربوط به نمایش متن “Wet” می‌باشد که  که در مختصات و رنگی مشخص در نمایشگر نشان داده خواهد شد.

printText(0X16587C, 10, 65, 3);

tft.println("Wet");

در ادامه به حلقه اصلی برنامه که همان void loop است میرسیم. در قسمت اولیه این تابع ورودی آنالوگ مربوط به ماژول رطوبت خاک تعریف شده است. در ادامه با استفاده از تابع مپ مقادیر دریافت شده را در بازه بین 0 تا 100 تغییر می‌دهیم.

استفاده از تابع map

A=map(variable,an,bn,ao,bo);
  • A: دیتای هایی تبدیل شده در این متغیر ذخیره می‌شود.
  • Variable: نام متغیری که می‌خواهیم بازه مقادیرش را تغییر دهیم.
  • An: کوچک ترین عددی که از متغیر دریافت می‌کنیم.
  • BN: بزرگترین مقداری که از متغیر دریافت می‌کنیم.
  • AO : کوچک ترین عددی که میخواهیم دریافت کنیم.
  • BO: بزرگترین عددی که میخواهیم دریافت کنیم.
//**************************************** moarefi paye magol rotobat khak be arduino
 moisture = analogRead (A0);
 //**************************************** tabdil addad sensor be baze bain 0 ta 100
 moisture = map(moisture, 210, 971, 0, 99); 
 moisture = map(moisture, 0, 99, 99, 0); 
 Serial.println(moisture);

نمایش مقادیر روی LCD

این قسمت از حلقه مربوط به نمایش مقادیر ماژول رطوبت خاک می‌باشد که با تابع printText مختصات، سایز و رنگ نوشته را تعیین کردیم. در ادامه با دستور tft.print مقادیر بدست آمده را روی نمایشگر نمایش خواهیم داد.

printText(0X16587C, 80, 70, 2);
  tft.print(moisture)&& tft.print("%");

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

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

if (moisture_S != moisture) {
    moisture_S = moisture;
    tft.fillRect(80, 70, 35, 15, 0XDF7FF);
  }

این قسمت جاییست که هوشمند سازی روی کار می‌آید. به طوری که اگر رطوبت خاک کمتر از 30 درصد شد خروجی رله فعال شده و در نمایشگر عبارت “need water”به صورت چشمک زن و “move watering” نمایش داده می‌شود.

if (moisture < 30) {
    digitalWrite(rele, HIGH);
    printText(0X16587C, 25, 110,1);
    tft. println("move watering");

  tft.fillRect(32, 135, 60, 7, 0XDF7FF);
 delay(200);
    printText(0X16587C, 32, 120,1);
    tft. println("need water");
     delay(600);
  }

تکه کد این قسمت برعکس بخش قبلی می‌باشد بطوری که اگر رطوبت بیش از 70 درصد شد خروجی رله خاموش و روی نمایشگر عبارت “watering full” را نمایش خواهد داد.

else if (moisture >= 60) {
    digitalWrite(rele, LOW);
      printText(0X16587C, 25, 110,1);
    tft. println("watering full");
    delay(1000);
}

این بخش از کد برای این است که نوشته need water  و  move watering  را در صورت رطوبت بالا حذف کنییم مستطیلی را هم رنگ پس زمینه نمایشگر رسم کردیم تا شرایط برای نمایش متن watering full  فراهم شود.

tft.fillRect(25, 105, 80, 25, 0XDF7FF);

در قسمت اخر هم تابع printText  را تعریف کردیم که قبل تر به شرح این تابع پرداخته شد.

void printText( uint16_t color, int x, int y, int textSize) {
  tft.setCursor(x, y);
  tft.setTextColor(color);
  tft.setTextSize(textSize);
  tft.setTextWrap(true);
}


فیلم از نحوه عملکرد


جمع بندی

در این مطلب به نحوه استفاده از ماژول اندازه گیری رطوبت خاک مدل YL-100 پرداخته شد. همچنین برنامه ای نوشته شد که با استفاده از آن مقادیر اندازه گیری شده را به راحتی برروی یک LCD تمام رنگ TFT به نمایش گذاشته و در صورتی که رطوبت خاک از حدی پایین تر یا بالاتر رفته باشد یک خروجی با توجه به مقدار رطوبت خاک به ما میدهد.

امیدوارم از این آموزش کمال بهره را برده باشید. در صورتی که هرگونه نظر یا سوال داشتید درباره این آموزش لطفا اون رو در انتهای همین صفحه در قسمت دیدگاه ها قرار بدید. در کوتاه ترین زمان ممکن به اون ها پاسخ خواهم داد. اگر این مطلب براتون مفید بود، اون رو حتما به اشتراک بگذارید. همینطور میتونید این آموزش را پس از اجرای عملی توی اینستاگرام با هشتگ microelecom# به اشتراک بگذارید و پیج مایکروالکام (microelecom@) رو هم منشن کنید.

۱۰ دیدگاه برای “راه اندازی ماژول رطوبت سنج YL-100 و نمایش روی LCD تمام رنگ TFT

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

نشانی ایمیل شما منتشر نخواهد شد.