نشانگر سطح آب با استفاده از آردوینو

نشانگر سطح آب بی سیم با استفاده از سنسور آلتراسونیک (Ultrasonic) و آردوینو (Arduino) یک پروژه شگفت انگیز و بسیار مفید است. هدف از این پروژه اطلاع رسانی به کاربر از میزان آبی موجود در مخزن آب است. این پروژه را می توان برای کنترل سطح آب در مخزن با روشن کردن یک پمپ، زمانی که سطح آب کم است، و خاموش کردن آن در زمانی که سطح آب بالا است، ارتقا داد. بنابراین، نشانگر سطح آب آردوینو به جلوگیری از هدر رفتن آب در مخزن کمک می کند. این پروژه بی سیم است، بنابراین نصب آن آسان است و می تواند تا 100 متر کار کند.

در این پروژه از دو مدار استفاده می شود: مدار فرستنده و مدار گیرنده. مدار فرستنده از حسگر اولتراسونیک برای اندازه گیری سطح آب از نظر فاصله استفاده می کند. این داده ها با استفاده از ارتباط RF به مدار گیرنده ارسال می شود. سطح آب بر حسب درصد در یک نمایشگر LCD 16×2 که به مدار گیرنده متصل است نشان داده شده است.

قطعات مورد نیاز پروژه:

آردوینو
Nano
2عدد
سنسور   آلتراسونیک
HC-SR04
1
یک   جفت ماژول بیسیم فرستنده/گیرنده
ASK 433
1
LCD
16x2
1
مقاومت
10K
1
سوییچ
DPDT
2
باتری
9 Volt
2
قاب   باتری

2

نحوه عملکرد

در پروژه از دو مدار یکی در فرستنده و دیگری در گیرنده استفاده می شود. در مدار فرستنده از سنسور اولتراسونیک استفاده می شود که فاصله سطح آب را از نقطه بالایی بطری یا مخزن اندازه گیری می کند. فاصله بر حسب سانتی متر اندازه گیری می شود و با استفاده از ارتباطات RF به مدار گیرنده ارسال می شود.

مدار گیرنده داده ها را از مدار فرستنده دریافت می کند و آن را بر حسب درصد تبدیل می کند و روی LCD نشان می دهد.

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

مدار نشانگر سطح آب به کمک آردوینو

در این پروژه از دو مدار استفاده شده است

مدار فرستنده – مدار فرستنده که در شکل زیر نشان داده شده است. در شکل 1، در این مدار یک سنسور اولتراسونیک به پایه D9 و پایه D10 آردوینو متصل شده است. سنسور اولتراسونیک با پایه Vcc و GND تغذیه می شود، این پایه ها به پایه Vcc و GND آردوینو متصل می شوند. داده های اندازه گیری شده توسط فرستنده RF ارسال می شود. پایه داده فرستنده RF به پایه D4 آردوینو نانو متصل است. پایه های Vcc و GND فرستنده RF به پایه های Vcc و GND آردوینو متصل می شوند. در این مدار فرستنده از یک آنتن استفاده شده است که به پین ANT فرستنده RF متصل است، کل مدار توسط باتری 9 ولت تغذیه می شود. باتری به پین Vin و GND آردوینو متصل است.

مدار گیرنده - در مدار گیرنده، گیرنده RF برای دریافت اطلاعات از فرستنده استفاده می شود. پایه دیتا گیرنده RF به پین D4 آردوینو متصل است. سطح آب روی LCD نشان داده شده و LCD از پایه D4 به D9 به آردوینو متصل است. ال سی دی توسط پین Vcc و GND با استفاده از آردوینو تغذیه می شود، کنتراست LCD با حرکت دادن پیش تنظیم شده که به پایه 3 LCD متصل است تغییر می کند. مدار گیرنده توسط یک باتری 9 ولتی از طریق یک سوئیچ تغذیه می شود که بین پین Vcc و GND آردوینو وصل شده است. مدار در شکل زیر نشان داده شده است.

ساختن یکی از شکل های بالا برای فرستنده/گیرنده روی بردبورد یا PCB خام امکان پذیر است.

برنامه فرستنده

include <RCSwitch.h>#

include <Ultrasonic.h>#

;Ultrasonic ultrasonic(11,10)

;()RCSwitch mySwitch = RCSwitch

;int i

}()void setup 

  ;mySwitch.enableTransmit(4) 

{

}()void loop   

  ;i = ultrasonic.Ranging(CM)

  ;mySwitch.send(i, 24)

 ;delay(100)

{

برنامه گیرنده:

<include <RCSwitch.h#

<include <LiquidCrystal.h#

;LiquidCrystal lcd(4, 5, 6, 7, 8, 9)

;()RCSwitch mySwitch = RCSwitch

;float level

;int Hval=2

;int Lval=12

;int BUZZER = 10 

}()void setup 

 ; mySwitch.enableReceive(0)

 ; lcd.begin(16, 2)

 ; lcd.print("WATER LEVEL INDI")

  ;pinMode(BUZZER,OUTPUT)

