🪴 سنسور رطوبت خاک با آردوینو و ساخت سیستم آبیاری خودکار گلدان

✍️ تیم ووکوی فارسی ·

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

سنسور رطوبت خاک چطور کار می‌کند؟

سنسور رایج (معروف به FC-28 یا YL-69) دو تکه است: یک پراب دوشاخه که در خاک فرو می‌رود و یک ماژول کوچک با تراشه‌ی مقایسه‌گر LM393 و یک پیچ تنظیم. ایده خیلی ساده است: آب خالص رسانای خوبی نیست، ولی آب داخل خاک پر از نمک‌های حل‌شده است و برق را رسانا می‌کند. هرچه خاک خیس‌تر باشد، مقاومت بین دو شاخه کمتر است. ماژول این مقاومت را با یک مقسم ولتاژ به ولتاژ تبدیل می‌کند.

نتیجه‌ای که باید به خاطر بسپاری: در این ماژول‌ها خاک خشک عدد بزرگ می‌دهد (نزدیک ۱۰۲۳ در هوا) و خاک خیس عدد کوچک‌تر (مثلاً حدود ۳۰۰ تا ۴۰۰ در لیوان آب). یعنی برعکس چیزی که انتظار داری. نوع دیگری هم هست به اسم سنسور خازنی (Capacitive v1.2) که فلز لخت در خاک ندارد و زنگ نمی‌زند؛ کدش تقریباً همین است، فقط عددهای کالیبراسیونش فرق می‌کند.

پایه‌های ماژول

پایهکارش
VCCتغذیه، ۳٫۳ تا ۵ ولت
GNDزمین
AOخروجی آنالوگ: ولتاژی متناسب با خشکی خاک
DOخروجی دیجیتال: LOW وقتی خاک از آستانه‌ی پیچ خیس‌تر است، HIGH وقتی خشک‌تر

دو پایه‌ی دیگر ماژول هم با دو سیم به پراب وصل می‌شوند و جهتشان مهم نیست. ما از AO استفاده می‌کنیم چون عدد دقیق می‌خواهیم؛ DO را آزاد می‌گذاریم.

قطعه‌ها و سیم‌کشی

ماژولآردوینوتوضیح
VCCپین دیجیتال 8برق فقط هنگام اندازه‌گیری (ضد زنگ‌زدگی)
GNDGNDزمین مشترک
AOA0عدد رطوبت
DOوصل نمی‌شوداختیاری
IN رله (پروژه‌ی دوم)پین 7فرمان پمپ
💡 چرا VCC را به پین 8 دادیم نه 5V؟ ماژول کمتر از ۲۰ میلی‌آمپر می‌کشد و یک پین آردوینو راحت تأمینش می‌کند. با این کار پراب فقط چند میلی‌ثانیه در هر اندازه‌گیری برق دارد و به‌جای چند هفته، ماه‌ها سالم می‌ماند.

کد کامل

// 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);
}

توضیح کد و کالیبره کردن

پروژه‌ی کوچک: آبیاری خودکار با رله و پمپ

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

// 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 را بدون کد ببینی. درس قدم‌به‌قدمش درس ۵۵: آبیاری خودکار گلدان است، توضیح بیشتر سنسور در سنسور رطوبت خاک چیست؟ و ایده‌های تکمیلی در مقاله‌ی گلدان هوشمند با آردوینو.

اشکال‌های رایج

دمای هوا را هم اضافه کن تا یک ایستگاه کامل گیاه داشته باشی: سنسور DHT22 با آردوینو. نسخه‌ی اینترنتی و چندگلدانی همین ایده را در گلخانه‌ی هوشمند با ESP32 ساخته‌ایم. بقیه‌ی سنسورها در بخش سنسورها هستند.

آبیاری خودکار را رایگان اجرا کن 🪴

سؤال‌های رایج

چرا پراب سنسور رطوبت خاک بعد از چند هفته زنگ می‌زند؟

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

خروجی AO بهتر است یا DO؟

AO عدد پیوسته‌ی رطوبت را می‌دهد و برای درصد و نمودار لازم است. DO فقط می‌گوید خشک‌تر یا خیس‌تر از آستانه‌ای که با پیچ روی ماژول تنظیم کرده‌ای؛ برای مدارهای خیلی ساده کافی است.

می‌شود پمپ آب را مستقیم به پین آردوینو وصل کرد؟

نه. پمپ ده‌ها برابر بیشتر از توان یک پین جریان می‌کشد. باید از رله یا ترانزیستور و یک منبع تغذیه‌ی جدا برای پمپ استفاده کنی.

مقاله‌های مرتبط

💨

سنسور گاز MQ-2 با آردوینو: تشخیص دود و گاز، گرم شدن، آستانه و آژیر

🔢

کیپد ۴×۴ با آردوینو: طرز کار ماتریسی، کتابخانه‌ی Keypad و قفل رمزدار با سروو

🔢

نمایشگر سون‌سگمنت ۴ رقمی TM1637 با آردوینو: عدد، دونقطه و تایمر معکوس

🐞

دیباگ قدم‌به‌قدم کد آردوینو در شبیه‌ساز آنلاین: بریک‌پوینت و دیدن متغیرها

همه‌ی آموزش‌های سنسورها و ماژول‌ها ← · همه‌ی مقاله‌ها