سلام به همه شما مایکروالکامی ها. ممکنه اکثر شما ایده ساخت گلدان هوشمند به ذهنتون خورده باشه و مهم ترین ویژگی این وسیله آن است که در زمان نیاز (کمبود رطوبت خاک) گیاه بتونه میزان آب خودش را تامین کند. در این آموزش با استفاده از ماژول رطوبت خاک YL-100 و راه اندازی آن رطوبت را بررسی و اندازه گیری کرده و روی نمایشگر TFT نمایش خواهیم داد. در صورت کمبود رطوبت خاک خروجی رله فعال خواهد شد. پس با من تا انتهای مطلب همراه باشید. همچنین شما میتونید سایر مطلب من رو از این قسمت مطالعه کنید.
معرفی برد آردوینو
اکثر شما با این برد بسیار محبوب آشنایی دارید. برد های آردوینو Arduino از سری برد های امبدد بوده که در بحث اینترنت اشیا نیز معروف میباشند. برد آردوینو اونو (Arduinio UNO) از معروف ترین های این دسته بندی است. میکروکنترلر به کار رفته در آن ATMEGA328P بوده و دارای 6 ورودی آنالوگ، 14 پایه دیجیتال که 6 عدد از آنها پایه های PWM هستند.
معرفی ماژول رطوبت خاک 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 استفاده شده است.
اتصالات نمایشگر 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@) رو هم منشن کنید.
مثل همیشه عالی و جذاب 🤘❤️
ارادتمندم
بسیار مفید و اموزنده یود👍
خیلی مچکر از انرژیتون
Such an efficient product !
Thanks a lot 🌺
دمتون گرم 🍭✨ عالی بود امیدوارم همیشه موفق باشید 😍😍👏🏼👏🏼
خیلی سپاسگزارم از انرژی که دادید
نظر لطفتون هست
بسیار مفید 👍
خیلی ممنون از اینکه نظراتتون رو به اشتراک میگذارید