Menu
CoddyTech
flag Ar iconالعربيةdown icon

مراقبة النبات: التقرير

جزء من قسم المشاريع في رحلة Arduino على Coddy. الدرس 20 من 24.

تكتب الخطوة الأخيرة تقريرًا مرة كل ثانية: الرطوبة وكلمة حالة، DRY أو OK أو WET. يظهر التقرير على شاشة LCD لمن يقف بجوار النبتة، وعلى شاشة Serial monitor للكمبيوتر.

توصَّل شاشة LCD بالطريقة المعتادة: LiquidCrystal lcd(12, 11, 5, 4, 3, 2); وlcd.begin(16, 2) في setup(). يعرض الصف العلوي Moisture: 42%، ويعرض الصف السفلي الكلمة.

في شاشة Serial monitor، تأتي الكلمة في نهاية السطر نفسه الذي تظهر فيه الرطوبة، لذا اطبع الرطوبة باستخدام Serial.print()، وليس println(). ثم اختر الكلمة وفق النطاقات الثلاثة لضوء الحالة واطبعها على كلتا الشاشتين:

if (moisture < 30) {
  lcd.print("DRY");
  Serial.println("DRY");
} else if (moisture <= 70) {
  lcd.print("OK ");
  Serial.println("OK");
} else {
  lcd.print("WET");
  Serial.println("WET");
}

انتبه إلى الأحرف القديمة. كلمة OK أقصر من DRY، لذا اطبع "OK " مع مسافة، وإلا فستعرض الشاشة OKY. وينطبق الأمر نفسه عندما تتحول 100% إلى 5%: اطبع مسافتين بعد %.

challenge icon

التحدي

متوسط

اعرض التقرير مرة واحدة كل ثانية:

  • إعداد شاشة LCD (الأطراف 12، 11، 5، 4، 3، 2) في setup()
  • الصف العلوي: Moisture: 42%، مع مسافات بعده
  • الصف السفلي: DRY عندما تكون النسبة أقل من 30%، وOK من 30% إلى 70%، وWET عندما تزيد على 70%، مع حشو بمسافات
  • الشاشة التسلسلية: سطر واحد مثل Moisture: 42% OK

أبقِ ضوء الحالة والمنبّه. اضغط Run، ثم Check.

جرّب بنفسك

// يحلّ المقبض محلّ مستشعر رطوبة التربة
const int sensorPin = A0;
// مؤشر الحالة الضوئي: مصباح RGB LED
const int redPin = 9;
const int greenPin = 10;
const int bluePin = 6;
// الإنذار
const int buzzerPin = 8;

bool wasDry = false;         // هل كانت التربة جافة عند آخر قراءة؟
unsigned long dryStart = 0;  // وقت جفافها

// الرطوبة بالنسبة المئوية: 0 تعني جفافًا تامًا، و100 تعني بللًا شديدًا.
int readMoisture() {
  int reading = analogRead(sensorPin);
  return map(reading, 0, 1023, 0, 100);
}

// أحمر عند الجفاف، وأخضر عندما تكون الرطوبة مناسبة، وأزرق عند البلل.
void showStatus(int moisture) {
  digitalWrite(redPin, LOW);
  digitalWrite(greenPin, LOW);
  digitalWrite(bluePin, LOW);
  if (moisture < 30) {
    digitalWrite(redPin, HIGH);
  } else if (moisture <= 70) {
    digitalWrite(greenPin, HIGH);
  } else {
    digitalWrite(bluePin, HIGH);
  }
}

// أصدر صفيرًا مرة كل ثانية إذا ظلت التربة جافة لأكثر من 5 ثوانٍ.
void checkAlarm(int moisture) {
  if (moisture < 30) {
    if (wasDry == false) {
      wasDry = true;
      dryStart = millis();
    }
    if (millis() - dryStart > 5000) {
      tone(buzzerPin, 880, 200);
    }
  } else {
    wasDry = false;
  }
}

void setup() {
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int moisture = readMoisture();
  Serial.print("Moisture: ");
  Serial.print(moisture);
  Serial.println("%");
  showStatus(moisture);
  checkAlarm(moisture);
  delay(1000);
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المشاريع

تدرّب بنفسك: Playground لـ Arduino