تعلم الوحدات · الدرس 2.17
وحدة اكتشاف مستوى الماء (Water Level Detection Sensor Module)
العودة إلى الدروسمبدأ الحساس
ستتعلم استخدام حساس عمق الماء (Water Level Detection Sensor Module). يضم دائرة تضخيم بترانزستور ومسارات PCB تشبه المشط. تتغير المقاومة بين المسارات بحسب عمق الغمر، فيتحول العمق إلى إشارة كهربائية تقرأها وظيفة ADC في UNO R3.
المكونات المطلوبة
- لوحة أردوينو (ELEGOO UNO R3).
- ثلاثة أسلاك أنثى إلى ذكر (Female to Male DuPont Wires).
- وحدة حساس مستوى الماء (Water Level Detection Sensor Module).

التعرف على الوحدة
يمكن استخدامها لكشف المطر أو مستوى الماء أو تسرب السوائل. تضم موصلًا ومقاومة 1MΩ وخطوط توصيل مكشوفة. تتداخل مسارات أرضية مع مسارات استشعار؛ تسحب مقاومة 1MΩ مسارات الاستشعار إلى HIGH حتى يصل الماء بينها وبين الأرضي.
يمكن استخدام منفذ رقمي للكشف، أو منفذ تناظري لقياس مقدار اتصال الماء بين المسارات. تحول مساحة البلل إلى إشارة تناظرية تستخدم في البرنامج، مثل إنذار مستوى الماء. تتميز باستهلاك قليل وحساسية عالية.
المواصفات: تغذية 5V، تيار أقل من 20mA، واجهة تناظرية، مساحة كشف 40×16mm، حرارة عمل 10–30°C، وإشارة خرج 0–2.4V.
توصيل الدائرة


وصّل + إلى 5V، و- إلى GND، و S إلى أحد A0–A5. يمكن اختيار أي مدخل تناظري بشرط تطابق تعريفه مع البرنامج.
البرنامج والمعاملات المنطقية
افتح ملف البرنامج Water_level.ino من ملفات الدرس في بيئة Arduino IDE. بعد إتمام التوصيلات، وصّل لوحة أردوينو (UNO R3 Board) بالحاسوب بكابل توصيل (USB Cable)، ثم اضغط زر Upload (رفع) لنقل البرنامج إلى اللوحة وتشغيله عليها.
إذا تعذر نقل البرنامج إلى اللوحة، فراجع قسم «رفع البرنامج ومعالجة خطأ الاتصال» في الدرس 1.5 «وميض LED وإضافة المكتبات» للتحقق من اتصال USB واختيار نوع اللوحة والمنفذ التسلسلي في بيئة Arduino IDE.
يقارن الشرط value بالقيمة السابقة HistoryValue. إذا تجاوز فرق القراءتين 10 في أي اتجاه، ينسق sprintf() رسالة ADC ثم تطبع Serial.print() الرسالة وتحفظ القراءة الجديدة.
&& و||
يعطي AND المنطقي && نتيجة true فقط إذا كان المعاملان صحيحين. لا تخلطه مع AND البتي &.
يعطي OR المنطقي || نتيجة true إذا كان أحد المعاملين صحيحًا. لا تخلطه مع OR البتي |.
افتح Serial Monitor لمشاهدة البيانات. راجع الدرس 2.4 «المراقب التسلسلي» لمعرفة طريقة فتحه وضبط سرعة الاتصال وقراءة البيانات.

الكود
Water_level/Water_level.ino
//www.elegoo.com
//2016.12.9
int adc_id = 0;
int HistoryValue = 0;
char printBuffer[128];
void setup()
{
Serial.begin(9600);
}
void loop()
{
int value = analogRead(adc_id); // get adc value
/*&& (logical AND) operator truth table
false&&false=false
false&&true=false
true&&false=false
true&&true=true
|| (logical OR) operator truth table
false||false=false
false||true=true
true||false=true
true||true=true
print level when the change is greater than or less than 10。
*/
if(((HistoryValue>=value) && ((HistoryValue - value) > 10)) || ((HistoryValue<value) && ((value - HistoryValue) > 10)))
{
sprintf(printBuffer,"ADC %d level is %d\n",adc_id, value);
//Convert binary numbers "adc_id" and "value" into strings, and store the whole string "ADC "adc_id" level is "value"\n"in C.
Serial.print(printBuffer);
HistoryValue = value;
}
}