آموزش راه اندازی سنسور سطح آب با آردوینو – سنسور سطح آب و مایعات چیست و چگونه کار می کند؟

فهرست مطالب

Water Sensor

مقدمه

سنسورها و روش‌های متفاوتی برای تعیین عمق آب، تشخیص بارندگی، نشتی آب، خالی و یا سرریز شدن یک مخزن و…  وجود دارد. یکی از ساده ­ترین و ارزان‌ترین روش‌ها استفاده از سنسور تشخیص سطح آب است که در این مقاله به آن می‌پردازیم.

از دیگر نام‌های متداول این سنسور: سنسور باران، سنسور تعیین سطح آب، سنسور رطوبت، سنسور نشتی آب.

آنچه در این آموزش یاد می‌گیرید

  • اصول کار سنسور و نحوه تست آن
  • راه‌اندازی سنسور تشخیص سطح آب/رطوبت با آردوینو و نمایش اطلاعات روی کامپیوتر
  • تعیین سطح مخزن آب، تشخیص نشتی و باران بوسیله سنسور و آردوینو
  • استفاده از سنسور تشخیص سطح آب بدون استفاده از آردوینو

سنسور تشخیص سطح آب چگونه کار می کند؟

 به بیان ساده، این سنسور یک خروجی ولتاژ تولید می کند که متناسب است با عمق آبی که در آن فرورفته.

 این سنسور شامل 10 نوار مسی موازیست که 5 تای آن‌ها خطوط منبع ولتاژ و 5 تای دیگر خطوط سیگنال هستند. این دو دسته نوار، یکی در میان، روی صفحه‌ی سنسور قرار داده شده‌اند. این دو دسته، در حالت عادی، اتصالی با یکدیگر ندارند، تا زمانیکه یک مایع رسانا روی سطح نوارهای سنسور قرار گیرد. یعنی در حالت خشک و بدون رطوبت، مقاومت بین این خطوط بسیار زیاد بوده و در نتیجه ولتاژ نوارهای مربوط به سیگنال صفر است. حال هرچه صفحۀ شامل نوارها بیشتر در مایع فرو رود رسانایی بین دو دسته نوار قوی‌تر، مقاومت بین خطوط کمتر و ولتاژ نوارهای سیگنال به ولتاژ پایه + نزدیک‌تر می شود. یعنی هرچه عمق بیشتر، ولتاژ پایه سیگنال بیشتر (البته در محدوده ولتاژ منبع).

اگر شکل زیر را یک مدلسازی ساده از طرز کار سنسور باران در نظر بگیریم: هرچه نوارهای روی سنسور بیشتر در آب فرو رود، طول مقاومت بین پایه + و پایه S کمتر شده، در نتیجه ولتاژ پایه S (Vs) به ولتاژ منبع (Vcc) نزدیک‌تر می‌شود و برعکس.

پایه‌های (Pinout) سنسور تشخیص سطح آب

  • -: پایه زمین
  • +: تغذیه ماژول (2 تا 5 ولت)
  • S: خروجی ماژول به صورت ولتاژ آنالوگ
Sensor Pinout

لوازمی که به آن احتیاج دارید

قطعات مورد نیاز

Arduino UNO R3 × 1
سنسور تشخیص سطح آب - سنسور رطوبت × 1
سنسور تشخیص سطح آب - سنسور رطوبت - تولید YwRobot * × 1
سنسور تشخیص سطح مایعات -ساختWaveshare * × 1
سیم جامپر نری به مادگی × 1
ال‌ای‌دی 5 میلی متری سبز** × 1
ال‌ای‌دی 5 میلی متری زرد** × 1
ال‌ای‌دی قرمز** × 1
مقاومت 220 اهم** × 1
آی سی lm358** × 1

*: سنسور تشخیص سطح آب از 3 برند و کیفیت متفاوت قرار داده‌ شده است. هرچند که اصول کار آن‌ها یکیست.

**: برای راه‌اندازی سنسورتشخیص سطح آب، تنها 3 مورد اول الزامیست. بقیه قطعات در پروژه‌های دیگر که در ادامه می‌آید استفاده می‌شود.

نرم افزارهای مورد نیاز

Arduino IDE

تست ساده سنسور تشخیص سطح آب

بیایید ابتدا، بدون پیچیده ‌کردن کار، سنسورمان را به سادگی تست کنیم و ببینیم چگونه کار می‌کند.

پایه مثبت سنسور را به مثبت منبع ولتاژ و پایه منفی سنسور را به GND  منبع ولتاژ متصل نمایید (می‌توانید از خروجی ولتاژ برد آردوینو به عنوان منبع تغذیه استفاده کنید).

