استاد راهنما: خانم دکتر نجمه چراغی شیرازی
دانشجو: افسانه باقری
رشته: مهندسی برق
ایمیل: afsaneh.bagheri9696@gmail.com
شاید تا به حال به این فکر کرده باشین که آیا می توان وسایل برقی و دیجیتال خانه را به گونه ای کنترل کرد که دیگرنیازی به خاموش و روشن کردن روزانه آنها بصورت دستی نباشیم و بتوانیم به نحوی مدیریت زمان و هزینه را در دست داشته باشیم،امروز قصد داریم در این وبلاگ نحوه ساخت یک سیستمی را آموزش ببینم که با ساخت آن قادر خواهیم بود که وسایل برقی و دیجیتال خانه و یا محل کار خود را بصورت اتوماتیک کنترل کنیم و دیگر نیازی به خاموش و روشن کردن آنها بصورت دستی نباشد و از این طریق می توانیم از خاموش و یا روشن بودن دستگاه و یا وسیله مورد نظر در زمان مخصوص به خود اطمینان حاصل کنیم .
اگر چه در حال حاضر تعداد خانه های هوشمند اندک می باشد اما در کمتر از یک دهه اکثر خانه ها و آپارتمان های جدید با هزینه بسیار ناچیزی برای مصرف کنندگان با تکنولوژی خانه هوشمند ساخته خواهد شد.
برای ساخت خانه های هوشمند اولیه میلیون ها دلار هزینه می شد زیرا اکثرا از مولفه های ساخت دست استفاده می شد. با این حال، سیستم های اتوماسیون خانگی ساده امروزه با کمتر از ۵۰۰ دلار قابل خریداری هستند.
هزینه این سیستم ها با افزودن قابلیت های مختلف به سیستم افزایش می یابد. پیش بینی می شود که در طول چهار سال آینده، بازار سیستم های هوشمند خانگی به نرخ رشد سالانه ۶۰% بین سال های ۲۰۱۶ تا ۲۰۲۰ دست خواهد یافت. همچنین پیش بینی می شود که تعداد وسایل خانگی که با سیستم هوشمند ساختمان کار می کنند به بیش از ۴۰ میلیون در سال ۲۰۲۲ رشد خواهد کرد. برای مثال در پایان سال ۲۰۲۰ تقریبا ۵۵ درصد همه وسایل خانگی در آمریکا با اندازه گیری های هوشمند تجهیز خواهد شد.
اولین سیستم هوشمند تجربی در سال ۱۹۶۶ به بازار عرضه شد. استفاده معمولی از اتوماسیون خانگی شامل کنترل روشنایی، گرمایش و سرمایش، امنیت، بهینه سازی مصرف انرژی و غیره می باشد. در سال ۲۰۱۶ مشاهده سیستم اتوماسیون خانگی در ساختمان های تجاری، دانشگاه ها یا هتل ها به امری عادی تبدیل شده است اما استفاده از این سیستم ها در خانه های شخصی محدود به قشر مرفه جامعه است.
به طور مثال ۲۰ سال قبل با ورود تکنولوژی آیفون های صوتی و بعد از آن آیفون های تصویری به ایران استقبال زیادی از این موضوع نشد ولی با گذشت مدت کوتاهی سیر تصاعدی درخواست این سیستم بالا گرفت تا جایی که هم اکنون جزء ضروریات ساختمان محسوب می شود و هر روز با تکنولوژی های مدرن بر خیل مشتریان این سیستم اضافه می شود.
قطعات مورد نیاز:
ساخت ساعت دیجیتال on_of چهار زمانه
برای ساخت یک ساعت دیجیتال ابتدا نیاز به یک میکرو کنترلر داریم.
در این پروژه ما از یک میکروکنترلر atmega32 استفاده کرده ایم که به وسیله یک lcd tex زمان محاسبه شده را به ما نمایش میدهد. در ادامه میتوانید شماتیک اتصال میکرو کنترلر را به portb میکروکنترلر مشاهده نمایید .
حال بایستی با استفاده از میکروکنترلر یک زمان سنج دقیق بسازیم. برای این کار بایستی کریستال اسیلاتوری که به میکرو متصل است یک فرکانس مناسب و دقیق برای ساخت تایمر ثانیه شمار به ما بدهد. از این جهت همانطور که در شکل بالا مشاهده میکنید ما یک کریستال 32768 هرتز را به پایه های xtal میکرو متصل نموده ایم .
حال نوبت به محاسبه زمان میرسد . برای این کار وقفه تایمر 1 را در میکرو کنترلر فعال میکنیم و مقدار اولیه آن را برابر 65535-32768 قرار میدهیم. از آنجایی که فرکانس اسیلاتور ما برابر است با 32768، هنگامی که وقفه تایمر صادر شود دقیقا یک ثانیه گذشته است. یعنی هر یک ثانیه برنامه به زیر برنامه وقفه تایمر1 میرود و در زیر برنامه نیز مقادیر متغییر های ثانیه و دقیقه و روز را تغییر میدهیم.
کد زیر بخش تنظیم ساعت در زیر برنامه second که مربوط به وقفه تایمر میشود.
Second:
Timer1 = 65536 - 32768
Incr S0
If S0 = 60 Then
Incr M0
S0 = 0
End If
If M0 = 60 Then
Incr H0
M0 = 0
End If
If H0 = 24 Then
H0 = 0
Incr Day
If Day > 7 Then Day = 1
End If
البته این زیر برنامه بخش پایانی نیز دارد که در ادامه توضیح داده میشود.
برای نمایش زمان نیز در برنامه اصلی از کد زیر استفاده کرده ایم
Dim Today(7) As String * 9
Today(1) = "FRIDAY "
Today(2) = "SATURDAY "
Today(3) = "SUNDAY "
Today(4) = "MONDAY "
Today(5) = "TUESDAY "
Today(6) = "WEDNESDAY"
Today(7) = "THUSRDAY "
Do
Locate 1 , 1 : Lcd H0 ; ":" ; M0 ; ":" ; S0 ; " "
Locate 2 , 1 : Lcd Today(day)
Loop
البته این بخش را نیز در یک زیر برنامه نوشته ام که در اینجا نیازی به نوشتن اون نداریم.
تا اینجا تونستیم که یک ساعت با دقت بالا بسازیم و مقدار ساعت و تاریخ رو بر روی lcd نمایش دهیم .
لازم به ذکره که تغذیه میکرو کنترلر بوسیله یک رگولاتر 7805 تامین میشه .
در ادامه از اونجایی که میخوایم 8 زمان (4 زمان برای روشن شدن و 4 زمان برای خاموش شدن دستگاه برقی) به میکروکنترلر بدهیم بایستی برای اونها متغییر هایی تعریف کنیم.
به همین تعداد متغییر نیز بایستی در حافظه ماندگار (eeprom) میکرو تعریف کنیم . توجه داشته باشید که برای هر تایم بایستی سه متغییر دقیقه و روز و ساعت رو تعیرف کنیم که جمعا میشه 36 متغییر از نوع بایت. 4 متغییر ثانیه و دقیقه و ساعت و روز هم برای زمان فعلی تعریف میکنیم که جمعا 40 متغییر میشود.مقدار اولیه همه متغییر ها را هم برابر صفر میدهیم به جز روز که نمیتواند صفر بگیرد و از یک شروع میکند.
در ضمن مقدار متغییرهای ماندگار برای بار اول بایستی به صورت پیشفرض صفر شود و دفعات بعد هر بار که برق رفت و دوباره وصل شد باید از حافظه خوانده شود
$regfile = "m32def.dat"
$crystal = 8000000
'=====================================================================
Dim H0 As Byte , M0 As Byte , S0 As Byte , Day As Byte
Dim H1 As Byte , M1 As Byte , Day1 As Byte
Dim H2 As Byte , M2 As Byte , Day2 As Byte
Dim H3 As Byte , M3 As Byte , Day3 As Byte
Dim H4 As Byte , M4 As Byte , Day4 As Byte
Dim Ht As Byte , Mt As Byte , Dayt As Byte
'-----------------------------------------------------------------------------
Dim H1of As Byte , M1of As Byte , Day1of As Byte
Dim H2of As Byte , M2of As Byte , Day2of As Byte
Dim H3of As Byte , M3of As Byte , Day3of As Byte
Dim H4of As Byte , M4of As Byte , Day4of As Byte
'----------------------------------------------------------------------------
Dim H0eeram As Eram Byte , M0eeram As Eram Byte , , Dayeeram As Eram Byte
Dim H1eeram As Eram Byte , M1eeram As Eram Byte , Day1eeram As Eram Byte
Dim H2eeram As Eram Byte , M2eeram As Eram Byte , Day2eeram As Eram Byte
Dim H3eeram As Eram Byte , M3eeram As Eram Byte , Day3eeram As Eram Byte
Dim H4eeram As Eram Byte , M4eeram As Eram Byte , Day4eeram As Eram Byte
'-----------------------------------------------------------------------------
Dim H1ofeeram As Eram Byte , M1ofeeram As Eram Byte , Day1ofeeram As Eram Byte
Dim H2ofeeram As Eram Byte , M2ofeeram As Eram Byte , Day2ofeeram As Eram Byte
Dim H3ofeeram As Eram Byte , M3ofeeram As Eram Byte , Day3ofeeram As Eram Byte
Dim H4ofeeram As Eram Byte , M4ofeeram As Eram Byte , Day4ofeeram As Eram Byte
'-----------------------------------------------------------------------------
Dim Vaziat As Eram Byte
If Vaziat = 255 Then
Vaziat = 1
'-------------------------
M1eeram = 0 : H1eeram = 0 : Day1eeram = 1
M2eeram = 0 : H2eeram = 0 : Day2eeram = 1
M3eeram = 0 : H3eeram = 0 : Day3eeram = 1
M4eeram = 0 : H4eeram = 0 : Day4eeram = 1
'-------------------------
M1ofeeram = 0 : H1ofeeram = 0 : Day1ofeeram = 1
M2ofeeram = 0 : H2ofeeram = 0 : Day2ofeeram = 1
M3ofeeram = 0 : H3ofeeram = 0 : Day3ofeeram = 1
M4ofeeram = 0 : H4ofeeram = 0 : Day4ofeeram = 1
'----------------------------------
End If
Dim State As String * 9
Dim Today(7) As String * 9
Today(1) = "FRIDAY "
Today(2) = "SATURDAY "
Today(3) = "SUNDAY "
Today(4) = "MONDAY "
Today(5) = "TUESDAY "
Today(6) = "WEDNESDAY"
Today(7) = "THUSRDAY "
Day = 1 : H0 = 0 : M0 = 0 : S0 = 0
'-------------------------
'-------------------------
M1 = M1eeram : H1 = H1eeram : Day1 = Day1eeram
M2 = M2eeram : H2 = H2eeram : Day2 = Day2eeram
M3 = M3eeram : H3 = H3eeram : Day3 = Day3eeram
M4 = M4eeram : H4 = H4eeram : Day4 = Day4eeram
'-------------------------
M1of = M1ofeeram : H1of = H1ofeeram : Day1of = Day1ofeeram
M2of = M2ofeeram : H2of = H2ofeeram : Day2of = Day2ofeeram
M3of = M3ofeeram : H3of = H3ofeeram : Day3of = Day3ofeeram
M4of = M4ofeeram : H4of = H4ofeeram : Day4of = Day4ofeeram
تا اینجا تمامی متغییر ها را تعریف کردیم. در مورد متغییر state هم در ادامه صحبت میکنیم.
حال بایستی تنظیمات مربوط به تعریف پایه های ورودی و خروجی را انجام دهیم . برای تنظیمات ساعت نیاز به 4 کلید داریم که آنها را به پایه های c.0 تا c.3 متصل میکنیم و همچنین یک رله و led را نیز باید روشن و خاموش کنیم که این دو را نیز به پایه c.4 متصل میکنیم و این پایه را خروجی در نظر میگیریم
در ادامه تنظیمات مربوط به پرت های ورودی و خروجی و همچنین تایمر و lcd را میتوانید مشاهده کنید .
Config Lcdpin = Pin , Db7 = Portb.7 , Db6 = Portb.6 , Db5 = Portb.5 , _
Db4 = Portb.4 , E = Portb.3 , Rs = Portb.2
Config Lcd = 16 * 2
Config Timer1 = Timer , Prescale = 256
Config Portc.0 = Input
Config Portc.1 = Input
Config Portc.2 = Input
Config Portc.3 = Input
Config Portc.4 = Output
Config Portc.5 = Output
Ss Alias Pinc.0
Mi Alias Pinc.1
Ho Alias Pinc.0
Da Alias Pinc.2
Ok Alias Pinc.3
نحوه اتصال کلید ها و led و رله را نیز در تصویر زیر مشاهده میکنید.
توجه داشته باشید که میکروکنترلر به تنهایی قادر به تحریک سیم پیچ رله نمی باشد و برای این کار نیاز به یک مدار ترانزیستوری داریم که در بالا میتوانید مشاهده کنید . این مدار در عمل به صورت زیر پیاده سازی شده است.
شکل7-نمایی از مدار
و مدار نهایی را نیز در ادامه میتوانید مشاهده کنید
شکل8-نمایی از مدار
شکل9-شماتیک مدار
حال در تنظیمات اولیه تنها بخش باقی مانده تنظیم زیر برنامه هایی است که در این کد از آنها استفاده میکنیم.
برای این کد به یک برنامه برای چک کردن کلید ها ، یک برنامه برای تغییر زمان ها و یک برنامه نیز برای نمایش ساعت فعلی روی lcd نیاز داریم .
Declare Sub Key
Declare Sub Display_lcd
Declare Sub Time_change
حال به سراغ برنامه اصلی میرویم. برنامه main را به اینصورت تغییر میدهیم .
Main:
Cls
Do
Call Display_lcd
Call Key
Loop
End
در اینجا به کرات ساعت نمایش داده میشود و هر بار به زیر برنامه key فراخوانده میشود تا در صورتی که کلیدی فشار داده شود ما اطلاع یابیم .
در زیر برنامه key دو کلید چک میشود. اول کلید Ss که در صورت فشرده شدن مقدار ثانیه شمار را صفر میکند و دوم کلید ok را . در صورتی که کلید ok فشار داده شد برنامه به حالت تغییر زمان میرود. اگر یک بار ابن کلید را فشار دهیم میتوانیم زمان فعلی را با استفاده از کلید های Mi و Ho و Da تغییر دهیم. اگر بار دوم فشار دهیم با استفاده از همین کلید ها زمان روشن شدن برای تایم اول را میتوانیم تنظیم کنی، بار سوم زمان خاموش شدن برای تایمر یک و همینطور تا بار نهم که زمان خاموش شدن برای تایم چهارم را با آن میتوانیم تنظیم کنیم.
و با فشار دادن کلید برای بار دهم برنامه تمام زمانهای موجود را در حافظه ماندگار خود ذخیره میکند و به روال عادی برنامه بر میگردد و زمان فعلی را نشان میدهد
زیر برنامه های key و change_time و display_lcd رو در ادامه میتونید مشاهده کنید.
'###############################################################################
Sub Key:
If Ss = 0 Then
Waitms 50
If Ss = 1 Then Goto Down
Ups:
S0 = 0
Call Display_lcd
If Ss = 0 Then Goto Ups
Waitms 50
If Ss = 0 Then Goto Ups
End If
If Ok = 0 Then
Waitms 50
If Ok = 1 Then Goto Down
Cls
Lcd "Ok"
Okk:
If Ok = 0 Then Goto Okk
Waitms 50
If Ok = 0 Then Goto Okk
'-------------------------------
State = "R_Time "
Mt = M0 : Ht = H0 : Dayt = Day
Call Time_change
M0 = Mt : H0 = Ht : Day = Dayt
'------------------------------
State = "Time 1_on"
Mt = M1 : Ht = H1 : Dayt = Day1
Call Time_change
M1 = Mt : H1 = Ht : Day1 = Dayt
' ''''''''''''''''''''''''''''''''
State = "Time 1_of"
Mt = M1of : Ht = H1of : Dayt = Day1of
Call Time_change
M1of = Mt : H1of = Ht : Day1of = Dayt
'-------------------------------
State = "Time 2_on"
Mt = M2 : Ht = H2 : Dayt = Day2
Call Time_change
M2 = Mt : H2 = Ht : Day2 = Dayt
'''''''''''''''''''''''''''''''''
State = "Time 2_of"
Mt = M2of : Ht = H2of : Dayt = Day2of
Call Time_change
M2of = Mt : H2of = Ht : Day2of = Dayt
'---------------------------------
State = "Time 3_on"
Mt = M3 : Ht = H3 : Dayt = Day3
Call Time_change
M3 = Mt : H3 = Ht : Day3 = Dayt
''''''''''''''''''''''''''''''''''
State = "Time 3_of"
Mt = M3of : Ht = H3of : Dayt = Day3of
Call Time_change
M3of = Mt : H3of = Ht : Day3of = Dayt
'--------------------------------
State = "Time 4_on"
Mt = M4 : Ht = H4 : Dayt = Day4
Call Time_change
M4 = Mt : H4 = Ht : Day4 = Dayt
'''''''''''''''''''''''''''''''''
State = "Time 4_of"
Mt = M4of : Ht = H4of : Dayt = Day4of
Call Time_change
M4of = Mt : H4of = Ht : Day4of = Dayt
'--------------------------------
End If
'=======================================================================
M1eeram = M1 : H1eeram = H1 : Day1eeram = Day1
M2eeram = M2 : H2eeram = H2 : Day2eeram = Day2
M3eeram = M3 : H3eeram = H3 : Day3eeram = Day3
M4eeram = M4 : H4eeram = H4 : Day4eeram = Day4
'-------------------------
M1ofeeram = M1of : H1ofeeram = H1of : Day1ofeeram = Day1of
M2ofeeram = M2of : H2ofeeram = H2of : Day2ofeeram = Day2of
M3ofeeram = M3of : H3ofeeram = H3of : Day3ofeeram = Day3of
M4ofeeram = M4of : H4ofeeram = H4of : Day4ofeeram = Day4of
'----------------------------------
Down:
Return
End Sub
'###############################################################################
Sub Display_lcd:
Locate 1 , 1 : Lcd H0 ; ":" ; M0 ; ":" ; S0 ; " "
Locate 2 , 1 : Lcd Today(day)
Return
End Sub
'###############################################################################
Sub Time_change:
Cls
Locate 1 , 1 : Lcd Ht ; ":" ; Mt ; ":" ; "00 " ; Today(dayt)
Locate 2 , 1 : Lcd State ; " change"
Waitms 50
Do
Mi1:
If Mi = 0 Then
Waitms 50
If Mi = 1 Then Goto Mi1
Mt = Mt + 1
If Mt = 60 Then Mt = 0
Cls
Locate 1 , 1 : Lcd Ht ; ":" ; Mt ; ":" ; "00 " ; Today(dayt)
Locate 2 , 1 : Lcd State ; " change"
Mi2:
If Mi = 0 Then Goto Mi2
Waitms 50
If Mi = 0 Then Goto Mi2
End If
'=================================
Ho1:
If Ho = 0 Then
Waitms 50
If Ho = 1 Then Goto Ho1
Ht = Ht + 1
If Ht = 24 Then Ht = 0
Cls
Locate 1 , 1 : Lcd Ht ; ":" ; Mt ; ":" ; "00 " ; Today(dayt)
Locate 2 , 1 : Lcd State ; " change"
Ho2:
If Ho = 0 Then Goto Ho2
Waitms 50
If Ho = 0 Then Goto Ho2
End If
'================================
Da1:
If Da = 0 Then
Waitms 50
If Da = 1 Then Goto Da1
Dayt = Dayt + 1
If Dayt = 8 Then Dayt = 1
Cls
Locate 1 , 1 : Lcd Ht ; ":" ; Mt ; ":" ; "00 " ; Today(dayt)
Locate 2 , 1 : Lcd State ; " change"
Da2:
If Da = 0 Then Goto Da2
Waitms 50
If Da = 0 Then Goto Da2
End If
'===============================
Ok1:
If Ok = 0 Then
Waitms 50
If Ok = 1 Then Goto Ok1
Cls
Lcd "ok"
Ok2:
If Ok = 0 Then Goto Ok2
Waitms 50
If Ok = 0 Then Goto Ok2
Exit Do
End If
Loop
Return
End Sub
'###############################################################################
تا اینجا تمامی زمان ها و تایمر ها را تنظیم کردیم. حال بایستی به میکرو دستور دهیم که در زمان های مقرر رله و led را خاموش و روشن کند . برای این کار باستی شرط قرار دهیم که هر بار به زمان های مقرر رسیدیم میکرو کنترلر پایه c.4 را که به رله و led متصل است را روشن و یا خاموش کند. از این جهت زیر برنامه وقفه تایمر که هر یک ثانیه اجرا میشود را به این صورت تغییر میدهیم .
'###############################################################################
Second:
Timer1 = 65536 - 32768
Incr S0
If S0 = 60 Then
Incr M0
S0 = 0
End If
If M0 = 60 Then
Incr H0
M0 = 0
End If
If H0 = 24 Then
H0 = 0
Incr Day
If Day > 7 Then Day = 1
End If
'--------------------------------------------------
If M1 = M0 And H1 = H0 And Day1 = Day Then
Set Portc.4
End If
'-------------------------------------------
If M1of = M0 And H1of = H0 And Day1of = Day Then
Reset Portc.4
End If
'-------------------------------------------
If M2 = M0 And H2 = H0 And Day2 = Day Then
Set Portc.4
End If
'-------------------------------------------
If M2of = M0 And H2of = H0 And Day2of = Day Then
Reset Portc.4
End If
'-------------------------------------------
If M3 = M0 And H3 = H0 And Day3 = Day Then
Set Portc.4
End If
'-------------------------------------------
If M3of = M0 And H3of = H0 And Day3of = Day Then
Reset Portc.4
End If
'-------------------------------------------
If M4 = M0 And H4 = H0 And Day4 = Day Then
Set Portc.4
End If
'-------------------------------------------
If M4of = M0 And H4of = H0 And Day4of = Day Then
Reset Portc.4
End If
Return
End
'###############################################################################
چک کردن شرط ها را از این جهت درون این زیر برنامه گذاشتیم تا هر یک ثانیه چک شوند و در صورتی که به زمان مقرر رسیدیم عملکرد مورد نظر انجام شود.
تا اینجا کار ساخت و برنامه نویسی دستگاه به پایان رسیده است. حال کافی است که 220 ولت برق شهر را به common رله متصل کرده و خروجی no را به دستگاه مورد نظرمان وصل کنیم تا در زمان های مقرر روشن و خاموش شوند.
تنها نگته باقی مانده در اینجا این است که در این پروژه ما از portc به عنوان GPIO (ورودی و خروجی ) استفاده کرده ایم و باید به این نکته توجه کنیم که در همچین مواردی و برای اینکه دستگاه به درستی عمل کند بایستی هنگام پروگرم کردن دستگاه فیوزبیت JTAG را غیر فعال (یا همان 1) کنیم .(فیزبیت های AVR در حالت 1 غیر فعال هستند).
در ویدیو زیر عملکرد سیستم به صورت کامل شرح داده شده است.
جدول1: هزینه ها
شماره | نام وسیله | تعداد | محل تهیه | قیمت(ریال) |
1 | برد برد | 2 | فروشگاه های الکترونیکی موجود در بازار | 85000 |
2 | برد هزار سوراخ | 1 | ,, | 30000 |
3 | میکروATmega 32 | 1 | ,, | 80000 |
4 | LCD-text | 1 | ,, | 80000 |
5 | ترانزیستور 2N2222 | 1 | ,, | 1000 |
6 | ترانزیستور TIP41 | 1 | ,, | 5000 |
7 | منبع تغذیه | 1 | ,, | 100000 |
8 | میکرو سوییچ | 4 | ,, | 500 |
9 | خازن عدسی 100pf | 2 | ,, | 500 |
10 | پتاسیم متر50k | 1 | ,, | 500 |
11 | مقاومت های 10k(4),1k(3) | 7 | 500 | |
مجموع | 473000 |
دیتا شیت Atmega32:
بروی لینک زیر کلیک کنید
دیتا شیت LCD 16*2:
بروی لینک زیر کلیک کنید
دیتا شیت ترانزیستور TIP41:
بروی لینک زیر کلیک کنید
دیتا شیت ترانزیستور 2N2222:
بروی لینک زیر کلیک کنید
دیتا شیت رگولاتور 7805:
بروی لینک زیر کلیک کنید
فایل شماتیک مدار:
بروی لینک زیر کلیک کنید
فایل نرم افزای مدار:
بروی لینک زیر کلیک کنید
فایل فلوچارت نرم افزار مدار:
بروی لینک زیر کلیک کنید