اگر تا به حال به فکر ساخت یک وسیله برای سنجش سطح آب مخزن، آبگرمکن و آکواریوم افتاده اید، به کمک این مقاله به راحتی میتوانید آن را بسازید. ماژول سنسور تشخیص سطح آب برای مانیتور کردن مخزن، تشخیص بارندگی و تشخیص نشتی نیز به کار میرود.
مرور سخت افزاري
اين سنسور داراي يك سري ده تايي از المانهاي مسي است كه 5 تاي آنها المانهاي تغذيه و 5 تاي ديگر المانهاي حسگر ميباشد. چيدمان اين المانهاي مسي بصورت يك در ميان است و بين هر دو المان تغذيه يك المان مسي حسگر قرار دارد. معمولا اين المانهاي مسي به يكديگر متصل نيستند اما زماني كه در آب غوطه ور باشند، آب بین آن ها اتصال برقرار میکند. بر روي برد ماژول يك LED تغذيه قرار دارد كه در زمان برقدار شدن برد، روشن ميشود.
اصول عملكردي ماژول سنسور تشخیص سطح آب
طرز كار ماژول سنسور تشخیص سطح آب بسيار ساده است. خطوط مسی موازی روی سنسور مانند یک مقاومت متغیر (شبيه به پتانسيومتر) عمل میکنند كه مقدار مقاومت آنها بر اساس سطح آب تغيير خواهد كرد. تغييرات مقاومت متناسب با فاصله بالاي سنسور تا سطح آب ميباشد. به عبارت ديگر مقدار مقاومت بطور معكوس متناسب با ارتفاع آب داخل مخزن است.
- هرچقدر سنسور در آب بيشتري غوطه ور باشد، رسانايي بهتر ميشود و مقدار مقاومت كاهش خواهد يافت.
- هر چقدر سطح آب پايين تر باشد، رسانايي کاهش و مقاومت افزايش خواهد یافت.
ولتاژ خروجي سنسور بر اساس ميزان مقاومت خواهد بود كه از طريق آن ميتوان مقدار سطح آب را اندازهگيري نمود.
پایه های ماژول سنسور تشخیص سطح آب
استفاده از ماژول سنسور تشخیص سطح آب بسيار ساده است چرا كه فقط داراي سه پين ميباشد.
S : اين پين به عنوان پين سيگنال به صورت يك خروجي آنالوگ است كه به يكي از پينهاي ورودي آردوينو وصل خواهد شد.
VCC : اين پين براي اعمال ولتاژ تغذيه سنسور است. توصيه ميشود سنسور را با يك ولتاژ بين 3/3 ولت تا 5 ولت تغذيه كنيد. لازم به ذكر است مقدار خروجي آنالوگ سنسور به مقدار ولتاژ تغذيه بستگي خواهد داشت.
GND : پين زمين سنسور است.
برای راه اندازی ماژول سنسور تشخیص سطح آب با آردوینو به یکسری قطعات نیاز داریم که در ادامه توضیح می دهیم.
قطعات مورد نیاز
- ماژول تشخیص سطح آب
- ماژول آردوینو UNO R3 CH340G
- سیم جامپر نری / مادگی 40 رشته 20 سانتی متر
- ال ای دی 5 میلی متر قرمز مات
- ال ای دی 5 میلی متر آبی مات OVAL
- ال ای دی 5 میلی متر زرد مات
- مینی برد بورد 400 سوراخ
اتصال ماژول سنسور تشخیص سطح آب به آردوينو
براي اتصال سنسور به آردوينو ابتدا لازم است پين VCC و GND ماژول سنسور به پين 5 ولت و زمين آردوينو وصل شوند.
يك چالش شناخته شده ماژول سنسور تشخیص سطح آب ، مسئله طول عمر كوتاه اين سنسور است كه دليل آن در ارتباط بودن با محيطهاي مرطوب است. چنانچه به صورت طولانی مدت تغذیه سنسور متصل باشد، سرعت خوردگي به طور قابل توجهي افزايش خواهد يافت. براي غلبه بر اين مشكل، اكيدا توصيه ميشود كه تغذيه سنسور را به صورت مداوم اعمال نكنيم. كافيست تنها هنگامي كه قصد خواندن مقدار سطح آب را داريم، تغذیه سنسور متصل شود. به همين منظور ميتوان پين VCC ماژول سنسور را به يك پين ديجيتال آردوينو متصل نمود و اين پين را بر اساس نياز High يا Low كرد. در اينجا پين VCC ماژول را به پين ديجيتال شماره 7 آردوينو و پين S آن را به پين A0 ADC (مبدل آنالوگ به ديجيتال) آردوينو متصل ميكنيم. بنابراين سيم كشي اتصالات به شكل زير خواهد بود.
مثالي براي اندازهگيري سطح آب
پس از انجام اتصالات، كد زير را بر روي آردوينو آپلود كنيد.
// Sensor pins #define sensorPower 7 #define sensorPin A0// Value for storing water level int val = 0;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 (9600 ); }void loop () {//get the reading from the function below and print it int level =readSensor (); Serial."Water level: " ); Serial.println (level);delay (1000 ); }//This is a function used to get the reading int readSensor () {digitalWrite (sensorPower, HIGH);// Turn the sensor ON delay (10 );// 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 = 0 ;
در بخش setup كد ابتدا پين خروجي متصل به تغذيه سنسور را به عنوان يك خروجي آردوينو مشخص ميكنيم و مقدار آن را بصورت Low تنظیم ميكنيم تا در ابتدا سنسور برقدار نشود. همچنين، سريال مانيتور پيكربندي ميشود.
pinMode (sensorPower, OUTPUT);
digitalWrite (sensorPower, LOW);
Serial.begin (9600 );
در داخل يك حلقه، تابع ()readSensor به صورت مکرر در فواصل زماني يك ثانيه اي فراخواني شده و مقدار خروجي پرينت ميشود.
Serial.print ("Water level: " );
Serial.println (readSensor ());
delay (1000 );
تابع ()readSensor براي دريافت مقدار فعلي سطح آب استفاده ميشود. اين تابع ابتدا سنسور را روشن ميكند، 10 ميلي ثانيه صبر ميكند و سپس مقدار آنالوگ سطح را از سنسور ميخواند و در نهايت سنسور را خاموش كرده و مقدار خروجي را به ما ميدهد.
int readSensor () {
digitalWrite (sensorPower, HIGH);
delay (10 );
val = analogRead (sensorPin);
digitalWrite (sensorPower, LOW);
return val;
}
كاليبراسيون
براي اينكه خواندن خروجی ماژول سنسور تشخیص سطح آب صحيح باشد، لازم است كه در ابتدا سنسور را براي نوع خاص آبي كه قصد سنجش سطح آن را داريد كاليبره كنيد. همانطور كه ميدانيد آب خالص رسانا نيست و در حقيقت مواد معدني و ناخالصيهاي درون آب سبب رسانايي الكتريكي آن ميشود. بنابراين بسته به نوع آب، حساسيت سنسور متفاوت خواهد بود.
قبل از اينكه اقدام به ذخيره اطلاعات و يا فعالسازي رويداد خاصي بكنيد، بايد بدانيد واقعا چه اطلاعاتي از سنسور دريافت ميكنيم. با بكارگيري كد آردوينوي قبلي مشاهده ميكنيم كه در زماني كه سنسور درون آب نيست چه خروجي به ما ميدهد. همچنين به مقادير خروجي سنسور در مواقعي كه بخشي از سنسور يا كل بدنه آن در آب غوطه ور است، دقت نمائيد.
به عنوان يك نمونه، با استفاده از مداري كه قبلا ارائه شد، ميتوان مقادير خروجي بر روی سريال مانيتور را به اين صورت مشاهده نمود: وقتي سنسور خشك باشد، مقدار خروجي صفر خواهد بود. زمانيكه بخشي از سنسور درون آب باشد، مقدار خروجي 420 و زمانيكه كه كل ماژول سنسور در آب غوطه ور باشد، مقدار خروجي 520 خواهد بود.
اين آزمايش ممكن است نيازمند سعي و خطا باشد. هنگامي كه به مقادیر خروجی سنسور اطمينان پيدا كرديد، ميتوانيد از اين مقادير به عنوان حد آستانه براي فعالسازي يك فرآيند خاص استفاده كنيد. در مثال بعد، قصد انجام چنين كاري را داريم.
پروژه اندازهگيري سطح آب
در این مثال قصد داريم كه يك سنسور تشخیص سطح آب پرتابل بسازيم كه بر اساس سطح آب يكسري LED را روشن كند.
سيم كشي
از همان مدار مثال قبل استفاده ميكنيم. در اينجا فقط لازم است چند LED به مدار اضافه كنيم. با استفاده از مقاومتهاي محدود كننده جريان 220 اهمي سه رنگ LED را به پايههاي ديجيتال شماره 2، 3 و 4 آردوينو متصل ميكنيم. شكل مدار حاصل به فرم زير خواهد بود.
كد آردوينو
پس از بستن مدار، كد زير را در آردوينو آپلود كنيد. در اين كد دو متغير lowerThreshold و upperThreshold براي سطوح آستانه مورد نظر تعريف شدهاند. چنانچه مقدار خروجي كمتر از حد آستانه پاييني باشد LED قرمز روشن خواهد شد. اگر مقدار خروجي بيشتر از حد آستانه بالايي باشد، LED سبز روشن ميشود و درصورتيكه مقدار خروجي بين دو حد آستانه باشد، LED زرد رنگ روشن خواهد شد.
/* Change these values based on your calibration values */ int lowerThreshold =420 ;int upperThreshold =520 ;// Sensor pins #define sensorPower 7 #define sensorPin A0// Value for storing water level int val =0 ;// Declare pins to which LEDs are connected int redLED =2 ;int yellowLED =3 ;int greenLED =4 ;void setup () { Serial.begin (9600 ); 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 ==0 ) { Serial.println ("Water Level: Empty" );digitalWrite (redLED, LOW);digitalWrite (yellowLED, LOW);digitalWrite (greenLED, LOW); }else if (level >0 && 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 (1000 ); }//This is a function used to get the reading int readSensor () {digitalWrite (sensorPower, HIGH);delay (10 ); val =analogRead (sensorPin);digitalWrite (sensorPower, LOW);return val; }