مقدمه:
برای اندازهگیری دما و رطوبت سنسورهای مختلفی در بازار وجود دارد. سنسورهای پک شده دما و رطوبت شرکت سوئیسی سنسیریون SENSIRION یکی از دقیقترین و در عین حال ارزانترین سنسورهای موجود در بازار است. این سنسورها در چند خانواده تولید میشود. اولین خانواده آنها سری SHT1x بود مثل SHT10 و SHT11 که این سنسورها هم اکنون منسوخ شدهاند. سری بعدی SHT2x میباشد. این سری شامل SHT20 و SHT21 و SHT25 بوده که در حال حاضر سنسور SHT20 پرکاربرد ترین سنسور بشمار میرود. سنسورهای دیگر این شرکت خانواده SHT3x شامل SHT30 و SHT31 و SHT35 بوده که نسل سوم بوده و دقیقتر هستند و سنسور نسل 4 یعنی SHT40 نیز به تازگی وارد بازار شده است. ما در این آموزش قصد داریم به نحوه راهاندازی پرکاربردترین سنسور این شرکت یعنی SHT20 بپردازیم. این کد و شماتیک روی SHT21 و SHT25 نیز قابل استفاده است.
سنسور SHT20
سنسور دما و رطوبت SHT20 یک سنسور دقیق با ولتاژ کاری 3.3 ولت و پروتکل ارتباطی I2C میباشد. این پروتکل در بسکام به دلیل مسائل مربوط به نام تجاری فیلیپس به TWI تغییر نام پیدا کرده ولی در عمل همان I2C است. نکته مهم سنسور SHT20 ولتاژ تغذیه و ولتاژ پایههای SCL و SDA میباشد که نباید از 3.3 ولت بیشتر شود. به همین دلیل میکروکنترلر ATmega8A را با ولتاژ 3.3 ولت راه اندازی میکنیم. چون از LCD 2×16 در این پروژه استفاده شده، ولتاژ LCD را 5 ولت میدهیم. دقت دمای این سنسور حدود 0.3 درجه سانتیگراد و دقت رطوبت آن در حدود 3% میباشد.
شماتیک
برای راه اندازی سنسور SHT2x از شماتیک زیر استفاده میکنیم. در این شماتیک از میکروکنترلر ATmega8a از خانواده AVR استفاده شده است.
سورس بسکام BASCOM
در این قسمت سورس راه اندازی سنسور SHT20 یا SHT21 یا SHT25 با زبان بیسیک و کامپایلر بسکام (BASCOM) آورده شده است. ما در این برنامه دو تابع به نام Sht2x_temp برای دریافت دما و Sht2x_hygro برای دریافت رطوبت نوشتهایم. خروجی این توابع از نوع Single اعشاری با دقت 2 رقم اعشار میباشد. با دستور Config Single = Scientific , Digits = 2 میتوان دقت ارقام اعشاری را محدود کرد تا ارقام اضافه دست و پاگیر نباشد. با توجه به این که دقت دمای این سنسور 14 بیتی است میتواند دما را تا صدم اعشار نشان دهد و رقم صدم به طور دقیق یک رقم یک رقم تغییر میکند. در بخش رطوبت نیز دقت 12 بیتی بوده و میتوان صدم را نمایش داد اما رقم صدم چند واحد چند واحد جابجا میشود و بهتر است رطوبت با یک رقم اعشار نمایش داده شود.
ما این کد را با Config Submode = New نوشتهایم که در این حالت نیازی به Declare کردن توابع نیست اما محتوای توابع باید در ابتدای کد نوشته شود. در داخل توابع نیز از دستورات I2C برای ارتباط گیری با سنسور و صدور فرمان تبدیل و دریافت آن بهره گرفتهایم. توجه داشته باشید که در بین دستورات I2C نیازی به نوشتن تاخیر نبوده و خود سنسور بعد از دستور I2cwbyte در حدود 20 میلی ثانیه خط SCL را پایین (Low) نگه میدارد و عملیات تبدیل را انجام داده سپس محتوا را برای میکرو میفرستد:
ما در این کد از I2C نرم افزاری استفاده کردهایم که روی هر پایه دلخواه میکرو قابل اجرا است، با این حال کد را به گونهای ایجاد کردهایم که براحتی میتوانید با مقداردهی I2c_select = 1 از I2C سخت افزاری استفاده نمایید. در پایان مقادیر دما و رطوبت خوانده شده و بر روی LCD نمایش داده شده است.
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 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
'SHT20 1403/06/31 'AVR64.com $regfile = "m8adef.dat" $crystal = 4000000 $hwstack = 64 $swstack = 64 $framesize = 64 '$prog &HFF , &HA4 , &HD1 Config Submode = New '*********************************** Const/Vars ******************************** Dim Hygro_temp As Word Dim B(2) As Byte At Hygro_temp Overlay Dim Temp , Humidity , S As Single '************************************ Functions ******************************** Function Sht2x_temp() As Single I2cstart I2cwbyte Sht2x_w I2cwbyte &HE3 I2cstart I2cwbyte Sht2x_r I2crbyte B(2) , Ack I2crbyte B(1) , Nack I2cstop Hygro_temp = Hygro_temp And &B11111111_11111100 Temp = Hygro_temp * 175.72 Temp = Temp / 65536 Temp = Temp - 46.85 Sht2x_temp = Temp End Function '--------------------------------------------------- Function Sht2x_hygro() As Single I2cstart I2cwbyte Sht2x_w I2cwbyte &HE5 I2cstart I2cwbyte Sht2x_r I2crbyte B(2) , Ack I2crbyte B(1) , Nack I2cstop Hygro_temp = Hygro_temp And &B11111111_11111100 Humidity = Hygro_temp * 125 Humidity = Humidity / 65536 Humidity = Humidity - 6 Sht2x_hygro = Humidity End Function '*************************************** LCD *********************************** Deflcdchar 0 , 8 , 20 , 8 , 3 , 4 , 4 , 4 , 3 'C Config Lcdpin = Pin , Rs = Portb.5 , E = Portb.4 , _ Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0 Config Lcd = 16 * 2 Cursor Off Noblink Cls Lcd "SHT20,21,25" Wait 1 Cls '************************************* SHT20 ********************************* Config Single = Scientific , Digits = 2 Const Sht2x_w = &H80 Const Sht2x_r = &H81 Const I2c_select = 0 '0:Software I2C, 1:TWI #if I2c_select = 0 'software I2C Config I2cdelay = 10 'SCL clock 40khz Config Scl = Portd.0 'SCL Config Sda = Portd.1 'SDA I2cinit 'Initialize #else $lib "i2c_twi.lib" 'hardware I2C/TWI library. Config Twi = 100000 'I2C bus clock = 100KHz Config Scl = Portc.5 'SCL pin name. Config Sda = Portc.4 'SDA pin name. I2cinit 'Initialize #endif '************************************* main Loop ******************************* Do S = Sht2x_temp() Home Lcd "T=" ; S ; Chr(0) ; Spc(3) If Err = 1 Then Locate 1 , 12 : Lcd "Err " Else Locate 1 , 12 : Lcd "SHT20" End If S = Sht2x_hygro() Lowerline Lcd "H=" ; S ; "% " Locate 2 , 12 : Lcd "AVR64" Waitms 200 Loop End |
نتیجه گیری
سنسور SHT20 یکی سنسور خوب و صنعتی برای اندازه گیری دما و رطوبت میباشد، ما سالهاست که از این سنسور در طراحی بردهای کنترلر دما و رطوبت خود با برند نوین کیت استفاده میکنیم. در این آموزش یادگرفتید که چگونه سنسور دما و رطوبت SHT20 یا SHT21 یا SHT25 را راه اندازی و در پروژههای خود استفاده نمایید.
بازدیدها: 4