11 لایک
-
4
Post By parsd
-
1
Post By magmagmary
-
1
Post By shobeir90
-
1
Post By parsdc
-
2
Post By parsdc
-
2
Post By parsdc
-
آموزش کامل راه اندازی bmp280
در این آموزش قصد دارم راه اندازی کامل سنسور bmp280 شرح دهم به شکلی که افراد مبتدی هم بتونن باهاش کار کنند، من قصد ندارم کد آماده بزارم و توضیح کامل میزارم تا هرکس برا خودش از رو مطالب کدها رو بنویسه به هر زبانی
ابتدا مشخصات سنسور
این سنسور فشار و دما رو اندازه گیری میکنه
دقت دما 0.01°C
دقت فشار 0.16 Pa
مناسب برای فشار محیط
سنسور از دو نوع پروتکل ارتباطی پشتیبانی میکنه spi و i2c
در این آموزش ما با پروتکل i2c کا خواهیم کرد.
نام پایه های سنسور روی برد
vcc
gnd
sdi
sck
csb
sdo
پایه vcc به ولتاژ +3.3 ولت وصل کنید، پایه gnd رو به زمین ،پایه sdi را به پایه SDA میکروکنترلر و با یک مقاومت 4.7 پول آپ کنید (به مثبت وصل کنید) پایه sck را به پایه SCL در میکروکنترل وصل کنید و با مقاومت 4.7 کیلو به مثبت وصل کنید
پایه csb را با مقاومت 4.7 کیلو به مثبت وصل کنید و پایه sdo را نیز با مقاومت 4.7 کیلو به مثبت وصل کنید.
توضیح پایه ها:
sdi و sda دو خط ارتباطی i2c هستند که با میکرو ارتباط برقرار خواهند کرد
پایه csb باید به مثبت وصل باشه تا سنسور از مد spi به i2c بره( این پایه خیلی مهم هست که درست وصل بشه)
پایه sdo وقتی به مثبت وصل باشه باعث یک شدن بیت شماره یک از آدرس سخت افزاری خواهد شد، پس میشه دو سنسور رو با دو آدرس متفاوت در یک خط i2c داشت ، اما ما فعلا با حالتی که به مثبت وصل هست کار خواهیم کرد (اطلاعات بیشتر در صفحه 29 از دیتاشیت)
تا الان ما میکرو و سنسور رو به درستی وصل کردیم
حالا بریم سروقت نرم افزار و راه اندازی
آدرس سخت افزاری برا نوشتن روی سنسور EE هست یا 11101110
آدرس سخت افزاری برای خواندن روی سنسور EF هست یا 11101111
جهت راه اندازی سنسور در مدی که مد نظر ما است دو بایت به آدرس F4 و F5 را باید برنامه ریزی کنیم و تا این دو بیت را برنامه ریزی کنیم سنسور شروع به کار خواهد کرد و ما قادر خواهیم بود اطلاعات خام فشار و دما را بخونیم
در ادامه خواهم گفت چطور اطلاعات خام رو به اعداد دقیق دما و فشار تبدیل کنیم
فعلا بریم سراغ ّF4 و F5
از طریق پروتکل i2c ابتدا f5 رو برنامه ریزی میکنیم
بیت شماره صفر را برابر با صفر میزاریم این بیت اشاره داره به غیر فعال بودن پروتکل spi
بیت شماره یک را برابر با صفر قرار میدیم این بیت به هیچ چیزی اشاره نداره و در کار سنسور بی اثر است
بیت شماره 2 و 3 و 4 اشاره داره به فعال بودن فیلتر نرم افزاری در سنسور و فعلا ما همه اونا رو میزاریم صفر تا فیلتر غیرفعال بشه
بیت شماره 5 و 6 و7 که خیلی در راه اندازی مهم هست رو میزاریم رو 010 در این حالت سنسور هر 125 میلی ثانیه یک بار نمونه گیری رو انجام میده و دما و فشار رو میخونه و در آدرس مربوطه ذخیره میکنه
شما میتونید 0.5 میلی ثانیه تا 4 ثانیه مدت زمان نمونه گیری را تنظیم کنید با این سه بیت (اطلاعات دقیقتر صفحه 17 جدول 11)
پس مقدار F5 شد 01000000 یا بر مبنای هگز 40
و حالا بریم سراغ برنامه ریزی آدرس f4
بیت شماره صفر و بیت شماره یک از مهمترین بیتها در راه اندازی این سنسور هستند و مربوط به Power modes هستند
این سنسور سه حالت Power modes داره که با این دو بیت مشخص میشه ما حالت نرمال رو نیاز داریم و برا انتخاب این حالت هر دو بیت رو یک میکنیم(اطلاعات سایر حالات در صفحه 15 جدول 10)
بیت شماره 2 و 3 و 4 مربوط به دقت اندازه گیری فشار هست جهت 16 تا 20 بیتی(حالات مختلف صفحه 12 جدول 4) چون در فایل دیتاشیت فراموش شده حالت مختلف بیتها رو برا فشار بنویسه که شما بتونید 16 بیتی یا 17 یا 18 یا 19 و یا 20 بیتی رو انتخاب کنید میتونید دقیقا مثل جدول دما بیت ها رو برا فشار تنظیم کنید از صفحه 13 جدول 5
زیاد موضوع رو پیچیده نکنیم ما با 16 بیتی کار میکنیم پس این 3 بیت رو میزاریم رو 001
و بیت شماره 5 و 6 و7 مربوط به دقت دما هست که اون هم تنظیم میکنیم رو 001 تا 16 بیتی خونده بشه
پس مقدار برا آدرس f4 شد 00100111 یا بصورت هگز 27
حالا مقدار f4 و f5 رو مشخص کردیم که باید مقادیر رو بریزیم در آدرس f4 و آدرس f5
سنسور شروع به کار میکنه تا این مقادیر رو ست کردیم و مقدار خام دما و فشار رو میریزه داخل آدرس مربوطه و ما میتونیم اونا رو بخونیم
------------------------------------
برا خوندن دما کافیه آدرس FA و FB بخونیم (در بالا ما دما رو 16 بیت تنظیم کردیم اگر دما رو بیش از 16 بیت تنظیم کرده بودیم باید مقدار آدرس FC رو هم بخونیم که فقط بیت 4و 5 و6 و7 مقدار دارند و بیتهای پاینتر صفر هستند)
جهت اطلاعات بیشتر جدول 18 از صفحه 24 رو ببینید قسمت زرد رنگ
خوب ما مقدار fa و fb رو خونیدیم هشت بیت fa از ارزش بالاتری نسبت به fb برخوردار هست
اگه خط بالا رو متوجه نشید این کار رو بکنید مقدار fa را در 255 ضرب کنید و حاصل رو با مقدار fb جمع کنید حاصل عدد خام دما هست و تا اینجا شما دما رو خوندید ولی مقدار خام آن
---------------------------------
برا خوندن فشار کافیه آدرس F7 و F8 بخونیم (در بالا ما فشار رو 16 بیت تنظیم کردیم اگر فشار رو بیش از 16 بیت تنظیم کرده بودیم باید مقدار آدرس F9 رو هم بخونیم که فقط بیت 4و 5 و6 و7 مقدار دارند و بیتهای پاینتر صفر هستند)
جهت اطلاعات بیشتر جدول 18 از صفحه 24 رو ببینید قسمت زرد رنگ
خوب ما مقدار f7 و f8 رو خونیدیم هشت بیت f7 از ارزش بالاتری نسبت به f8 برخوردار هست
اگه خط بالا رو متوجه نشید این کار رو بکنید مقدار f7 را در 255 ضرب کنید و حاصل رو با مقدار f8 جمع کنید حاصل عدد خام فشار هست و تا اینجا شما دما رو خوندید ولی مقدار خام آن
----------------------------------
خوب ما با این روش به راحتی سنسور رو راه اندازی کردیم و مقدار خام دما و فشار خوندیم
چند نکته وقتی دارید دما و فشار رو میخونید از طریق i2c نباید آدرس ها رو تک تک بخونید و باید پشت سر هم بایتها خونده بشن این توصیه سازنده هست و دلیل اون هم در دیتاشیت توضیح داده
برا نوشتن مقدار در یک بایت میتونید تکی یک بایت رو بنویسید و اگر نخواستید i2c رو stop کنید و دو بایت پشت سر هم بنویسید یه نکته ظریف داره که باید به این شکل عمل بشه
start
آدرس سخت افزاری برا نوشتن که EE هست
آدرس نرم افزاری (محلی که قصد نوشتن در آن رو داریم) مثلا F4
مقداری که قصد ذخیره در f4 رو داریم
آدرس نرم افزاری دوم که قصد نوشتن در آن رو داریم (مثلا f5) حتی اگر آدرسها پشت سر هم باشند باید آدرس نوشته بشه
مقداری که قصد داریم در آدرس f5 بنویسیم
و stop
جهت اطلاعات بیشتر صفحه 29
------------------------------------------
خوب ما تا اینجا سنسور رو راه اندازی و مقدار خام دما و فشار رو خوندیم
مرحله بعد که در پست بعدی خواهم گذاشت
شیوه تبدیل مقدار خام دما به مقدار دقیق سانتیگراد هست که دمای واقعی محیط هست و دقت این سنسور شما رو شگفتزده خواهد کرد
دوستان من این سنسور رو راه اندازی و استفاده کردم ، همه اطلاعات من تست شده و طبق دیتاشیت سازنده هست
در پست بعدی دستورات بسکام هم خواهم گذاشت جهت راه اندازی و خوندن دمای واقعی
جهت تهیه سنسور
http://shop.aftabrayaneh.com/Sensors...or_Module.html
ویرایش توسط parsd : 05-27-2016 در ساعت 05:49 PM
-
-
خیلی ممنون
دقیقا متوجه شدم چطور باهاش کار کنم
عالی
-
خوب بریم سراغ ادامه موضوع
من قسمت های بالا را بصورت برنامه نویسی توضیح دوباره میدم
Const Ic_w = &HEE
Const Ic_r = &HEF
تعریف دو متغییر که در واقع آدرس سخت افزاری برا نوشتن و دیگری آدرس سخت افزاری برا خوندن هست
I2cstart
I2cwbyte Ic_w
I2cwbyte &HF4
I2cwbyte &B11111111
I2cwbyte &HF5
I2cwbyte &B10011100
I2cstop
Waitms 50
دستورات بالا تنظیمات آدرس f5 و F4 را در سنسور نوشته و باعث راه اندازی میشود که در بالا توضیح داده شد و من یه تغییر کوچولو در f5 دادم و بیت شماره 2,3,4 را یک کردم تا فیلتر فشار فعال باشه
دوستان من تست کردم فعال بودن این فیلتر بسیار در نتیجه خروجی فشار تاثیر داره و نوسانات و نویز را کامل از بین میبره
تغیراتی هم در f4 دادم تا داده هی فشار و دما بصورت 20 بیتی خوانده شود و در بالا به صورت 16 بیتی تنظیم کرده بودم
الان سنسور با دستورات فوق راه اندازی شده و داره از دما و فشار نمونه گیری میکنه حالا دما و فشار رو پشت سر هم میخونیم این پشت سر هم بودن توصیه سازنده هست
I2cstart
I2cwbyte Ic_w
I2cwbyte &HF7
I2cstart
I2cwbyte Ic_r
I2crbyte P1 , Ack
I2crbyte P2 , Ack
I2crbyte P3 , Ack
I2crbyte T1 , Ack
I2crbyte T2 , Ack
I2crbyte T3 , Nack
I2cstop
Waitms 50
با دستورات بالا فشار خونده شده و در سه بایت p1 , p2 , p3 ریخته شده که p1 پرارزشترین بایت و p3 کم ارزشترین بایت از مقدار کل فشار هست
فراموش نکنید که ما در سه بایت یعنی 24 بیت فشار رو خوندیم اما فشار یک عدد 20 بیتی هست که چهار بیت کم ارزش p3 کاربردی نداره مطابق جدول صفحه 24
برای اینکه این مقادیر را به بچسبانیم و عدد فشار را در یک متغییر بریزیم این کار رو انجام میدیم
Dim Adc_p As Long
متغییری از نوع long تعریف میکنیم
Dim Z As Single
متغییر زد هم تعریف کردم برای محاسبات و بعد از محاسبات ارزشی برا ما نخواهد داشت
Adc_p = P1 * 4096
Z = P2 * 16
Adc_p = Z + Adc_p
Adc_p.3 = P3.7
Adc_p.2 = P3.6
Adc_p.1 = P3.5
Adc_p.0 = P3.4
خط اول p1 رو در 4096 ضرب کرده تا بیت های p1 را در بیت 19 تا 10 از متغییر Adc_p ریخته شود
همین کار را برا p2 انجام میدهیم و در متغییر Adc_p میریزیم اما در 16 ضرب میکنیم تا چهار بیت شیفت به چپ کند در متغییر Adc_p که در واقع مقدار خام فشار است
چند خط آخر هم جایگاه هر بیت از pc را در متغییر Adc_p مشخص میکند
من چون مبتدی هستم روش بهتری به ذهنم نرسید اگر شما روش بهتری بلد بودید بگید تا من هم اون روش رو انجام بدم، در هر صورت دستورات فوق کار رو برا ما انجام میده بدون خطا
دقیقا روش فوق رو برای دما هم انجام میدیم
Dim Adc_t As Long
متغییر رو تعریف کرده و طبق دستورات زیر دما هم به صورت 20 بیتی شکل میدیم در متغییر Adc_t
Adc_t = T1 * 4096
Z = T2 * 16
Adc_t = Z + Adc_t
Adc_t.3 = T3.7
Adc_t.2 = T3.6
Adc_t.1 = T3.5
Adc_t.0 = T3.4
همه چیز الان حل شد، شما فشار و دما رو خوندید به صورت خام
در پست بعدی من توضیح میدم چطور مقدار دما رو به مقدار واقعی دما به سانتیگراد تبدیل کنیم که یک فرمول ساده داره
و در پست بعدی +1 هم توضیح میدم چطور فشار رو به مقدار واقعی فشار به پاسکال یا بار یا psi تبدیل کنیم
-
سلام دوباره
خوب در پست های بالا ما فشار و دما رو به صورت خام خوندیم حالا برای تبدیل این عددهای خام به دما و فشار باید مراحل زیر رو بگذرونیم
1 خوندن دما و فشار خام
2 خوندن عدد های ثابت کالیبره
3 ستفاده از فرمول شرکت سازنده حهت رسیدن به دما و فشار واقعی
عدد های کالیبره چیست؟
هر سنسور رفتاری متفاوت در مقابل تغییرات دما و فشار دارد و سنسوری که شما دارید ممکن است کمی با سنسوری که من دارم تغییرات را متفاوت حس کند، برای رفع این مشکل شرکت سازنده این رفتار را برا هر سنسور بررسی کرده و اعدادی رو در بخشی از حافظه سنسور به صورت فقط خواندی ذخیره کرده که اگر این اعداد در فرمول قرار گیرد عدد دما و فشار بسیار به واقعیت نزدیک خواهد شد
این عداد ثابت هستند برا هر سنسور و تغییر نخواهند کرد پس فقط یک بار آنها را از سنسور خواهیم خواند و نیاز نیست هر بار برای گرفتن دما و فشار آنها خوانده شوند
این اعداد مطابق جدول صفحه 24 در آدرس 0xA1…0x88 قرار دارند
اعداد به صورت دو بیتی و سه عدد برا دما و 9 عدد برا فشار هستند که برخی علامت دار و برخی بی علامت هستند که این نکته مهمی است در تعریف متغییر در ادامه به تعریف متغییر ها دقت کنید بدون علامت ها از نوع word تعریف شده اند
جهت دیدن اطلاعات دقیق صفحه 12 جدول 17 رو ببینید
خوب حالا تعریف متغییرها
Dim Dig_t1 As Word , Dig_t2 As Integer , Dig_t3 As Integer
Dim Dig_p1 As Word , Dig_p2 As Integer , Dig_p3 As Integer
Dim Dig_p4 As Integer , Dig_p5 As Integer , Dig_p6 As Integer
Dim Dig_p7 As Integer , Dig_p8 As Integer , Dig_p9 As Integer
دوستان دقت کنید نوع این متغییرها خیلی مهم هست که مثل بالا باشه
در متغییر هم در بالا داشتیم که دما و فشار خام رو ریختم داخلش
Dim Adc_t As Long , Adc_p As Long
چند متغییر زیر هم برای انجام محاسبات نیاز داریم، چون محاسبات ریاضی در اکثر میکروهای ضعیف تر باید به صورت خط به خط و در هر خط یک محاسبه قابل انجام هست به این متغییرها نیاز داریم
Dim T_fine As Single
Dim Var1 As Single
Dim Var2 As Single
Dim T As Single
Dim P As Single
Dim Z As Single
Dim Y As Single
متغییر p و t برای اعداد واقعی دما و فشار تعریف کردیم
متغییر z,y,var1,var2 جهت انجام محاسبات ریاضی هست
متغییر T_fine مهم هست و این متغییر عددی وابسته به دما رو در خودش خواهد داشت که در محاسبات فشار کاربرد داره
متغییرهای زیر هم جهت ریختن بایت های با ارزش و کم ارزش هر متغییر بزرگتر و به هم وصل کردن آنها هست
Dim P1 As Byte , P2 As Byte , P3 As Byte , T1 As Byte , T2 As Byte , T3 As Byte
حالا خوندن سه عدد اصلی کالیبره دما
I2cstart
I2cwbyte Ic_w
I2cwbyte &H88
I2cstart
I2cwbyte Ic_r
I2crbyte P1 , Ack
I2crbyte T1 , Ack
I2crbyte P2 , Ack
I2crbyte T2 , Ack
I2crbyte P3 , Ack
I2crbyte T3 , Nack
I2cstop
Dig_t1 = Makeint(p1 , T1)
Dig_t2 = Makeint(p2 , T2)
Dig_t3 = Makeint(p3 , T3)
دستورات بالا سه متغییر Dig_t3 Dig_t2 Dig_t1 را کامل کرده و از حافظه خونده و در این متغییرها میریزد که برای محاسبات دما نیاز داریم
و حالا خوندن اعداد کالیبره فشار
ابتدا سه عدد اول از 9 عددی که باید خوانده شود
I2cstart
I2cwbyte Ic_w
I2cwbyte &H8E
I2cstart
I2cwbyte Ic_r
I2crbyte P1 , Ack
I2crbyte T1 , Ack
I2crbyte P2 , Ack
I2crbyte T2 , Ack
I2crbyte P3 , Ack
I2crbyte T3 , Nack
I2cstop
Waitms 5
Dig_p1 = Makeint(p1 , T1)
Dig_p2 = Makeint(p2 , T2)
Dig_p3 = Makeint(p3 , T3)
سه عدد بعدی
I2cstart
I2cwbyte Ic_w
I2cwbyte &H94
I2cstart
I2cwbyte Ic_r
I2crbyte P1 , Ack
I2crbyte T1 , Ack
I2crbyte P2 , Ack
I2crbyte T2 , Ack
I2crbyte P3 , Ack
I2crbyte T3 , Nack
I2cstop
Waitms 5
Dig_p4 = Makeint(p1 , T1)
Dig_p5 = Makeint(p2 , T2)
Dig_p6 = Makeint(p3 , T3)
و سه عدد آخر
I2cstart
I2cwbyte Ic_w
I2cwbyte &H9A
I2cstart
I2cwbyte Ic_r
I2crbyte P1 , Ack
I2crbyte T1 , Ack
I2crbyte P2 , Ack
I2crbyte T2 , Ack
I2crbyte P3 , Ack
I2crbyte T3 , Nack
I2cstop
Waitms 5
Dig_p7 = Makeint(p1 , T1)
Dig_p8 = Makeint(p2 , T2)
Dig_p9 = Makeint(p3 , T3)
خوب ما طبق دستورات پست های قبل عددهای خام فشار و دما و اعداد کالیبره رو خوندیم
حالا فرمول و محاسبات برای رسیدن به عدد دقیق دما
صفحه 45 این فرمولها وجوددارد اما مناسب برای بسکام نیست و من مدل شکافته شده اون رو برای بسکام به شکل زیر درآورده ام
Var1 = Adc_t / 16384
Z = Dig_t1 / 1024
Var1 = Var1 - Z
Var1 = Var1 * Dig_t2
Var2 = Adc_t / 131072
Z = Dig_t1 / 8192
Var2 = Var2 - Z
Var2 = Var2 ^ 2
Var2 = Var2 * Dig_t3
T = Var1 + Var2
T_fine = T
T = T / 5120
با محاسبات بالا دمای واقعی با چند رقم اعشار در t ریخته شده هست و میتوانید ان را نمایش دهید این سنسور اینقدر حساس هست که صحبت کردن شما و بازدم شما روی خروجی دما تاثیر خو اهد داشت
عدد و متغییر T_fine فراموش نکنید برای محاسبات فشار نیاز داریم
حالا محاسبات فشار
Y = T_fine / 2
Y = Var1 - 64000
Var2 = Y ^ 2
Var2 = Var2 * Dig_p6
Var2 = Var2 / 32768
Var2 = Var2 + Y
Var2 = Var2 * Dig_p5
Var2 = Var2 * 2
Var2 = Var2 / 4
Z = Dig_p4 * 65536
Var2 = Var2 + Z
Var1 = Dig_p3 * Y
Var1 = Var1 * Y
Var1 = Var1 / 524288
Z = Dig_p2 * Y
Var1 = Var1 + Z
Var1 = Var1 / 524288
Var1 = Var1 / 32768
Var1 = Var1 + 1
Var1 = Var1 * Dig_p1
If Var1 = 0 Then
P = 0
Else
P = 1048576 - Adc_p
Z = Var2 / 4096
P = P - Z
P = P * 6250
P = P / Var1
Var1 = Dig_p9 * P
Var1 = Var1 * P
Var1 = Var1 / 2147483648
Var2 = P * Dig_p8
Var2 = Var2 / 32768
Z = Var1 + Var2
Z = Z + Dig_p7
Z = Z / 16
P = P + Z
End If
فشار د ر متغییر p به پاسکال ریخته شده و کار تمام شد
میتوانید آن را به psi یا بار تبدیل کنید
من زیاد حرفه ای نیستم و ممکن هست برای شما دوستان حرفه ای برخی قسمتها ساده و پیش پا افتاده باشه، به هر حال امیدوارم برای افرادی که قصد کار با این سنسور ارزان قیمت و دقیق رو دارند مناسب بوده باشه
اعتقاد من این است که اگر من به شما در بالارفتن یک پله کمک کنم بدون شک وقت شما صرف پله ای که من گذرانده ام نخواهد شد و تلاش شما برای گذشتن از پله بعدی به من هم کمک خواهد کرد
دوستان لطفا نتایج کار خودتون را روی پروژهای مختلف با سایر دوستان به اشتراک بزارید
موفق باشید
ویرایش توسط parsdc : 06-03-2016 در ساعت 05:15 AM
-
من با ماژول وای فای ESP8266 کار کردم و راه اندازی کردم
در حال حاظر با کمک این ماژول به وای فای adsl وصل میشم و توسط میکرو اطلاعات رطوبت ، دما ، فشار هوا و وضیت یک کولر رو به سرور خودم در کشوری دیگر میفرستم ، برنامه ای نوشتم که اطلاعات رو از میکرو دیافت میکند و در sql server ذخیر میکند.
من با باز کردن آدرس اینترنتی خودم فشار و دما و رطوبت رو میبینم و میتونم دستور باز شدن در حیاط و روشن شدن کولر رو به میکرو بفرستم تا اون اتفاق بیفته
همه اینها با کمک یک میکرو atmega8 و ماژول وای فای و سنسور و چند رله + برنامه نویسی کامپیوتر روی سرور قابل انجام هست و من انجام دادم
بزودی فشار دما و رطوبت فضای آزاد را ارسال میکنم به سرور و آدرس اینترنتی میزارم برا همه که با مراجعه به اون صفحه اینترنتی شما هم قادر به دیدن این اطلاعات به صورت لحظه ای خواهید بود
-
ممنون بابت سورس زبان بسکام ... ♥♥
-
همه مطالب بالا با آردوینو
#include <Wire.h>
const byte Ic_r = 0x77;
const byte Ic_w = 0x78;
uint16_t Dig_t1;
int16_t Dig_t2, Dig_t3;
uint16_t Dig_p1;
int16_t Dig_p2, Dig_p3, Dig_p4, Dig_p5, Dig_p6, Dig_p7, Dig_p8, Dig_p9;
float T_fine;
float Var1, Var2, T, P, Z, Y;
long Adc_p;
long AdcT;
byte P1,P2,P3,T1,T2,T3;
void setup() {
//Wire.setClock(100000);
Wire.begin();
Serial.begin(115200);
while (!Serial); // Wait for Serial to be ready
delay(2000);
Serial.println("-----------");
/*
Wire.beginTransmission(Ic_r);
Wire.write(0xF4); // آدرس رجیستر F4
Wire.write(0x27); // مقدار برای نوشتن (مثال: 0x27 برای تنظیم حالت نرمال)
Wire.endTransmission();
// نوشتن مقدار در آدرس F5
Wire.beginTransmission(Ic_r);
Wire.write(0xF5); // آدرس رجیستر F5
Wire.write(0xA0); // مقدار برای نوشتن (مثال: 0xA0 برای تنظیم زمان انتظار)
Wire.endTransmission();
*/
Wire.beginTransmission(Ic_r);
Wire.write(0xF4); // آدرس رجیستر F4
Wire.write(0xFF); // مقدار برای نوشتن (مثال: 0x27 برای تنظیم حالت نرمال)
Wire.endTransmission();
// نوشتن مقدار در آدرس F5
Wire.beginTransmission(Ic_r);
Wire.write(0xF5); // آدرس رجیستر F5
Wire.write(0x9C); // مقدار برای نوشتن (مثال: 0xA0 برای تنظیم زمان انتظار)
Wire.endTransmission();
delay(100);
/////////////////////////////////
Serial.println();
readCalibrationData(0x88, Dig_t1, Dig_t2, Dig_t3);
readCalibrationData(0x8E, Dig_p1, Dig_p2, Dig_p3);
readCalibrationData(0x94, Dig_p4, Dig_p5, Dig_p6);
readCalibrationData(0x9A, Dig_p7, Dig_p8, Dig_p9);
Serial.println();
Wire.beginTransmission(Ic_r);
Wire.write(0xF4);
Wire.endTransmission();
Wire.requestFrom(Ic_r, (byte)2);
if (Wire.available() == 2) {
P1 = Wire.read();
P2 = Wire.read();
Serial.print(P1);
Serial.print(" ");
Serial.println(P2);
Serial.println("---------A-------");
}
}
/////////////////////////////////////////////////
void readCalibrationData(byte startAddress, uint16_t &dig1, int16_t &dig2, int16_t &dig3) {
Wire.beginTransmission(Ic_r);
Wire.write(startAddress);
Wire.endTransmission();
Wire.requestFrom(Ic_r, (byte)6);
if (Wire.available() == 6) {
dig1 = (Wire.read() | (Wire.read() << 8));
dig2 = (Wire.read() | (Wire.read() << 8));
dig3 = (Wire.read() | (Wire.read() << 8));
}
}
////////////////////////////////////////////////////////////////
void readCalibrationData(byte startAddress, int16_t &dig1, int16_t &dig2, int16_t &dig3) {
Wire.beginTransmission(Ic_r);
Wire.write(startAddress);
Wire.endTransmission();
Wire.requestFrom(Ic_r, (byte)6);
if (Wire.available() == 6) {
dig1 = (Wire.read() | (Wire.read() << 8));
dig2 = (Wire.read() | (Wire.read() << 8));
dig3 = (Wire.read() | (Wire.read() << 8));
}
}
////////////////////////////////////////////////////////////////
void loop() {
Wire.beginTransmission(Ic_r);
Wire.write(0xF7);
Wire.endTransmission();
Wire.requestFrom(Ic_r, (byte)6);
if (Wire.available()==6) {
P1 = Wire.read();
P2 = Wire.read();
P3 = Wire.read();
T1 = Wire.read();
T2 = Wire.read();
T3 = Wire.read();
}
Adc_p = P1 * 4096;
Z = P2 * 16;
Adc_p = Z + Adc_p;
bitWrite(Adc_p, 3, bitRead(P3, 7));
bitWrite(Adc_p, 2, bitRead(P3, 6));
bitWrite(Adc_p, 1, bitRead(P3, 5));
bitWrite(Adc_p, 0, bitRead(P3, 4));
AdcT = T1 * 4096;
Z = T2 * 16;
AdcT = Z + AdcT;
bitWrite(AdcT, 3, bitRead(T3, 7));
bitWrite(AdcT, 2, bitRead(T3, 6));
bitWrite(AdcT, 1, bitRead(T3, 5));
bitWrite(AdcT, 0, bitRead(T3, 4));
Var1 = AdcT / 16384.0;
Z = Dig_t1 / 1024.0;
Var1 = Var1 - Z;
Var1 = Var1 * Dig_t2;
Var2 = AdcT / 131072.0;
Z = Dig_t1 / 8192.0;
Var2 = Var2 - Z;
Var2 = Var2 * Var2;
Var2 = Var2 * Dig_t3;
T = Var1 + Var2;
T_fine = T;
T = T / 5120.0;
/////////////////////////////////////
Y = T_fine / 2.0;
Y = Var1 - 64000.0;
Var2 = Y * Y;
Var2 = Var2 * Dig_p6;
Var2 = Var2 / 32768.0;
Var2 = Var2 + Y;
Var2 = Var2 * Dig_p5;
Var2 = Var2 * 2.0;
Var2 = Var2 / 4.0;
Z = Dig_p4 * 65536.0;
Var2 = Var2 + Z;
Var1 = Dig_p3 * Y;
Var1 = Var1 * Y;
Var1 = Var1 / 524288.0;
Z = Dig_p2 * Y;
Var1 = Var1 + Z;
Var1 = Var1 / 524288.0;
Var1 = Var1 / 32768.0;
Var1 = Var1 + 1.0;
Var1 = Var1 * Dig_p1;
if (Var1 == 0) {
P = 0;
} else {
P = 1048576.0 - Adc_p;
Z = Var2 / 4096.0;
P = P - Z;
P = P * 6250.0;
P = P / Var1;
Var1 = Dig_p9 * P;
Var1 = Var1 * P;
Var1 = Var1 / 2147483648.0;
Var2 = P * Dig_p8;
Var2 = Var2 / 32768.0;
Z = Var1 + Var2;
Z = Z + Dig_p7;
Z = Z / 16.0;
P = P + Z;
}
Serial.print(T);
Serial.print(" ");
Serial.println(P);
delay(1000);
}
مجوز های ارسال و ویرایش
- شما نمیتوانید موضوع جدیدی ارسال کنید
- شما امکان ارسال پاسخ را ندارید
- شما نمیتوانید فایل پیوست کنید.
- شما نمیتوانید پست های خود را ویرایش کنید
-
مشاهده قوانین انجمن
SEO by vBSEO