{

}()void loop 

}  if (mySwitch.available()) 

    ;()level = mySwitch.getReceivedValue

    ;level = level/(Lval - Hval)

  ;  level = level*100

    if (level>100) {level=100;}

  ;  lcd.setCursor(0, 1)

   ; lcd.print("LEVEL ")

  ;  lcd.print(level)

   ; (" %       ")lcd.print

  ;  ()mySwitch.resetAvailable

 {   

  ;digitalWrite(BUZZER,HIGH)

  if (level > 99) {digitalWrite(BUZZER,HIGH); delay(100); digitalWrite(BUZZER,LOW); delay(100);}

  else  {digitalWrite(BUZZER,LOW);}

{

توضیح برنامه فرستنده

در برنامه سمت فرستنده از دو فایل هدر استفاده می شود. اول RCSwitch.h است که برای فرستنده RF استفاده می شود و دوم Ultrasonic.h است که برای سنسور اولتراسونیک استفاده می شود.

اکنون پین های سنسور اولتراسونیک در خط 4 با نام اولتراسونیک، پین 11 Trig و پین 10 اکو اعلام شده است. در خط 5 RCSwitch برای فرستنده با نام "mySwitch" اعلام شده است. در خط 7 یک متغیر عدد صحیح با نام "i" تعریف می شود.

در تابع void setup()، فرستنده با تابع "mySwitch.enableTransmit(4)" فعال می شود، جایی که پین داده فرستنده به پایه D4 آردوینو متصل است.

در حلقه loop()، فاصله با تابع "ultrasonic.Ranging(CM)" اندازه گیری می شود و به عدد صحیح "I" اختصاص می یابد، این فاصله بر حسب سانتی متر اندازه گیری می شود.

در خط 15، فاصله اندازه گیری شده توسط تابع "mySwitch.send(i, 24) " منتقل می شود، که در آن "i" فاصله و 24 فرمت بیت است. پس از استفاده از "تاخیر" 100 میلی ثانیه ای، یعنی آردوینو داده ها را پس از هر 100 میلی ثانیه ارسال می کند.

توضیح برنامه گیرنده

در سمت گیرنده، از دو فایل هدر استفاده شده است، اولی "RCSwitch.h" است که برای ارتباط RF بین فرستنده و گیرنده استفاده می شود و دومی "LiquidCrystal.h" است که برای نمایش LCD استفاده می شود.

در خط 4 پین های آردوینو اعلان شده اند که به LCD متصل می شوند. در مجموع 6 پین به آردوینو متصل شده است که D4، D5، D6، D7، D8، D9 هستند. در خط 5، "RCSwitch" با نام "mySwitch" اعلام شده است.

در خط 7 یک متغیر float با نام "level" اعلام می شود که سطح آب را نشان می دهد و در خط 9 و 10 دو عدد صحیح با نام "Hval" و "Lval" اعلام می شود که "Hval" مقدار بالایی سطح آب (فاصله از سنسور اولتراسونیک) و "Lval" مقدار پایین تر سطح آب (فاصله از سنسور اولتراسونیک) است. بعد از آن پایه های آژیر با متغیر عدد صحیح "BUZZER" تعریف می شود که در آن، 10 پایه D10 آردوینو است.

در void setup()، گیرنده RF با تابع "mySwitch.enableReceiver(0) " فعال می شود، که در آن 0 پایه وقفه (INT0) است که پایه D2 آردوینو است.

در خط 16، LCD با تابع "lcd.begin(2,16) شروع می شود، و در خط 17، "lcd.print" برای نشان دادن "WATER LEVEL INDI" در ردیف اول LCD استفاده می شود.

در خط 19، "pinMode(BUZZER,OUTPUT) " پین BUZZER را به عنوان OUTPUT اعلام می کند.

در حلقه loop() در ابتدا از "if (mySwitch.available())" استفاده می شود، به این معنی که اگر داده ای از گیرنده RF دریافت شود، برنامه وارد حلقه می شود. در خط 25، داده های دریافتی از گیرنده RF توسط تابع "mySwitch.getRecivedValue" رمزگشایی شده و در یک متغیر float به نام "level" ذخیره می شود.

در خط 27 و 28 "level" پردازش شده و با استفاده از برخی عبارت های ریاضی به درصد تبدیل می شود. در خط 30، شرط «if» برای محدودیت درصد استفاده شده است.

در خطوط 32، 33، 34، 35 سطح روی LCD چاپ شده است و در خط 37 از تابع mySwitch.reset.Available()" برای تنظیم مجدد ماژول RF استفاده شده است.

در پایان کد، در صورتی که سطح از 99 درصد بیشتر شود، از شرط «if» برای روشن کردن زنگ استفاده می‌شود.



2