مقدمة في Arduino ومنصات إنترنت الأشياء الزراعية
Introduction to Arduino & Agricultural IoT Platforms
نفهم كيف يتحول الحقل إلى بيانات: مكونات نظام IoT الزراعي، بنية Arduino و ESP32، الدوائر الكهربية الأساسية، GPIO و PWM و Serial — ونبني أول محاكي لمضخة ري على Tinkercad ثم على جهاز حقيقي.
نظرة عامة على السيشن
بنهاية السيشن ستكون قادراً على
- تشرح سلسلة Sense → Transmit → Store → Decide → Act في نظام IoT زراعي بأمثلة من المزرعة.
- تفرّق بين Arduino Uno و ESP32 وتختار المناسب لكل استخدام في الحقل.
- تستخدم digitalRead / digitalWrite / analogWrite وتفهم الفرق بين Digital و Analog و PWM.
- تحسب مقاومة الـ LED بقانون أوم وتبني الدائرة على Breadboard بأمان.
- تقرأ وتكتب عبر Serial Monitor وتفهم دورة القراءة/الكتابة (Read/Write cycle).
التطبيق في مزرعة الكلية
جولة في مزرعة الكلية لرسم «خريطة احتياجات»: أين المضخات؟ ما نظام الري (تنقيط / غمر)؟ أين مصادر الكهرباء والواي فاي؟ وتحديد 4 نقاط مرشحة لتركيب عقد الحساسات طوال الكورس.
المُخرج (Deliverable)
دائرة «محاكي مضخة الري» تعمل على Tinkercad وعلى Arduino حقيقي (زر تشغيل/إيقاف + سرعة PWM + مهلة أمان)، وخريطة مبدئية لنقاط القياس في المزرعة.
خطة السيشن (180 دقيقة)
- 0:00 مراجعة تعارف + لماذا الزراعة الذكية؟ مشكلة الري في الدلتا 15 د
- 0:15 شرح نظام IoT الزراعي: من الحساس إلى القرار 30 د
- 0:45 شرح Arduino و ESP32 من الداخل + أساسيات الدوائر 25 د
- 1:10 محاكاة Tinkercad: محاكي مضخة الري 30 د
- 1:40 استراحة استراحة 10 د
- 1:50 تطبيق Lab: الدائرة على Arduino حقيقي + Serial Monitor 35 د
- 2:25 ميداني تطبيق ميداني: جولة المزرعة وخريطة نقاط القياس 25 د
- 2:50 تقييم اختبار سريع + الواجب 10 د
الأدوات والمكونات
قبل السيشن
- إنشاء حساب مجاني على tinkercad.com.
- تثبيت Arduino IDE 2 على اللابتوب.
- لا يلزم أي خبرة برمجية سابقة.
قاموس المصطلحات (Glossary)
أجهزة صغيرة متصلة بالشبكة تقيس وتتحكم بدون تدخل بشري مستمر.
كمبيوتر صغير على شريحة واحدة يشغّل برنامجاً واحداً باستمرار.
General Purpose Input/Output — أطراف نبرمجها كمدخل (زر) أو مخرج (LED/Relay).
قيمتان فقط: HIGH (5V أو 3.3V) أو LOW (0V).
قيمة مستمرة مثل جهد حساس الرطوبة بين 0 و 3.3V.
Pulse Width Modulation — تشغيل وإطفاء سريع لمحاكاة جهد متوسط والتحكم في السرعة/الإضاءة.
نسبة زمن HIGH من الدورة — 50% تعني نصف القدرة تقريباً.
إرسال البيانات بتاً بعد بت بين الـ MCU والكمبيوتر (USB) بسرعة Baud rate.
لوحة توصيل بدون لحام لتجربة الدوائر.
تجعل الطرف HIGH افتراضياً حتى لا «يطفو» — INPUT_PULLUP تفعّل مقاومة داخلية.
مفتاح كهرومغناطيسي يسمح لإشارة صغيرة بالتحكم في مضخة أو مروحة.
الكود الذي نرفعه على المتحكم (Sketch في Arduino).
نظام IoT الزراعي
30 دقيقةفي الدلتا تُستهلك أكثر من 80% من المياه العذبة في الزراعة، ومعظم قرارات الري تتم «بالخبرة والعين»: نروي كل كام يوم بغض النظر عن حالة التربة الفعلية. الزراعة الدقيقة (Precision Agriculture) تقول: قِس أولاً، ثم قرّر.
نظام إنترنت الأشياء الزراعي هو سلسلة من 5 حلقات — وطوال الـ 22 سيشن سنبني كل حلقة منها بأيدينا داخل مزرعة الكلية:
-
Sense — القياس
حساسات في التربة والهواء: رطوبة التربة (Soil moisture)، الحرارة والرطوبة (DHT22)، الإضاءة (LDR). السيشنات 1-4
-
Transmit — الإرسال
العقدة (Node) ترسل القراءات لاسلكياً عبر Wi-Fi أو ESP-NOW أو LoRa. السيشنات 5-8
-
Store — التخزين
سيرفر محلي (لابتوب أو Raspberry Pi) يستقبل ويخزن البيانات كسلسلة زمنية (Time-series). السيشنات 8-10
-
Decide — القرار
لوحة تحكم + قواعد + نموذج ذكاء اصطناعي يتوقع: هل يحتاج الحقل ري خلال 24 ساعة؟ السيشنات 11-17
-
Act — التنفيذ
Relay يشغل المضخة أو مروحة الصوبة تلقائياً أو بأمر من المتصفح، مع تنبيه Telegram. السيشنات 12، 18
| المشكلة في الحقل | ماذا نقيس؟ | القرار / الفعل |
|---|---|---|
| ري زائد في حقل الخضر يسبب عفن الجذور | رطوبة التربة كل 15 دقيقة | إيقاف الري عند الاقتراب من السعة الحقلية (Field capacity) |
| ارتفاع الرطوبة ليلاً في الصوبة | رطوبة وحرارة الهواء | تشغيل المروحة عند RH > 90% لتقليل الأمراض الفطرية |
| موجة حر في يونيو | حرارة الهواء + ET0 | ري تكميلي صباحاً + تنبيه للمشرف |
| عطل مضخة لا يُكتشف إلا بعد أيام | تيار المضخة / تغير الرطوبة بعد الري | تنبيه «ري بدون أثر» خلال ساعة |
سؤال للنقاش (3 دقائق)
لو قلنا إن الفلاح يروي «كل 4 أيام» صيفاً، ما الذي يمكن أن يجعل هذا القرار خاطئاً؟ فكّر في: نوع التربة، عمر النبات، الحرارة، الرياح، الأمطار.
منصات IoT الزراعية — أين يقع Arduino؟
هناك منصات تجارية جاهزة (مثل محطات الطقس الذكية وحساسات التربة اللاسلكية)، لكنها مغلقة ومكلفة. في هذا الكورس نبني نظاماً مفتوح المصدر يمكن تعديله لأي محصول: المتحكم (Arduino / ESP32) + بروتوكولات مفتوحة (MQTT / HTTP) + برمجيات مجانية (Python, Flask, SQLite).
Arduino و ESP32 من الداخل
25 دقيقة| الخاصية | Arduino Uno (ATmega328P) | ESP32 DevKit |
|---|---|---|
| المعالج | 8-bit، 16 MHz | 32-bit ثنائي النواة، 240 MHz |
| الذاكرة | 32 KB Flash / 2 KB RAM | 4 MB Flash / 520 KB RAM |
| جهد الأطراف | 5V | 3.3V (لا تدخل 5V على أطرافه!) |
| ADC | 10-bit (0–1023)، 6 أطراف | 12-bit (0–4095)، 18 طرف (استخدم ADC1 مع Wi-Fi) |
| اتصال لاسلكي | لا يوجد | Wi-Fi + Bluetooth + ESP-NOW |
| Deep sleep | محدود | ~10 µA — مناسب للبطارية |
| متى نستخدمه؟ | التعلم، Tinkercad، تحكم محلي بسيط | عقدة حقلية ترسل البيانات |
الدائرة الكهربية في 3 قوانين
قانون أوم (Ohm’s law): V = I × R. الـ LED الأحمر يحتاج ~2V وتيار ~20 mA. من طرف Uno (5V) نحتاج مقاومة: R = (5 − 2) / 0.02 = 150Ω ⇒ نستخدم أقرب قيمة أعلى متاحة 220Ω للأمان.
المسار المغلق: التيار يحتاج دائماً طريق عودة إلى GND — أشهر خطأ للمبتدئين هو نسيان توصيل الأرضي.
التيار من الطرف محدود: طرف Arduino يعطي حتى ~20 mA بأمان. المضخة تحتاج أمبيرات ⇒ لا نوصلها مباشرة أبداً، بل عبر Relay أو MOSFET.
يجعل الطرف 5V/3.3V — تشغيل LED أو Relay.
يعيد HIGH أو LOW — حالة زر أو حساس عتبة.
يحول الجهد لرقم: 0–1023 (Uno) أو 0–4095 (ESP32).
على أطراف ~ فقط في Uno (3، 5، 6، 9، 10، 11).
// setup() runs once at power-on, loop() runs forever
const int STATUS_LED = 13; // built-in LED on Arduino Uno
void setup() {
pinMode(STATUS_LED, OUTPUT); // configure the GPIO as an output
Serial.begin(9600); // open the serial port (USB) at 9600 baud
Serial.println("Node booted");
}
void loop() {
digitalWrite(STATUS_LED, HIGH); // "node alive" heartbeat
delay(200);
digitalWrite(STATUS_LED, LOW);
delay(1800); // one blink every 2 s
}
كل عقدة حقلية في الكورس سيكون لها «نبضة حياة» (Heartbeat) مثل هذه — ستتطور لاحقاً إلى رسالة Health عبر MQTT في السيشن 20.
قاعدة أمان ذهبية
في هذا الكورس لا يتعامل الطلاب مع كهرباء 220V إطلاقاً. المضخات في المعمل 5–12V DC، ومضخة المزرعة الحقيقية يوصلها فني كهرباء المزرعة عبر Relay معزول وقاطع أرضي (RCD).
Tinkercad: محاكي مضخة الري
30 دقيقةمحاكي مضخة الري — زر تشغيل + سرعة PWM + مهلة أمان
30 دقيقةنحاكي لوحة تحكم مضخة: الـ LED الأخضر = المضخة (سطوعه = السرعة)، الـ LED الأحمر = إنذار. نضغط الزر للتشغيل/الإيقاف، والـ Potentiometer يحدد السرعة، وبعد 10 ثوانٍ تتوقف المضخة تلقائياً (Safety timeout).
المكونات (Components)
- Arduino Uno R3
- Breadboard Small
- LED أخضر + LED أحمر
- 2 × Resistor 220Ω
- Pushbutton
- Potentiometer 10kΩ
- Wires
التوصيل (Wiring)
| من | إلى | ملاحظة |
|---|---|---|
| D9 (~PWM) | 220Ω → LED أخضر (+) | الـ Cathode (-) إلى GND |
| D12 | 220Ω → LED أحمر (+) | إنذار |
| D2 | Pushbutton (طرف) | الطرف المقابل إلى GND — INPUT_PULLUP |
| A0 | Potentiometer (Wiper الأوسط) | الطرفان إلى 5V و GND |
| 5V / GND | شريط الـ Breadboard | + و − |
من Tinkercad: Create → Circuit، واسحب Arduino Uno و Breadboard.
ابنِ التوصيلات حسب الجدول — لوّن أسلاك 5V بالأحمر و GND بالأسود (عادة احترافية).
افتح Code → Text والصق الكود، ثم Start Simulation.
افتح Serial Monitor أسفل نافذة الكود وراقب حالة المضخة ونسبة السرعة كل ثانية.
لف الـ Potentiometer أثناء التشغيل ولاحظ تغير السطوع (PWM) — ثم انتظر 10 ثوانٍ لترى مهلة الأمان.
/*
Session 1 — Simple irrigation pump simulation (Arduino Uno — works in Tinkercad Circuits)
Parts : green LED (pump running) on D9 (PWM) + 220Ω, red LED (tank empty) on D12 + 220Ω,
push button on D2 (INPUT_PULLUP, other leg to GND), potentiometer on A0 (pump speed)
Concepts: GPIO (digitalRead / digitalWrite), PWM (analogWrite 0-255), Serial Communication
*/
const int PUMP_LED = 9; // PWM pin (~)
const int ALARM_LED = 12;
const int BUTTON = 2;
const int SPEED_POT = A0;
bool pumpOn = false;
bool lastButton = HIGH;
unsigned long startedAt = 0;
const unsigned long MAX_RUN_MS = 10000; // safety: stop the pump after 10 s in the simulation
void setup() {
pinMode(PUMP_LED, OUTPUT);
pinMode(ALARM_LED, OUTPUT);
pinMode(BUTTON, INPUT_PULLUP); // pressed = LOW
Serial.begin(9600);
Serial.println(F("KFS farm pump simulator ready. Press the button to start/stop irrigation."));
}
void loop() {
bool now = digitalRead(BUTTON);
if (lastButton == HIGH && now == LOW) { // falling edge = one press
pumpOn = !pumpOn;
startedAt = millis();
Serial.println(pumpOn ? F("Pump ON") : F("Pump OFF"));
delay(30); // debounce
}
lastButton = now;
if (pumpOn && millis() - startedAt > MAX_RUN_MS) {
pumpOn = false;
digitalWrite(ALARM_LED, HIGH); // timeout -> alarm LED (e.g. tank empty / pipe blocked)
Serial.println(F("Safety timeout! Pump stopped."));
}
int pot = analogRead(SPEED_POT); // 0..1023
int duty = map(pot, 0, 1023, 0, 255); // 0..255 (PWM duty cycle)
analogWrite(PUMP_LED, pumpOn ? duty : 0);
if (!pumpOn && digitalRead(BUTTON) == LOW) digitalWrite(ALARM_LED, LOW);
static unsigned long lastPrint = 0;
if (millis() - lastPrint > 1000) {
lastPrint = millis();
Serial.print(F("pump=")); Serial.print(pumpOn);
Serial.print(F(" speed%=")); Serial.println(duty * 100 / 255);
}
}
لماذا INPUT_PULLUP؟
بدونها يكون الطرف D2 «عائماً» (Floating) ويقرأ HIGH و LOW عشوائياً بسبب التشويش الكهربي — وفي الحقل قد يعني ذلك تشغيل المضخة بدون سبب! المقاومة الداخلية تجعله HIGH دائماً، والضغط يوصله بـ GND فيصبح LOW.
وضع «ري تلقائي» بالـ Potentiometer كحساس تربة
أضف زراً ثانياً على D3 يبدّل بين الوضع اليدوي والوضع التلقائي. في الوضع التلقائي اعتبر الـ Potentiometer «حساس رطوبة تربة»: إذا كانت القيمة أقل من 300 (تربة جافة) شغّل المضخة بسرعة 100%، وإذا زادت عن 600 أوقفها. ما الذي يحدث بين 300 و 600؟
تلميح (Hint)
المنطقة بين العتبتين تسمى Hysteresis (منطقة ميتة): لا نغير الحالة فيها، حتى لا تشتغل المضخة وتطفي كل ثانية عند قيمة حدّية.
الحل (Solution)
// inside loop(), when autoMode == true
int soil = analogRead(A0); // pretend: 0 = dry ... 1023 = wet
if (soil < 300) pumpOn = true; // dry -> start irrigation
else if (soil > 600) pumpOn = false; // wet -> stop
// 300..600: keep the previous state (hysteresis band)
analogWrite(PUMP_LED, pumpOn ? 255 : 0);
Lab على الجهاز الحقيقي
35 دقيقةمن المحاكاة إلى Arduino حقيقي + Serial Monitor
الهدف: تشغيل نفس الكود على Arduino Uno حقيقي (أو ESP32)، وفهم دورة القراءة/الكتابة عبر Serial.
- تثبيت البيئة
في Arduino IDE:
Tools → Board → Arduino UnoثمTools → Port(COMx في ويندوز). - نقل الدائرة
ابنِ نفس دائرة Tinkercad على الـ Breadboard الحقيقي — افصل USB أثناء التوصيل.
- الرفع
الصق الكود واضغط Upload (→). لو ظهر خطأ
port busyأغلق أي Serial Monitor مفتوح. - Serial Monitor
اضبط السرعة على 9600 baud (نفس Serial.begin). لو ظهرت رموز غريبة فالسرعة غير متطابقة.
- دورة القراءة/الكتابة
أضف في loop:
if (Serial.available()) { char c = Serial.read(); if (c=='1') pumpOn=true; if (c=='0') pumpOn=false; }— الآن تتحكم في «المضخة» من الكمبيوتر! هذا هو أصل التحكم عن بعد الذي سنبنيه على الويب في السيشن 12. - لمن معه ESP32
نفس الكود يعمل مع تغيير الأطراف (مثلاً LED على GPIO 25، الزر على GPIO 14) و
Serial.begin(115200). في ESP32 core 3.x تعملanalogWriteمباشرة.
النتيجة المتوقعة: كتابة 1 في Serial Monitor تشغل الـ LED الأخضر و 0 تطفئه، والزر ما زال يعمل.
| العَرَض | السبب المحتمل | الحل |
|---|---|---|
| الـ LED لا يضيء | معكوس القطبية أو بدون GND | الطرف الطويل (+) ناحية الطرف، والقصير ناحية GND |
| الزر يعطي قراءات عشوائية | طرف عائم | استخدم INPUT_PULLUP |
| Upload failed | Port خطأ / كابل شحن فقط | جرّب كابل بيانات آخر وتأكد من Port |
| ESP32 يعيد التشغيل باستمرار | المضخة تسحب تيار من الـ USB | مصدر منفصل للمضخة + GND مشترك |
تطبيق ميداني: خريطة المزرعة
25 دقيقةجولة استكشافية: أين سنضع عقد الحساسات؟
مزرعة كلية الزراعة — الصوبة التجريبية + حقل الخضر + حقل الذرة + غرفة المضخات
- نظام الري
حدد نوع الري في كل قطعة (تنقيط / رش / غمر)، ومن أين يأتي الماء، ومن يقرر موعد الري حالياً.
- مصادر الطاقة والشبكة
أين أقرب مقبس كهرباء آمن؟ هل يصل الواي فاي؟ (افتح هاتفك وسجل قوة الإشارة بالأشرطة) — سنقيسها بدقة في السيشن 5.
- نقاط القياس
اختر 4 نقاط: داخل الصوبة، حقل الخضر، حقل الذرة، نقطة مرجعية مكشوفة. سجّل إحداثيات GPS من Google Maps (اضغط مطولاً على موقعك).
- الحساسية الزراعية
اسأل مشرف المزرعة: ما المحصول؟ عمره؟ أكثر مشكلة تواجهه (ري زائد/ناقص، أمراض، حرارة)؟
| النقطة | GPS (Lat, Lon) | المحصول | نظام الري | كهرباء؟ | إشارة Wi-Fi | ملاحظات |
|---|---|---|---|---|---|---|
- لا تلمس لوحات الكهرباء أو المضخات.
- ارتدِ حذاءً مغلقاً — قنوات الري والأرض الطينية زلقة.
- لا تدخل الصوبة بدون إذن المشرف (بروتوكولات منع العدوى).
نقاش بعد الجولة
أي نقطة تتوقع أن تكون الأكثر جفافاً؟ ولماذا؟ (سنتأكد بالبيانات في السيشن 13).
لو عقدة الحقل البعيد لا يصلها الواي فاي — ما الحلول الممكنة؟ (تمهيد للسيشن 5).
ما القرار الزراعي الوحيد الذي لو أتمتناه سيوفر أكبر قدر من المياه؟
اختبر فهمك
6 أسئلة · نتيجة فوريةالواجب والتسليم
الواجب الأسبوعي (Weekly Assignment)
أكمل «تحدي 1» (الوضع التلقائي مع Hysteresis) على Tinkercad وشارك رابط الدائرة (Share → Invite link).
املأ ورقة نقاط القياس للأربع نقاط وارفعها كصورة أو جدول على مستودع الفريق.
اكتب فقرة (5 أسطر) عن قرار ري واحد في مزرعة الكلية يمكن أتمتته، وما البيانات اللازمة له.
قائمة التسليم (Submission Checklist)
مراجع ومصادر
استعد للسيشن القادمة
السيشن القادمة نقيس المناخ الدقيق داخل الصوبة: أحضر حساس DHT22 وحساس رطوبة التربة السعوي و LDR، وجهاز Multimeter لكل فريق.