راه اندازی سنسور تشخیص سطح آب | آیا تا کنون با انفجار یک آبگرمکن مواجه شدهاید؟؟ یا سعی کردهاید الکترونیکهای زیرآبی بسازید، میدانید که تشخیص وجود آب چقدر مهم است.
دقیقاً همین ویژگی حسگر سطح آب به شما این امکان را میدهد! این حسگر میتواند سطح آب را اندازهگیری کند، یک چاه تخلیه را زیر نظر داشته باشد، بارش باران را تشخیص دهد و نشتیها را شناسایی کند.
در ادامه با آموزشگاه رباتیک ایران همراه باشید.
آموزش راه اندازی سنسور تشخیص سطح آب با آردوینو
بیایید با جزئیات بیشتری به این حسگر نگاهی بیاندازیم.
مروری بر سختافزار حسگر سطح آب
این حسگر دارای ده خط مسی نمایان است، که پنج خط آن برای تغذیه و پنج خط دیگر برای حسگری طراحی شدهاند. این خطوط به صورتی در هم تنیده شدهاند که بین هر دو خط تغذیه، یک خط حسگری قرار دارد.
به طور معمول، خطوط تغذیه و حسگر به هم متصل نیستند، اما زمانی که در آب غوطهور شوند، این دو به هم وصل میشوند.
یک LED تغذیه بر روی برد وجود دارد که وقتی برد روشن میشود، روشن میگردد.
حسگر سطح آب چگونه کار میکند؟
عملکرد حسگر سطح آب نسبتاً ساده است.
خطوط تغذیه و حسگر یک مقاومت متغیر (مانند پتانسیومتر) را تشکیل میدهند که مقاومت آن بسته به مقدار آبی که به آنها فشار میآورد، تغییر میکند.
این مقاومت به صورت معکوس با عمق غوطهوری حسگر در آب تغییر میکند:
- هرچه حسگر بیشتر در آب غوطهور شود، هدایت الکتریکی بهتر و مقاومت کمتر خواهد بود.
- هرچه حسگر کمتر در آب غوطهور شود، هدایت الکتریکی ضعیفتر و مقاومت بیشتر خواهد بود.
- این حسگر یک ولتاژ خروجی تولید میکند که با مقاومت متناسب است؛ با اندازهگیری این ولتاژ، میتوان سطح آب را تعیین کرد.
پیناوت حسگر سطح آب
حسگر سطح آب استفاده از آن بسیار ساده است و تنها به سه پین برای اتصال نیاز دارد.
S (سیگنال) یک پین خروجی آنالوگ است که به یکی از ورودیهای آنالوگ آردوینو شما متصل خواهد شد.
پین + (VCC) به حسگر تغذیه میدهد. توصیه میشود که حسگر با ولتاژ ۳.۳ ولت تا ۵ ولت روشن شود. لطفاً به خاطر داشته باشید که خروجی آنالوگ بسته به ولتاژی که به حسگر میدهیم، متغیر خواهد بود.
– (GND) پین زمین است.
راه اندازی سنسور تشخیص سطح آب با آردوینو
بیایید حسگر سطح آب را به آردوینو متصل کنیم.
برای شروع، پین + (VCC) ماژول را به ۵ ولت آردوینو و پین – (GND) را به زمین متصل کنید.
یکی از مشکلات شناخته شده با این حسگرها این است که عمر کمتری دارند زیرا به طور مداوم در معرض رطوبت هستند. علاوه بر این، تأمین مداوم برق به حسگر در حین غوطهوری در آب به طور قابل توجهی سرعت خوردگی را افزایش میدهد.
برای جلوگیری از این مشکل، توصیه میشود که حسگر تنها در زمان خواندن روشن شود.
یک راه آسان برای انجام این کار این است که پین تغذیه حسگر را به یک پین دیجیتال در آردوینو متصل کنید و آن را به صورت HIGH یا LOW تنظیم کنید. بنابراین، ما پین + (VCC) را به پین دیجیتال شماره ۷ آردوینو متصل میکنیم.
در نهایت، پین S (سیگنال) را به پین ADC A0 آردوینو متصل کنید.
نقشه اتصالات در تصویر زیر نشان داده شده است.
مثال پایه آردوینو
پس از ساخت مدار، کد زیر را در آردوینو خود بارگذاری کنید.
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ ۱۹ ۲۰ ۲۱ ۲۲ ۲۳ ۲۴ ۲۵ ۲۶ ۲۷ ۲۸ ۲۹ ۳۰ ۳۱ ۳۲ ۳۳ ۳۴ |
// Sensor pins #define sensorPower 7 #define sensorPin A0 // Value for storing water level int val = ۰; void setup() { // Set D7 as an OUTPUT pinMode(sensorPower, OUTPUT); // Set to LOW so no power flows through the sensor digitalWrite(sensorPower, LOW); Serial.begin(۹۶۰۰); } void loop() { //get the reading from the function below and print it int level = readSensor(); Serial.print("Water level: "); Serial.println(level); delay(۱۰۰۰); } //This is a function used to get the reading int readSensor() { digitalWrite(sensorPower, HIGH); // Turn the sensor ON delay(۱۰); // wait 10 milliseconds val = analogRead(sensorPin); // Read the analog value form sensor digitalWrite(sensorPower, LOW); // Turn the sensor OFF return val; // send current reading |
پس از بارگذاری کد، پنجره مانیتور سریال را باز کنید تا خروجی را مشاهده کنید. زمانی که حسگر خشک است، مقدار ۰ را خروجی میدهد؛ اما با غوطهوری حسگر در آب، خروجی به تدریج افزایش مییابد.
این حسگر برای غوطهور شدن کامل طراحی نشده است. بنابراین، هنگام نصب آن، اطمینان حاصل کنید که تنها قسمتهای نمایان روی PCB با آب در تماس باشند.
توضیحات کد:
کد با اعلام پینهای آردوینو که به پینهای + (VCC) و S (سیگنال) حسگر متصل هستند، آغاز میشود.
۱ ۲ |
#define sensorPower 7 #define sensorPin A0 |
پس از آن، یک متغیر به نام val تعریف میکنیم تا سطح آب جاری را ذخیره کند.
۱ |
int val = ۰; |
در بخش Setup، ابتدا اتصال تغذیه حسگر را به عنوان یک خروجی تنظیم میکنیم، سپس آن را پایین میآوریم تا حسگر در ابتدا خاموش بماند. همچنین ارتباط سریال را برقرار میکنیم.
۱ ۲ ۳ |
pinMode(sensorPower, OUTPUT); digitalWrite(sensorPower, LOW); Serial.begin(۹۶۰۰); |
در بخش loop، تابع سفارشی readSensor() را هر یک ثانیه یک بار فراخوانی کرده و نتیجه را چاپ میکنیم.
۱ ۲ ۳ |
Serial.print("Water level: "); Serial.println(readSensor()); delay(۱۰۰۰); |
تابع سفارشی readSensor() به سادگی حسگر را روشن میکند، ۱۰ میلیثانیه منتظر میماند، مقدار آنالوگ را از حسگر میخواند، آن را خاموش میکند و مقدار آنالوگ را بازمیگرداند.
۱ ۲ ۳ ۴ ۵ ۶ ۷ |
int readSensor() { digitalWrite(sensorPower, HIGH); delay(۱۰); val = analogRead(sensorPin); digitalWrite(sensorPower, LOW); return val; } |
یافتن مقادیر آستانه
برای تخمین سطح آب، مقادیر خروجی حسگر خود را زمانی که حسگر کاملاً خشک است، بخشی غوطهور است و کاملاً غوطهور در آب است، ضبط کنید.
به سادگی کد فوق را اجرا کنید و خوانشهای خود را بگیرید.
به یاد داشته باشید که حسگر شما بسته به نوع آبی که استفاده میکنید ممکن است حساسیت بیشتری یا کمتری داشته باشد. همانطور که میدانید، آب خالص رسانا نیست؛ این مواد معدنی و ناخالصیهای موجود در آب هستند که آن را رسانا میکنند.
زمانی که کد را اجرا میکنید، باید خوانشهایی مشابه موارد زیر ببینید:
– زمانی که حسگر خشک است (۰)
– هنگامی که حسگر به طور جزئی در آب غوطهور است (~۴۲۰)
– هنگامی که حسگر کاملاً در آب غوطهور است (~۵۲۰)
این آزمایش ممکن است نیاز به آزمون و خطا داشته باشد. هنگامی که خوانشهای خود را داشته باشید، میتوانید از آنها به عنوان آستانهای برای ایجاد یک اقدام استفاده کنید.
پروژه آردوینو – تشخیص سطح آب
در مثال بعدی، ما یک نشانگر سطح آب ساده خواهیم ساخت که LEDها را بر اساس سطح آب روشن میکند.
سیمکشی:
ما مدار مثال قبلی را دوباره استفاده خواهیم کرد. این بار فقط نیاز به افزودن برخی از LEDها داریم.
سه LED را به پینهای دیجیتال ۲، ۳ و ۴ با استفاده از مقاومتهای ۲۲۰ اهمی متصل کنید.
مدار خود را به شکل زیر متصل کنید:
کد آردوینو
پس از ساخت مدار، اسکیچ زیر را به آردوینو خود بارگذاری کنید.
این اسکیچ دو متغیر به نامهای `lowerThreshold` و `upperThreshold` را تعریف میکند. این متغیرها نمایانگر آستانههای ما هستند.
اگر خروجی زیر آستانه پایین (lower threshold) بیفتد، LED قرمز روشن خواهد شد؛ اگر بالای آستانه بالا (upper threshold) برود، LED سبز روشن خواهد شد و اگر در جایی بین این دو باشد، LED زرد روشن خواهد شد.
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ ۱۹ ۲۰ ۲۱ ۲۲ ۲۳ ۲۴ ۲۵ ۲۶ ۲۷ ۲۸ ۲۹ ۳۰ ۳۱ ۳۲ ۳۳ ۳۴ ۳۵ ۳۶ ۳۷ ۳۸ ۳۹ ۴۰ ۴۱ ۴۲ ۴۳ ۴۴ ۴۵ ۴۶ ۴۷ ۴۸ ۴۹ ۵۰ ۵۱ ۵۲ ۵۳ ۵۴ ۵۵ ۵۶ ۵۷ ۵۸ |
/* Change these values based on your calibration values */ int lowerThreshold = ۴۲۰; int upperThreshold = ۵۲۰; // Sensor pins #define sensorPower 7 #define sensorPin A0 // Value for storing water level int val = ۰; // Declare pins to which LEDs are connected int redLED = ۲; int yellowLED = ۳; int greenLED = ۴; void setup() { Serial.begin(۹۶۰۰); pinMode(sensorPower, OUTPUT); digitalWrite(sensorPower, LOW); // Set LED pins as an OUTPUT pinMode(redLED, OUTPUT); pinMode(yellowLED, OUTPUT); pinMode(greenLED, OUTPUT); // Initially turn off all LEDs digitalWrite(redLED, LOW); digitalWrite(yellowLED, LOW); digitalWrite(greenLED, LOW); } void loop() { int level = readSensor(); if (level == ۰) { Serial.println("Water Level: Empty"); digitalWrite(redLED, LOW); digitalWrite(yellowLED, LOW); digitalWrite(greenLED, LOW); } else if (level > ۰ && level <= lowerThreshold) { Serial.println("Water Level: Low"); digitalWrite(redLED, HIGH); digitalWrite(yellowLED, LOW); digitalWrite(greenLED, LOW); } else if (level > lowerThreshold && level <= upperThreshold) { Serial.println("Water Level: Medium"); digitalWrite(redLED, LOW); digitalWrite(yellowLED, HIGH); digitalWrite(greenLED, LOW); } else if (level > upperThreshold) { Serial.println("Water Level: High"); digitalWrite(redLED, LOW); digitalWrite(yellowLED, LOW); digitalWrite(greenLED, HIGH); } delay(۱۰۰۰); } //This is a function used to get the reading int readSensor() { digitalWrite(sensorPower, HIGH); delay(۱۰); val = analogRead(sensorPin); digitalWrite(sensorPower, LOW); return val; } |
شعبه بابل: پل کارگر به سمت کشوری، روبروی ماکروویو، جنب فروشگاه جانبو
شعبه ساری: خیابان مهدیه، نبش بهمن شرقی