مقدمه
سنسورها و روشهای متفاوتی برای تعیین عمق آب، تشخیص بارندگی، نشتی آب، خالی و یا سرریز شدن یک مخزن و… وجود دارد. یکی از ساده ترین و ارزانترین روشها استفاده از سنسور تشخیص سطح آب است که در این مقاله به آن میپردازیم.
از دیگر نامهای متداول این سنسور: سنسور باران، سنسور تعیین سطح آب، سنسور رطوبت، سنسور نشتی آب.
آنچه در این آموزش یاد میگیرید
- اصول کار سنسور و نحوه تست آن
- راهاندازی سنسور تشخیص سطح آب/رطوبت با آردوینو و نمایش اطلاعات روی کامپیوتر
- تعیین سطح مخزن آب، تشخیص نشتی و باران بوسیله سنسور و آردوینو
- استفاده از سنسور تشخیص سطح آب بدون استفاده از آردوینو
سنسور تشخیص سطح آب چگونه کار می کند؟
به بیان ساده، این سنسور یک خروجی ولتاژ تولید می کند که متناسب است با عمق آبی که در آن فرورفته.
این سنسور شامل 10 نوار مسی موازیست که 5 تای آنها خطوط منبع ولتاژ و 5 تای دیگر خطوط سیگنال هستند. این دو دسته نوار، یکی در میان، روی صفحهی سنسور قرار داده شدهاند. این دو دسته، در حالت عادی، اتصالی با یکدیگر ندارند، تا زمانیکه یک مایع رسانا روی سطح نوارهای سنسور قرار گیرد. یعنی در حالت خشک و بدون رطوبت، مقاومت بین این خطوط بسیار زیاد بوده و در نتیجه ولتاژ نوارهای مربوط به سیگنال صفر است. حال هرچه صفحۀ شامل نوارها بیشتر در مایع فرو رود رسانایی بین دو دسته نوار قویتر، مقاومت بین خطوط کمتر و ولتاژ نوارهای سیگنال به ولتاژ پایه + نزدیکتر می شود. یعنی هرچه عمق بیشتر، ولتاژ پایه سیگنال بیشتر (البته در محدوده ولتاژ منبع).
اگر شکل زیر را یک مدلسازی ساده از طرز کار سنسور باران در نظر بگیریم: هرچه نوارهای روی سنسور بیشتر در آب فرو رود، طول مقاومت بین پایه + و پایه S کمتر شده، در نتیجه ولتاژ پایه S (Vs) به ولتاژ منبع (Vcc) نزدیکتر میشود و برعکس.
با توجه به اصول کار گفته شده، نه تنها عمق مایع بلکه میزان رسانایی مایع نیز در مقدار ولتاژ خروجی موثر است. وجود قطرههای آب نیز به تنهایی کافیست تا میزان رسانایی خوبی بین نوارها ایجاد شده و ولتاژ پایه S افزایش یابد.
پایههای (Pinout) سنسور تشخیص سطح آب
- -: پایه زمین
- +: تغذیه ماژول (2 تا 5 ولت)
- S: خروجی ماژول به صورت ولتاژ آنالوگ
لوازمی که به آن احتیاج دارید
قطعات مورد نیاز
*: سنسور تشخیص سطح آب از 3 برند و کیفیت متفاوت قرار داده شده است. هرچند که اصول کار آنها یکیست.
**: برای راهاندازی سنسورتشخیص سطح آب، تنها 3 مورد اول الزامیست. بقیه قطعات در پروژههای دیگر که در ادامه میآید استفاده میشود.
نرم افزارهای مورد نیاز
تست ساده سنسور تشخیص سطح آب
بیایید ابتدا، بدون پیچیده کردن کار، سنسورمان را به سادگی تست کنیم و ببینیم چگونه کار میکند.
پایه مثبت سنسور را به مثبت منبع ولتاژ و پایه منفی سنسور را به GND منبع ولتاژ متصل نمایید (میتوانید از خروجی ولتاژ برد آردوینو به عنوان منبع تغذیه استفاده کنید).
حال مولتیمتر را در حالت اندازهگیری ولتاژ DC قرار داده و ولتاژ پایه S سنسور را نسبت به GND اندازهگیری کنید (طبیعتا در حالت خشک باید صفر یا عددی نزدیک به صفر باشد). حال به آرامی سنسور را داخل لیوان آب قرار داده و در چند عمق مختلف، ولتاژ پایه S را دوباره بخوانید (اگر سنسور شما سالم باشد باید متناسب با عمق، ولتاژ بیشتری را نشان دهد).
راه اندازی سنسور تشخیص سطح آب با آردوینو
سیمبندی
ولتاژ پایه S یک ولتاژ آنالوگ است که باید با ورودیهای آنالوگ برد آردوینو خوانده شود؛ یعنی یکی از پینهای A0 تا A5 در Arduino UNO. ما در اینجا از پین A0 استفاده کردیم.
کد
برای راهاندازی سنسور با آردوینو، نیاز به کتابخانه خاصی نیست. کد زیر را در نرم افزار Arduino IDE کپی و روی برد آپلود کنید.
/* Water level sensor
* by Ali Akbar
* https://electropeak.com/learn/
*/
#define sensorPin A0 // define pin A0 as sensorPin
int sensorValue = 0; // Value for storing water level
void setup() {
Serial.begin(9600);
}
void loop() {
sensorValue = analogRead(sensorPin); // reading pin A0 and store to sensorValue
Serial.print("Sensor = " );
Serial.println(sensorValue);
delay(2000);
}
#define sensorPin A0
: از آنجایی که پین A0 را در برنامه نامگذاری کردیم از این به بعد به جای A0 کافیست نام آن را صدا کنیم. این کار کدنویسی های پیچیده را برای ما منظمتر و قابل فهمتر میسازد.
int sensorValue = 0;
: یک متغیر عددی از جنس int برای ذخیرهسازی اطلاعات خوانده شده از سنسور ساختیم و مقدار اولیه آن را 0 کردیم.
void setup() { Serial.begin(9600); }
: در بخش setup(){}، دستورهایی را که باید تنها یک بار در آغاز اجرا شود، قرار میدهیم. در این جا با دستور Serial .begin(9600);
ارتباط سریال با نرخ انتقال 9600 را فعال میسازیم. این کار برای ارتباط بین برد آردوینو و کامپیوتر میباشد تا آردوینو بتواند بوسیله آن، اطلاعات را در پورت سریال کامپیوتر نمایش دهد.
void lopp() { }
: در این بخش دستوراتی را که مدام باید فراخوانی و بروزرسانی شوند مینویسم.
sensorValue = analogRead(sensorPin);
: با دستور analogRead
مقدار آنالوگ پین A0 را خوانده و در متغیر sensorValue ذخیره میکنیم.
Serial.print("Sensor = " );
Serial.println(sensorValue);
ابتدا کلمه sensor=
عینا در پنجره سریال نوشته شده و سپس مقدار متغیر sensorValue نشان داده میشود و به خط بعد میرود.
delay(1000);
: با تاخیر یک ثانیهای، دوباره دستورات حلقه loop() اجرا میشوند.
سنسور را در عمقهای مختلف قرار دهید و از پنجره Serial Monitor، تغییرات را مشاهده کنید.
سعی کنید اعداد نشان داده شده در چند عمق مشخص را یادداشت کنید مخصوصا در بیشترین عمق. عدد اندازهگیریشده ما در اینجا 691 است.
از آنجا که جریان مصرفی سنسور تنها 20 میلی آمپر است و تنها در زمان خواندن اطلاعات از سنسور نیاز به روشن بودن آن داریم، می توانیم یکی از پایههای دیجیتال برد آردوینو را برای تغذیه سنسور استفاده کنیم؛ به این صورت که پایه موردنظر را به عنوان خروجی تعریف کرده و با High/Low کردن آن پین سنسور را خاموش و روشن کنیم.
می توان برای استفاده راحتتر از سنسور در مدارها و برنامههای پیچیدهتر، یک تابع برای خواندن اطلاعات سنسور نوشته و در زمان نیاز آن را فراخوانی کرد.
در مثال زیر از اصول بالا استفاده شده است.
مثال: نمایش سطح آب توسط LEDهای رنگی
فرض کنید یک مخزن آب (مثل آکواریوم) داریم که میخواهیم از وضعیت پُر بودن آن مطلع باشیم. میتوان موقعیت سطح آب را به کمک سنسور شناسایی و الایدی مناسب را روشن کرد. ما در اینجا از 3 الایدی سبز، زرد و قرمز برای این کار استفاده میکنیم تا 3 سطح اندازهگیری را به ما نشان بدهد.
سیم بندی
برد را مطابق شکل زیر ببندید.
این بار به جای اتصال مستقیم پایه + سنسور به منبع ولتاژ، آن را به یکی از پایه های دیجیتال آردوینو متصل کردیم تا بتوانیم براحتی سنسور را خاموش و روشن کنیم. با این روش، سنسور دیگر همیشه روشن نخواهد بود.
کد
کد مدار را روی برد خود آپلود کنید.
/* Water level sensor
* by Ali Akbar
* https://electropeak.com/learn/
*/
#define sensorPin A0 // define pin A0 as sensorPin
#define vccPin 2 // define pin 2 as Vcc for sensor
int sensorValue = 0; // Value for storing water level
const int redLED = 3;
const int yellowLED = 4;
const int greenLED = 5;
const int sensorMin = 0; // sensor minimum
const int sensorMax = 700; // sensor maximum
void setup() {
pinMode(vccPin, OUTPUT); // Set D2 as an OUTPUT
digitalWrite(vccPin, LOW); // Set to LOW so no power flows through the sensor
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() {
Serial.begin(9600);
sensorValue = readSensor(); //
int range = map(sensorValue, sensorMin, sensorMax, 0, 3); // 3 levels
switch (range) {
case 0:
digitalWrite(redLED, LOW);
digitalWrite(yellowLED, LOW);
digitalWrite(greenLED, HIGH);
Serial.println("green");
break;
case 1: // Sensor getting wet
digitalWrite(redLED, LOW);
digitalWrite(yellowLED, HIGH);
digitalWrite(greenLED, LOW);
Serial.println("y");
break;
case 2: //
digitalWrite(redLED, HIGH);
digitalWrite(yellowLED, LOW);
digitalWrite(greenLED, LOW);
Serial.println("R");
break;
}
delay(2000);
}
//This is a function used to get the reading
int readSensor() {
digitalWrite(vccPin, HIGH); // Turn the sensor ON
delay(10); // wait 10 milliseconds
sensorValue = analogRead(sensorPin); // Read the analog value form sensor
digitalWrite(vccPin, LOW); // Turn the sensor OFF
return sensorValue; // send current reading
}
const int sensorMax = 690;
: حداکثر مقدار اندازهگیری شده توسط سنسور را در متغیر sensorMax ذخیره میکنیم. این عدد میتواند برای هرکسی متفاوت باشد اما حتما از 1024 کوچکتر است. این عدد را با کد برنامه قبلی بدست آوردیم. میتوانید بصورت پیش فرض 1024 یا عددی کوچکتر مساوی آن بگذارید ولی ممکن است بسته به جنس و کمپانی سنسور، دقت کمتری در تعیین سطح حاصل شود.
در حلقه setup()، وضعیت پینها را مشخص و خروجیها را برای حالت اولیه صفر کردیم.
sensorValue = readSensor();
: برای خواندن اطلاعات سنسور، یک تابع جدا نوشته و با این دستور هربار آن را فراخوانی کرده و مقدار برگشت داده شده را در متغیر sensorValue ذخیره میکنیم.
int range = map(sensorValue, sensorMin, sensorMax, 0, 3);
: با دستور map
، مقدار متغیر sensorValue را بین مقدار حداقلی و حداکثری (sensorMin و sensorMax) در 3 بازه مساوی سنجیده و رنج مشخص شده را در متغیر range ذخیره میکنیم.
switch (range) {
case 0:
digitalWrite(redLED, LOW);
digitalWrite(yellowLED, LOW);
digitalWrite(greenLED, HIGH);
break;
case 1: // Sensor getting wet
digitalWrite(redLED, LOW);
digitalWrite(yellowLED, HIGH);
digitalWrite(greenLED, LOW);
break;
case 2: // Sensor dry
digitalWrite(redLED, HIGH);
digitalWrite(yellowLED, LOW);
digitalWrite(greenLED, LOW);
break;
}
delay(1000);
}
switch/case
، مقدار عددی range را سنجیده و الایدی مناسب را روشن و بقیه الایدی ها را خاموش میکنیم.
int readSensor() {
digitalWrite(vccPin, HIGH); // Turn the sensor ON
delay(10); // wait 10 milliseconds
sensorValue = analogRead(sensorPin); // Read the analog value form sensor
digitalWrite(vccPin, LOW); // Turn the sensor OFF
return sensorValue; // send current reading
}
تابع readSensor را برای خواندن اطلاعات سنسور نوشتیم. در این تابع:
- ابتدا پایه متصل به مثبت سنسور روشن میشود.
- مقدار خروجی پایه S خوانده شده و در متغیر sensorValue ذخیره میگردد.
- پایه مثبت خاموش شده و مقدار sensorValue برگشت داده میشود.
راه اندازی سنسور تشخیص آب و رطوبت بدون آردوینو
تشخیص رطوبت یا سطح آب به کمک میکروکنترلهایی مثل آردوینو، هرچند ساده و دارای قابلیتهای بالایی است اما سادهترین و ارزانترین روش نیست.
خروجی سنسور تشخیص آب، یک ولتاژ متغیر متناسب با عمق آب یا میزان رطوبت است. در نتیجه میتوان یک ولتاژ خروجی که بیانگر سطح خاصی از آب است را از قبل تعیین کرده (مقدار آستانه)، سپس با مقایسۀ ولتاژ خروجی سنسور در هر لحظه با این مقدار آستانه، وضعیت را بسنجیم.
برای مقایسه دو سطح ولتاژ نیز میتوانیم از آپامپ ها استفاده کنیم. آیسی آپامپ lm358 گزینهای مناسب و ارزان است.
تصویر زیر شماتیک مدار مقایسه کننده ولتاژ است که میتوان به کمک آن یک سیستم هشدار نشتی، سرریز و یا حتی کمبود آب ساخت.
شرح مدار هشداردهندۀ سطح آب و تشخیص باران
R4 یک پتانسیومتر 10 کیلو اهم است. پایه خروجی پتانسیومتر (خطوط آبی) مقدار ولتاژ آستانه را مشخص میکند. با تنظیم پتانسیومتر میتوانیم مقدار آستانۀ متناسب با میزان آب را تعیین کنیم.
حال اگر سطح ولتاژ خروجی سنسور (خطوط نارنجی) از سطح آستانه بیشتر باشد آپامپ پایینی فعال و الایدی 2 روشن میشود و برعکس؛ اگر سطح ولتاژ خروجی سنسور از سطح آستانه پایین تر باشد الایدی 1 روشن میشود.
در مدار بالا میتوان به جای الایدی ها از مدارات رله برای کنترل عملگرهای واقعی همچون پمپ آب، آژیر هشدار و… استفاده کرد.
یک گام جلوتر
مانیتورینگ سطح آب: سعی کنید به کمک السیدی کاراکتری، میزان نسبی آب موجود یک مخزن را نشان دهید.
آکواریوم هوشمند: سعی کنید با کمک سنسور تشخیص سطح آب، یک سیستم هشدار یا کنترل سطح آب برای آکواریوم بسازید به این صورت که یک حد بالا و یک حد پایین داشته باشد. و اگر آب از این محدوده بیشتر یا کمتر شد به کمک یک بازر به ما هشدار دهد یا یک پمپ آب را روشن نماید. (میتوانید این سیستم را به راحتی، حتی بدون نیاز به آردوینو، به وسیلۀ مدار مقایسه گر بسازید).
Comments (8)
در آکواریوم ماهی قابل استفاده هست این سنسور؟
با سلام
پیشنهاد نمیشود. به دلیل اینکه از ولتاژ برای اندازه گیری استفاده میشود و همچنین در طولانی مدت واکنش خواهد داد.
پیشنهاد می شود از سنسور های P100 یا P51 به جای این محصول استفاده کنید.
سلام در این زمینه سنسور قدرت مند چیا داریم ممنون
با سلام،
منظور شما از قدرتمند چه چیزی می باشد.
سلام در منابعی مایعات ممکن است جابجا شود و تکان بخورد پیشنهاد شما همین آردوینو هست یا …؟
با سلام
در صورتی که میخواهید داخل مخازنی که در حرکت هستن برای اندازه گیری سطح مایع استفاده کنید
می توانید از 3 روش برای این کار استفاده کنید.
1. استفاده از پلیت های فشار شکن که در هنگام حرکت تا جلو تغییرات سطح گرفته شود
2. استفاده از لوله کنار مخزن که میزان تغییرات سطح را کاهش بدهد
3. استفاده از سنسور های وزن در زیر منبع که میزان وزن را محاسبه کند
سلام خدا قوت مهندس باید سنسوریا ماژولی برای وجود آب و اگر باشد دمای آب در رادیاتور خودرو تعبیه کنم که اگر آب در رادیاتور نبود ویا یکدفعه خالی شد متوجه شوم چه پیشنهادی دارید تشکر از لطفتان
با سلام
می توانید از سنسور تشیص سطح مایعات مانند سنسور p52 داخل مخزن آب یدکی استفاده بکنید که زمانی که این مخزن خالی شد از دیتا آن برای بررسی شرایط استفاده نمایید
از نسخه p100 این محصول برای ارتفاع های بیشتر نیز می توانید استفاده بکنید.
توجه داشته باشید که این روش بر روی ماشین هایی که مخزن یدکی غیر تحت فشار دارند قابل اجرا میباشد. (برای مثال در پراید)