مقدمه:
در مقاله پیدا کردن سریال سنسور DS18B20 به نحوه دستیابی به شماره سریال منحصر به فرد سنسور دمای DS18B20 پرداختیم و در آن جلسه قول دادیم که در آموزشی به نحوه اتصال چند سنسور دما به میکروکنترلر AVR با کامپایلر بسکام بپردازیم. در این جلسه قصد داریم دو سنسور دمای دیجیتال DS18B20 را به میکروکنترلر ATmega8 از خانواده AVR متصل کرده و دمای هریک را بصورت جداگانه بخوانیم.
پیش نیاز:
برای اتصال چند سنسور به AVR ابتدا باید شماره سریال سنسورها را بدانیم، بنابراین نیاز است که یک بار دیگر مدار جلسه پیدا کردن سریال سنسور DS18B20 را ببندید و هر بار یکی از سنسورها را به میکرو وصل کرده و مدار را روشن کنید و شماره سریال نمایش داده شده روی LCD را روی یک کاغذ چاپ کرده و به بدنه سنسور بچسبانید.
سخت افزار:
سنسورهای دمای DS18B20 را مطابق نقشه زیر به میکروکنترلر ATmega8A از خانواده AVR متصل کنید:
برنامه میکرو:
در این قسمت برنامه بسکام Bascom را برای اتصال چند سنسور به AVR مشاهده میفرمایید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
$regfile = "m8adef.dat" $crystal = 8000000 Config Lcdpin = Pin , Rs = Pinc.5 , E = Pinc.4 , Db4 = Pinc.3 , Db5 = Pinc.2 , _ Db6 = Pinc.1 , Db7 = Pinc.0 Config Lcd = 16 * 2 Deflcdchar 0 , 2 , 5 , 2 , 32 , 32 , 32 , 32 , 32 Config 1wire = Portb.1 Cls Cursor Off Dim Arr(9) As Byte Dim X As Integer Dim Y As Single Dim Reg_no_1(8) , Reg_no_2(8) As Byte Dim I As Byte Reg_no_1(1) = &H28 Reg_no_1(2) = &HFF Reg_no_1(3) = &H64 Reg_no_1(4) = &H1F Reg_no_1(5) = &H5C Reg_no_1(6) = &H60 Reg_no_1(7) = &H9C Reg_no_1(8) = &HCC Reg_no_2(1) = &H28 Reg_no_2(2) = &HFF Reg_no_2(3) = &H64 Reg_no_2(4) = &H1F Reg_no_2(5) = &H5D Reg_no_2(6) = &HB1 Reg_no_2(7) = &H22 Reg_no_2(8) = &HD6 'wait for sensors boot Wait 1 Do 1wreset 1wwrite &HCC 1wwrite &H44 Wait 1 'sensor 1 1wverify Reg_no_1(1) Home If Err = 0 Then 1wwrite &HBE Arr(1) = 1wread(9) Wait 1 If Arr(9) = Crc8(arr(1) , 8) Then X = Makeint(arr(1) , Arr(2)) Y = X / 16 Lcd Fusing(y , "#.&") ; Chr(0) ; "C - S1" ; Spc(2) Else Lcd "sensor failure 1" End If Else Lcd " no sens 1 " End If 'sensor 2 1wverify Reg_no_2(1) Lowerline If Err = 0 Then 1wwrite &HBE Arr(1) = 1wread(9) Wait 1 If Arr(9) = Crc8(arr(1) , 8) Then X = Makeint(arr(1) , Arr(2)) Y = X / 16 Lcd Fusing(y , "#.&") ; Chr(0) ; "C - S2" ; Spc(2) Else Lcd "sensor failure 2" End If Else Lcd " no sens 2 " End If Loop End |
در این برنامه در ابتدا به تعیین نام میکرو و فرکانس کاری پرداختهایم، سپس پایههای LCD و سنسور DS18B20 را مشخص کردهایم. در بخش بعدی متغیرها را تعریف کردهایم. در اینجا دو متغیر مهم از نوع آرایه بایتی به نام Reg_no_1 و Reg_no_2 داریم. هر کدام از این متغیرها را باید با شماره سریال یکی از سنسورها پر کنیم. بدین ترتیب که مطابق کد بالا در هر خانه دو رقم (8 بایت) از سریال سنسور (64 بیتی) را که در مرحله قبل بدست آورده بودیم جایگزین میکنیم.
در حلقه برنامه با ارسال جفت دستور HCC و H44 به تمام سنسورهای روی خط مشترک فرمان میدهیم که عملیات خوانش و تبدیل دما را آغاز کنند. این کار حدود 750 میلیثانیه طول میکشد، به همین دلیل 1 ثانیه صبر میکنیم. سپس با دستور 1wverify که درجلوی آن آرایه سریال سنسور اول قرار دارد بررسی میکنیم که آیا سنسور مورد نظر به میکرو متصل است یا خیر اگر نباشد متغیر سراسری Err برابر با 1 میشود. با دستور HBE به سنسور مورد نظر فرمان میدهیم که اطلاعاتش را برای میکرو ارسال کند.
با دستور 1wread مقدار 9 بایت از اطلاعات دریافتی را خوانده و پس از چک کردن CRC و انجام تبدیلات لازم و فرمت بندی دما را استخراج کرده و روی خط اول LCD نشان میدهیم. اگر اطلاعات غلط بود عبارت sensor failure و اگر سنسور کلا وجود نداشت عبارت no sens را چاپ میکنیم. این کار برای سنسور دوم نیز با سریال خودش تکرار میشود و از لحاظ تئوری محدودیتی در تعداد سنسورها وجود ندارد مگر اینکه در عمل حالت خازنی یا کسری ولتاژ روی کابلها بوجود آید.
تمرین:
1- بجای Lcd Fusing(y , “#.&”) در ابتدای برنامه دستور Config Single = Scientific , Digits = 1 را بنویسید تا دقت ممیز شناور متغیر single کلا یک رقمی شود و نیاز به فرمت های پیچیده نداشته باشیم.
2- این برنامه را با 4 سنسور پیاده سازی کنید.
نتیجهگیری:
ما در این مقاله یادگرفتیم که چگونه تعداد زیادی سنسور DS18B20 را به یک پایه از میکروکنترلر AVR متصل کنیم و با Bascom برای خواندن آنها برنامه بنویسیم. با کمک این روش براحتی و با صرف هزینه کم میتوان دمای نقاط مختلف یک مکان یا چند سالن را اندازه گیری کرد و در وقت و هزینه صرفه جویی نمود.
بازدیدها: 9