در این مقاله به طور کامل راه اندازی سنسور رطوبت سنج خاک با آردوینو را به شما آموزش خواهیم داد اما پیش از آن بهتر است با این سنسور و طرز کار آن آشنا شوید.
هنگامی كه عبارت “باغچه هوشمند” را می شنويد، يكی از چيزهايی كه به ذهن شما می رسد، سيستمی برای اندازهگيری رطوبت خاک و آبياری اتوماتيک گياهان است. با چنين سيستمی شما تنها در مواقع مورد نياز به گياه خود آب می دهید و بدين ترتيب از زیاد شدن آب گیاه یا کم شدن آن جلوگیری می کنید. اگر قصد ساخت چنين سيستمی را دارید، قطعا به يک سنسور اندازهگيری رطوبت خاک نياز خواهيد داشت. در ادامه بیشتر در مورد این سنسور صحبت خواهیم کرد.
نحوه كار سنسور رطوبت سنج خاک
نحوه کار سنسور رطوبت سنج خاک بسیار ساده است. يک پراب چنگالی شكل كه دارای دو رسانای بدون پوشش می باشد به عنوان يک مقاومت متغير عمل می كند (شبيه به يک پتانسيومتر). مقدار اين مقاومت بسته به ميزان آب يا رطوبت موجود در خاک تغيير خواهد كرد.
میزان مقاومت با میزان رطوبت موجود در خاک رابطه عکس دارد، به این معنا که:
- هر چقدر آب داخل خاک بيشتر باشد، رسانايی بهتر خواهد بود كه در نتيجه سبب كاهش مقدار مقاومت خواهد شد.
- هر چقدر ميزان آب كمتری داخل خاک باشد، رسانايی ضعيفتر و لذا مقاومت الكتريكی بيشتر خواهد شد.
این سنسور متناسب با مقاومت الکتریکی، ولتاژ خروجی تولید می کند که با اندازه گیری آن، می توانیم سطح رطوبت خاک را مشخص کنیم.
مرور سخت افزاری سنسور رطوبت سنج خاک
يک سنسور رطوبت سنج خاک معمولا دارای دو بخش اصلي است:
پراب سنسور: سنسور دارای يک پراب چنگالی شكل با دو رسانا بدون پوشش است كه درون خاک و يا هر چيز ديگری كه قصد اندازهگيری آب داخل آن را داشته باشيم، قرار داده می شود. همانطور كه قبلا گفته شد، اين پراب شبيه به يک مقاومت متغير عمل می كند كه اندازه مقاومت آن براساس رطوبت خاک تغيير می کند.
ماژول سنسور: سنسور رطوبت خاک دارای يک ماژول الكترونيكی است كه پراب را به آردوينو متصل میکند. ولتاژ الكتريكی خروجی ماژول براساس مقاومت پراب توليد خواهد شد. مقدار اين ولتاژ در پين خروجی آنالوگ ماژول (پين AO) قابل دسترس است. سيگنال مشابهی به LM393 که یک مقایسه کننده با دقت بالا است، داده می شود. این مقایسه کننده سیگنال را به مقدار دیجیتال تبدیل می کند که از طریق پين DO ماژول در دسترس قرار می گیرد.
بر روی اين ماژول يک پتانسيومتر برای تنظيم حساسيت خروجی ديجيتال (DO) قرار داده شده است.
حد آستانه رطوبت را می توانيد با استفاده از پتانسيومتر تنظیم نمود. هنگامی كه سطح رطوبت اندازهگيری شده از اين حد آستانه زيادتر باشد، خروجی ماژول بصورت LOW و در غير اين صورت HIGH خواهد بود.
اين نوع عملكرد در مواقعي كه نياز به فعالسازی يک عمل خاصی (نظير آبياری) براساس يک حد آستانه وجود داشته باشد، بسيار مفيد خواهد بود. به عنوان نمونه هنگامی كه ميزان رطوبت خاک از يک حد خاصی كمتر شد، شما می توانيد توسط اين سيستم فرمان لازم را به يک رله جهت روشن نمودن پمپ آبياری اعمال كنيد.
نكته: برای افزايش حساسيت کافی است پتانسيومتر را در جهت ساعتگرد بچرخانيد و برای کاهش حساسیت کافی است آن را خلاف جهت ساعت حرکت دهید.
به علاوه، با تغذیه شدن ماژول، LED تغذیه روشن می شود و LED وضعيت در مواقعی كه خروجی ديجيتال ماژول LOW باشد، روشن خواهد شد.
پينهای سنسور رطوبت سنج خاک
با توجه به اينكه اين ماژول تنها 4 پين دارد، کار با آن بسيار ساده است. این چهار پین عبارت اند از:
پین AO : این پین خروجی آنالوگ ماژول است كه سيگنال آن دارای مقداری بين صفر تا سطح ولتاژ تغذيه خواهد بود و به یکی از ورودی های آنالوگ آردوینو متصل می شود.
پین DO : این پین خروجی ديجيتال مدار مقايسه كننده داخلی برد است. شما می توانيد اين پين را به هر پين ديجيتال دلخواه آردوينو وصل كنيد و يا آن را مستقيما به يک رله 5 ولتی و يا هر المان مشابه ديگری بدهيد.
پین VCC : این پین تغذيه سنسور است و قدرت آن را تغذیه می کند. معمولا توصیه می شود که اين سنسور را با ولتاژی در حدود 3.3 ولت تا 5 ولت تغذيه كنيد. به یاد داشته باشید كه اندازه خروجی آنالوگ سنسور بسته به ميزان ولتاژ تغذيه متفاوت خواهد بود.
پين GND : این پین، زمين ماژول سنسور رطوبت است.
در ادامه با دو مثال، رطوبت خاک را با این سنسور اندازه گیری خواهیم کرد اما پیش از آن، در صورت نیاز به این ماژول و سایر قطعات لازم در این پروژه، می توانید از طریق لینک های زیر اقدام به خرید کنید:
- سنسور رطوبت سنج خاک YL-69
- ماژول آردوینو
- سیم جامپر نری
- آداپتور 5 ولت
- کابل USB
- موتور پمپ آب مینیاتوری
- پک آبیاری اتوماتیک آبیاری گیاهان
اندازهگيری رطوبت خاک با استفاده از خروجی آنالوگ
همان طور که می دانيم سنسور رطوبت سنج خاک هم دارای خروجی آنالوگ و هم خروجی ديجيتال است. به همین دلیل در مثال اول رطوبت خاک را با استفاده از خروجی آنالوگ سنسور اندازهگيری خواهيم نمود.
سيم كشی
در اینجا می خواهیم این سنسور را به آردوینو متصل کنیم.
در ابتدا با اتصال پين VCC ماژول به 5 ولت آردوينو، تغذيه سنسور را تامين می كنيم.
اما يكی از مشکلات معمول سنسورهای رطوبت، طول عمر كوتاه اين سنسورها می باشد كه دليل آن مواجهه با محيطهای مرطوب است. چنانچه دائما تغذيه به پراب اعمال شود، سرعت خوردگی بطور قابل توجهی افزايش خواهد يافت.
برای رفع اين مشكل، به شما توصیه می کنیم كه تغذيه سنسور را بصورت دائم به سنسور اعمال نكنيد. تنها هنگامی كه قصد خواندن مقدار رطوبت خاک را داريد، تغذيه ر ا به سنسور اعمال کنید. یکی از روش های آسان برای انجام این کار، اتصال پين VCC ماژول سنسور به يک پين ديجيتال آردوينو و تنظیم آن بصورت High يا Low براساس نیاز است.
لازم به ذكر است كه كل جریانی كه برد سنسور (به همراه دو عدد LED ) از تغذيه می كشد، در حدود 8 ميلي آمپر است. بنابراين، چنانچه تغذيه ماژول توسط يک پين ديجيتال آردوينو تامين شود مشكلی بوجود نخواهد آمد.
در اين جا پين VCC ماژول سنسور را به پين ديجيتال شماره 7 آردوينو و پين GND ماژول را به زمين آردوينو متصل می كنيم. همچنین، پين AO ماژول سنسور را به پين A0 ADC (مبدل آنالوگ به ديجيتال) آردوينو متصل می كنيم. بنابراين سيم كشی اتصالات به شكل زير خواهد بود:
كاليبراسيون
برای داشتن يک عملکرد و مقدار دقيق توصيه می شود در ابتدا بر اساس خاک خاصی كه قصد اندازهگيری رطوبت آن را داريد، سنسور رطوبت سنج خاک را كاليبره كنيد.
انواع مختلف خاک می تواند عملكرد سنسور را تحت تاثير قرار دهد. بنابراين حساسيت سنسور بسته به نوع خاک ممكن است كم يا زياد شود. قبل از اينكه اقدام به ذخيره اطلاعات و يا فعالسازی عمل خاصی (نظير آبياری) بكنيد، بايد بدانيد واقعا چه اطلاعاتی توسط سنسور به ما داده می شود.
برای اطلاع از خروجی سنسور در مواقعی كه خاک كاملا خشک باشد و يا در مواقعی كه خاک اشباع از رطوبت باشد، می توان از كد زير استفاده نمود:
// Sensor pins
#define sensorPower 7
#define sensorPin A0
void setup() {
pinMode(sensorPower, OUTPUT);
// Initially keep the sensor OFF
digitalWrite(sensorPower, LOW);
Serial.begin(9600);
}
void loop() {
//get the reading from the function below and print it
Serial.print("Analog output: ");
Serial.println(readSensor());
delay(1000);
}
// This function returns the analog soil moisture measurement
int readSensor() {
digitalWrite(sensorPower, HIGH); // Turn the sensor ON
delay(10); // Allow power to settle
int val = analogRead(sensorPin); // Read the analog value form sensor
digitalWrite(sensorPower, LOW); // Turn the sensor OFF
return val; // Return analog moisture value
}
با اجرای كد فوق، نتيجه ای كه بر روی سریال مانیتور مشاهده می كنيد تقريبا مشابه زير خواهد بود:
- وقتی خاک خشک باشد (850~)
- وقتی خاک كاملا مرطوب (خيس) باشد (400~)
اين آزمايش ممكن است نيازمند يكسری سعی و خطا باشد. هنگامی كه به مقادیر خوانده شده از سنسور اطمينان پيدا كرديد، می توانيد اين مقادير را به عنوان حد آستانه برای استفاده عملی سنسور نظير آبياری به کار بگیرید.
طرح نهایی
بر اساس مقادير كاليبراسيون، نتايج زير برای تعيين وضعيت رطوبت خاک تعریف می شود:
- خروجی سنسور كمتر از 500: خاک كاملا مرطوب است.
- خروجی سنسور بين 500 تا 750: رنج متعادل رطوبت خاک.
- خروجی سنسور بيشتر از 750: خاک نياز به آبياری دارد.
/* Change these values based on your calibration values */
#define soilWet 500 // Define max value we consider soil 'wet'
#define soilDry 750 // Define min value we consider soil 'dry'
// Sensor pins
#define sensorPower 7
#define sensorPin A0
void setup() {
pinMode(sensorPower, OUTPUT);
// Initially keep the sensor OFF
digitalWrite(sensorPower, LOW);
Serial.begin(9600);
}
void loop() {
//get the reading from the function below and print it
int moisture = readSensor();
Serial.print("Analog Output: ");
Serial.println(moisture);
// Determine status of our soil
if (moisture < soilWet) {
Serial.println("Status: Soil is too wet");
} else if (moisture >= soilWet && moisture < soilDry) {
Serial.println("Status: Soil moisture is perfect");
} else {
Serial.println("Status: Soil is too dry - time to water!");
}
delay(1000); // Take a reading every second for testing
// Normally you should take reading perhaps once or twice a day
Serial.println();
}
// This function returns the analog soil moisture measurement
int readSensor() {
digitalWrite(sensorPower, HIGH); // Turn the sensor ON
delay(10); // Allow power to settle
int val = analogRead(sensorPin); // Read the analog value form sensor
digitalWrite(sensorPower, LOW); // Turn the sensor OFF
return val; // Return analog moisture value
}
اگر همه چيز بدرستی انجام گرفته باشد، خروجی برنامه بر روی سریال مانیتور، به فرمی همانند تصویر زیر خواهد بود:
اندازهگيری رطوبت خاک با استفاده از خروجی ديجيتال
در آزمايش دوم وضعيت خاک را بر اساس خروجی ديجيتال تعيين می كنيم.
سيم كشی
در اینجا از مدار آزمايش قبل استفاده می كنيم. این بار كافيست تنها اتصال به پين ADC آردوينو را حذف كنيم و در عوض پين DO ماژول را به پين ديجيتال شماره 8 آردوينو متصل كنيم.
نتيجه اين كار به شكل زير خواهد بود:
نکته: تنها زمانی منبع تغذیه را به سنسور اعمال کنید که قصد خواندن مقدار رطوبت خاک را دارید. به این شکل می توانید باعث کاهش خوردگی سنسور شوید.
كاليبراسيون
ماژول دارای يک پتانسيومتر برای كاليبراسيون خروجی ديجيتال (DO) است. با چرخاندن پتانسيومتر می توان حد آستانه سنسور رطوبت سنج خاک را تنظیم کرد. بنابراين هنگامی كه سطح رطوبت بيشتر از حد آستانه شود، LED وضعيت، روشن خواهد شد و خروجی ماژول LOW می شود.
اكنون برای كاليبره كردن سنسور کافی است در هنگامی كه گياه شما نياز به آبياری دارد، پراب سنسور را در داخل خاک وارد كنيد و پتانسيومتر را در جهت ساعتگرد آهسته بچرخانيد تا زمانی كه LED وضعيت روشن شود. سپس آن را آنقدر در جهت خلاف عقربه ساعت بچرخانيد تا LED خاموش شود.
اكنون سنسور كاليبره شده است و برای استفاده آماده می باشد.
كد آردوينو برای راه اندازی سنسور رطوبت سنج خاک
پس از بستن مدار، كد زير را بر روی آردوينو آپلود كنيد:
// Sensor pins
#define sensorPower 7
#define sensorPin 8
void setup() {
pinMode(sensorPower, OUTPUT);
// Initially keep the sensor OFF
digitalWrite(sensorPower, LOW);
Serial.begin(9600);
}
void loop() {
//get the reading from the function below and print it
int val = readSensor();
Serial.print("Digital Output: ");
Serial.println(val);
// Determine status of our soil moisture situation
if (val) {
Serial.println("Status: Soil is too dry - time to water!");
} else {
Serial.println("Status: Soil moisture is perfect");
}
delay(1000); // Take a reading every second for testing
// Normally you shoul take reading perhaps every 12 hours
Serial.println();
}
// This function returns the analog soil moisture measurement
int readSensor() {
digitalWrite(sensorPower, HIGH); // Turn the sensor ON
delay(10); // Allow power to settle
int val = digitalRead(sensorPin); // Read the analog value form sensor
digitalWrite(sensorPower, LOW); // Turn the sensor OFF
return val; // Return analog moisture value
}
اگر همه چيز را درست انجام داده باشيد، خروجی برنامه بر روی سریال مانیتور به فرمی شبيه به شكل زير خواهد بود:
اکنون می توانید کار با سنسور را آغاز کنید. اگر در این زمینه سوالی ذهن شما را به خود مشغول کرده است، می توانید آن را با ما در میان بگذارید.