🪴 سنسور رطوبت خاک با آردوینو و ساخت سیستم آبیاری خودکار گلدان
اگر گلدانت را همیشه یا زیادی آب میدهی یا یادت میرود، این پروژه برای توست. سنسور رطوبت خاک یکی از محبوبترین سنسورهای آردوینو است، چون ارزان است و نتیجهاش واقعاً به درد زندگی میخورد. در این آموزش اول میفهمیم این دو شاخهی فلزی چطور رطوبت را حس میکنند، بعد عدد خام را کالیبره و به درصد تبدیل میکنیم، یاد میگیریم چطور پراب را از زنگ زدن نجات دهیم و در آخر یک سیستم آبیاری خودکار با رله و پمپ میسازیم. همهی این مدار را میتوانی رایگان در شبیهساز فارسی بچینی، همانطور که خیلیها پروژهها را اول در ووکوی (Wokwi) امتحان میکنند.
سنسور رطوبت خاک چطور کار میکند؟
سنسور رایج (معروف به FC-28 یا YL-69) دو تکه است: یک پراب دوشاخه که در خاک فرو میرود و یک ماژول کوچک با تراشهی مقایسهگر LM393 و یک پیچ تنظیم. ایده خیلی ساده است: آب خالص رسانای خوبی نیست، ولی آب داخل خاک پر از نمکهای حلشده است و برق را رسانا میکند. هرچه خاک خیستر باشد، مقاومت بین دو شاخه کمتر است. ماژول این مقاومت را با یک مقسم ولتاژ به ولتاژ تبدیل میکند.
نتیجهای که باید به خاطر بسپاری: در این ماژولها خاک خشک عدد بزرگ میدهد (نزدیک ۱۰۲۳ در هوا) و خاک خیس عدد کوچکتر (مثلاً حدود ۳۰۰ تا ۴۰۰ در لیوان آب). یعنی برعکس چیزی که انتظار داری. نوع دیگری هم هست به اسم سنسور خازنی (Capacitive v1.2) که فلز لخت در خاک ندارد و زنگ نمیزند؛ کدش تقریباً همین است، فقط عددهای کالیبراسیونش فرق میکند.
پایههای ماژول
| پایه | کارش |
|---|---|
| VCC | تغذیه، ۳٫۳ تا ۵ ولت |
| GND | زمین |
| AO | خروجی آنالوگ: ولتاژی متناسب با خشکی خاک |
| DO | خروجی دیجیتال: LOW وقتی خاک از آستانهی پیچ خیستر است، HIGH وقتی خشکتر |
دو پایهی دیگر ماژول هم با دو سیم به پراب وصل میشوند و جهتشان مهم نیست. ما از AO استفاده میکنیم چون عدد دقیق میخواهیم؛ DO را آزاد میگذاریم.
قطعهها و سیمکشی
- یک آردوینو Uno
- یک سنسور رطوبت خاک (پراب + ماژول)
- برای پروژهی دوم: یک رله، یک پمپ کوچک ۵ یا ۱۲ ولتی و منبع تغذیهی جدا برای پمپ
| ماژول | آردوینو | توضیح |
|---|---|---|
| VCC | پین دیجیتال 8 | برق فقط هنگام اندازهگیری (ضد زنگزدگی) |
| GND | GND | زمین مشترک |
| AO | A0 | عدد رطوبت |
| DO | وصل نمیشود | اختیاری |
| IN رله (پروژهی دوم) | پین 7 | فرمان پمپ |
کد کامل
// Soil moisture sensor (probe + LM393 module) on an Arduino Uno.
const int SOIL_PIN = A0; // AO of the module
const int POWER_PIN = 8; // feeds the module's VCC only while measuring
const int DRY_VALUE = 850; // reading with the probe in dry soil (calibrate!)
const int WET_VALUE = 350; // reading with the probe in a glass of water
int readSoil() {
digitalWrite(POWER_PIN, HIGH); // power the probe
delay(10); // let the reading settle
int value = analogRead(SOIL_PIN);
digitalWrite(POWER_PIN, LOW); // switch off: slows down corrosion
return value;
}
void setup() {
Serial.begin(9600);
pinMode(POWER_PIN, OUTPUT);
digitalWrite(POWER_PIN, LOW);
}
void loop() {
int raw = readSoil();
int percent = map(raw, DRY_VALUE, WET_VALUE, 0, 100);
percent = constrain(percent, 0, 100);
Serial.print("raw:");
Serial.print(raw);
Serial.print(" moisture:");
Serial.println(percent);
if (percent < 30) {
Serial.println("Thirsty! Water me.");
}
delay(1000);
}
توضیح کد و کالیبره کردن
readSoil()یک تابع کوچک است: برق پراب را وصل میکند، ده میلیثانیه صبر میکند تا ولتاژ ثابت شود، میخواند و دوباره قطع میکند.map(raw, DRY_VALUE, WET_VALUE, 0, 100)چون خاک خشک عدد بزرگ میدهد، عدد خشک را به صفر درصد و عدد خیس را به صد درصد نگاشت کردهایم.mapبا بازهی برعکس مشکلی ندارد.constrainجلوی درصدهای منفی یا بالای صد را میگیرد؛ خاکی که از لحظهی کالیبراسیون خشکتر شود، باز هم صفر درصد نشان داده میشود.- کالیبره کردن: کد را اجرا کن، پراب را در خاک کاملاً خشک بگذار و عدد
rawرا درDRY_VALUEبنویس. بعد پراب را تا خط مجاز در لیوان آب فرو کن و عدد را درWET_VALUEبگذار. هر پراب و هر خاک کمی فرق دارد، پس این دو عدد مال پروژهی خودت است. - آستانهی ۳۰ درصد برای بیشتر گیاههای آپارتمانی نقطهی شروع خوبی است؛ کاکتوس کمتر و سرخس بیشتر میخواهد.
پروژهی کوچک: آبیاری خودکار با رله و پمپ
حالا مدار بهجای «تشنهام» گفتن، خودش آب میدهد. یک نکتهی مهم که خیلیها جا میاندازند: آب چند ثانیه تا چند دقیقه طول میکشد تا به نوک پراب برسد. اگر کد فقط بگوید «تا وقتی خشک است پمپ روشن باشد»، پمپ آنقدر کار میکند که آب از زیر گلدان بیرون بزند. پس هر بار فقط سه ثانیه آب میدهیم و بعد یک دقیقه صبر میکنیم تا آب در خاک پخش شود.
// Mini project: automatic plant watering with a relay and a small pump.
const int SOIL_PIN = A0;
const int POWER_PIN = 8;
const int RELAY_PIN = 7;
const int RELAY_ON = HIGH; // many relay modules are active-LOW:
const int RELAY_OFF = LOW; // if yours is, swap these two values
const int DRY_VALUE = 850;
const int WET_VALUE = 350;
const int START_BELOW = 30; // % : water when drier than this
const unsigned long PUMP_MS = 3000; // pump for 3 s at a time
const unsigned long SOAK_MS = 60000; // then wait 1 min for the water to soak in
unsigned long lastWater = 0;
bool wateredOnce = false;
int readPercent() {
digitalWrite(POWER_PIN, HIGH);
delay(10);
int raw = analogRead(SOIL_PIN);
digitalWrite(POWER_PIN, LOW);
int percent = map(raw, DRY_VALUE, WET_VALUE, 0, 100);
return constrain(percent, 0, 100);
}
void setup() {
Serial.begin(9600);
pinMode(POWER_PIN, OUTPUT);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, RELAY_OFF); // pump off at start
}
void loop() {
int moisture = readPercent();
Serial.print("moisture:");
Serial.println(moisture);
bool soaked = !wateredOnce || (millis() - lastWater > SOAK_MS);
if (moisture < START_BELOW && soaked) {
Serial.println("Watering...");
digitalWrite(RELAY_PIN, RELAY_ON);
delay(PUMP_MS);
digitalWrite(RELAY_PIN, RELAY_OFF);
lastWater = millis();
wateredOnce = true;
}
delay(2000);
}
RELAY_ON و RELAY_OFF را جدا تعریف کردیم چون بیشتر ماژولهای رلهی بازار «فعال با LOW» هستند؛ یعنی با صفر ولت روشن میشوند. اگر رلهی تو با روشن شدن آردوینو بلافاصله تق کرد و پمپ کار افتاد، فقط این دو را جابهجا کن. پمپ را هرگز مستقیم به پین آردوینو وصل نکن؛ رله فقط یک کلید است و برق پمپ باید از منبع خودش بیاید. جزئیات بیشتر در آموزش ماژول رله با آردوینو و معنی کوتاهش در واژهنامه: رله آمده است.
اجرا در شبیهساز، رایگان
ماژول رطوبت خاک در تینکرکد فارسی همان چهار پایهی V+، GND، AO و DO را دارد و روی آردوینو اونو رایگان است. مثال آمادهی «آبیاری خودکار» را باز کن؛ سنسور، رله و کد با صبر بین آبیاریها با هم بار میشوند. در مود ساده هم با انتخاب ماژول، اسلایدرهای «رطوبت خاک» و «آستانهی خروجی دیجیتال» را داری و میتوانی رفتار DO را بدون کد ببینی. درس قدمبهقدمش درس ۵۵: آبیاری خودکار گلدان است، توضیح بیشتر سنسور در سنسور رطوبت خاک چیست؟ و ایدههای تکمیلی در مقالهی گلدان هوشمند با آردوینو.
اشکالهای رایج
- درصد برعکس است (خشک = ۱۰۰٪): در
mapجای عدد خشک و خیس را عوض کردهای. در این ماژولها خشک عدد بزرگتر است. - عدد همیشه ۰ است: پین 8 را
OUTPUTنکردهای یا قبل از خواندن HIGH نکردهای؛ ماژول برق ندارد. - پراب بعد از چند هفته سیاه و زنگزده شده: دائم برق داشته است. ترفند پین 8 را به کار ببر یا سراغ سنسور خازنی برو.
- گلدان غرق شد: زمان خیس شدن خاک را در نظر نگرفتهای. پمپ کوتاه، صبر طولانی.
- با روشن شدن پمپ، آردوینو ریست میشود: پمپ و آردوینو از یک منبع ضعیف تغذیه میشوند و ولتاژ افت میکند. منبع پمپ را جدا کن و فقط GNDها را مشترک بگذار.
- ماژول خیس شده: فقط پراب جایش در خاک است. برد ماژول را بالا و خشک نگه دار.
دمای هوا را هم اضافه کن تا یک ایستگاه کامل گیاه داشته باشی: سنسور DHT22 با آردوینو. نسخهی اینترنتی و چندگلدانی همین ایده را در گلخانهی هوشمند با ESP32 ساختهایم. بقیهی سنسورها در بخش سنسورها هستند.
آبیاری خودکار را رایگان اجرا کن 🪴سؤالهای رایج
چرا پراب سنسور رطوبت خاک بعد از چند هفته زنگ میزند؟
از دو شاخهی پراب مقاومتی دائماً جریان میگذرد و این جریان در خاک خیس باعث خوردگی الکتریکی میشود. اگر پراب فقط هنگام اندازهگیری برق داشته باشد، عمرش خیلی بیشتر میشود. سنسورهای خازنی هم اصلاً فلز لخت در خاک ندارند.
خروجی AO بهتر است یا DO؟
AO عدد پیوستهی رطوبت را میدهد و برای درصد و نمودار لازم است. DO فقط میگوید خشکتر یا خیستر از آستانهای که با پیچ روی ماژول تنظیم کردهای؛ برای مدارهای خیلی ساده کافی است.
میشود پمپ آب را مستقیم به پین آردوینو وصل کرد؟
نه. پمپ دهها برابر بیشتر از توان یک پین جریان میکشد. باید از رله یا ترانزیستور و یک منبع تغذیهی جدا برای پمپ استفاده کنی.