حال مولتی‌متر را در حالت اندازه‌گیری ولتاژ DC  قرار داده و ولتاژ پایه S  سنسور را نسبت به GND اندازه‌گیری کنید (طبیعتا در حالت خشک باید صفر یا عددی نزدیک به صفر باشد). حال به آرامی سنسور را داخل لیوان آب قرار داده و در چند عمق مختلف، ولتاژ پایه S را دوباره بخوانید (اگر سنسور شما سالم باشد باید متناسب با عمق، ولتاژ بیشتری را نشان دهد).  

راه اندازی سنسور تشخیص سطح آب با آردوینو

سیم‌بندی

Interface Circuit

کد

برای راه‌اندازی سنسور با آردوینو، نیاز به کتابخانه خاصی نیست. کد زیر را در نرم افزار 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 است.

در مثال زیر از اصول بالا استفاده شده است.

مثال: نمایش سطح آب توسط 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 را برای خواندن اطلاعات سنسور نوشتیم. در این تابع:

  1. ابتدا پایه متصل به مثبت سنسور روشن می‌شود.
  2. مقدار خروجی پایه S  خوانده شده و در متغیر sensorValue  ذخیره می‌گردد.
  3. پایه مثبت خاموش شده و مقدار sensorValue  برگشت داده می‌شود.

راه اندازی سنسور تشخیص آب و رطوبت بدون آردوینو

تشخیص رطوبت یا سطح آب به کمک میکروکنترل­هایی مثل آردوینو، هرچند ساده و دارای قابلیت‌های بالایی است اما ساده‌ترین و ارزان‌ترین روش نیست.

  خروجی سنسور تشخیص آب، یک ولتاژ متغیر متناسب با عمق آب یا میزان رطوبت است. در نتیجه می­توان یک ولتاژ خروجی که بیانگر سطح خاصی از آب است را از قبل تعیین کرده (مقدار آستانه)، سپس با مقایسۀ ولتاژ خروجی سنسور در هر لحظه با این مقدار آستانه، وضعیت را بسنجیم.

برای مقایسه دو سطح ولتاژ نیز می‌توانیم از آپ‌امپ‌ ها استفاده کنیم. آی‌سی آپ‌امپ lm358 گزینه‌ای مناسب و ارزان است.

تصویر زیر شماتیک مدار مقایسه کننده ولتاژ است که می­توان به کمک آن یک سیستم هشدار نشتی، سرریز و یا حتی کمبود آب ساخت.

شرح مدار هشداردهندۀ سطح آب و تشخیص باران

R4 یک پتانسیومتر 10 کیلو اهم است. پایه خروجی پتانسیومتر (خطوط آبی) مقدار ولتاژ آستانه را مشخص می‌کند. با تنظیم پتانسیومتر می‌توانیم مقدار آستانۀ متناسب با میزان آب را تعیین کنیم.

حال اگر سطح ولتاژ خروجی سنسور (خطوط نارنجی) از سطح آستانه بیشتر باشد آپ‌امپ پایینی فعال و ال‌ای‌دی 2 روشن می‌شود و برعکس؛ اگر سطح ولتاژ خروجی سنسور از سطح آستانه پایین تر باشد ال‌ای‌دی 1 روشن می‌شود. 

Comparator Circuit

در مدار بالا می­توان به جای ال‌ای‌دی ها از مدارات رله برای کنترل عملگرهای واقعی همچون پمپ آب، آژیر هشدار  و… استفاده کرد.

یک گام جلوتر

مانیتورینگ سطح آب: سعی کنید به کمک ال‌سی‌دی کاراکتری، میزان نسبی آب موجود یک مخزن را نشان دهید.

آکواریوم هوشمند: سعی کنید با کمک سنسور تشخیص سطح آب، یک سیستم هشدار یا کنترل سطح آب برای آکواریوم بسازید به این صورت که یک حد بالا و یک حد پایین داشته‌ باشد. و اگر آب از این محدوده بیشتر یا کمتر شد به کمک یک بازر به ما هشدار دهد یا یک پمپ آب را روشن نماید. (می­توانید این سیستم را به راحتی، حتی بدون نیاز به آردوینو، به وسیلۀ مدار مقایسه گر بسازید).

آموزش های مشابه

Comments (2)

  • امیر Reply

    در آکواریوم ماهی قابل استفاده هست این سنسور؟

    فوریه 24, 2024 at 10:06 ق.ظ
    • محمد دمیرچی Reply

      با سلام
      پیشنهاد نمیشود. به دلیل اینکه از ولتاژ برای اندازه گیری استفاده میشود و همچنین در طولانی مدت واکنش خواهد داد.
      پیشنهاد می شود از سنسور های P100 یا P51 به جای این محصول استفاده کنید.

      فوریه 24, 2024 at 4:22 ب.ظ

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.