نمایش نتایج: از 1 به 1 از 1

موضوع: استفاده از spi برای خواندن یک سنسور فشار بارومتری

  1. #1
    Senior Member
    تاریخ عضویت
    Mar 2013
    محل سکونت
    Iran
    نوشته ها
    138

    Lightbulb مثال های آموزشی از آردینو - استفاده از spi برای خواندن یک سنسور فشار بارومتری

    این مثال چگونگی استفاده ازکتابخانه ارتباطات (SPI Serial Periheral Interface) ،(واسط وسایل جانبی سریال)،برای خواندن داده ها از یک سنسور
    فشار بارومتری SCP1000 را نشان می دهد.
    سخت افزار مورد نیاز
    برد برک آوت سنسور فشار SCP1000
    برد آردینو
    بردبرد یا برد نمونه
    مدار:
    برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: BaromettricPressureSensor_bb.jpg
مشاهده: 180
حجم: 15.4 کیلو بایت
    تصویر از Fritzing .برای مثال های بیشتر ،به صفحه پروژه Fritzng نگاه کنید.
    شماتیک:
    برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: BaromettricPressureSensor_sch.jpg
مشاهده: 182
حجم: 13.7 کیلو بایت
    سنسور فشار هوای بارومتری SCP21000 می تواند فشارهوا و درجه حرارت را بخواند و آن را به ارتباط SPI گذارش دهد. برای (اطلاع از) جزئیات
    رجیسترهای کنترل، دیتاشیت SCP1000 را ببینید.
    در کد زیر،آردینو با تنظیم پیکربندی رجیسترهای SCP1000 در ()setup شروع می شود.در حلقه ی اصلی ، سنسور را برای خواندن مد وضوح بالا تنظیم می کند، به این معنی که یک مقدار 19-بیت را برای خواندن فشار و 16 بیت برای درجه حرارت برمی گرداند، مقدار حقیقی خوانده شده درجه سیلیسیوس 16 بیت است درنتیجه بر 20 تقسیم شده است.سپس 2 بایت درجه حرارت را می خواند. به محض آنکه فشار بدست می آید، آن فشار را در دو بخش می خواند.ابتدا 3 بیت باارزش را و سپس 16 بیت کم ارزش را می خواند.این دو را در long integer ترکیب می کند به وسیله ی انتقال بیت، بیت با ارزش و سپس استفاده از OR بیتی آنها را با 16 بیت کم ارزش ترکیب می کند. رطوبت واقعی در پاسکال 19-بیت نتیجه تقسیم بر 4 است.
    کد:
    // ارتباط با استفاده از سنسور SPI, قراردادن کتابخانه: #include <SPI.h> //آدرس های رجیستر حافظه سنسور: const int PRESSURE = 0x1F; //3 most significant bits of pressure const int PRESSURE_LSB = 0x20; //16 least significant bits of pressure const int TEMPERATURE = 0x21; //16 bit temperature reading const byte READ = 0b11111100; // SCP1000's read command const byte WRITE = 0b00000010; // SCP1000's write command // پین های استفاده شده برای ارتباط با سنسور // کنترل شده است SPI چیزهای دیگر که نیاز دارید توسط کتابخانه const int dataReadyPin = 6; const int chipSelectPin = 7; void setup() { Serial.begin(9600); // SPI شروع کتابخانه : SPI.begin(); // data ready و chip select دادن مقدار اولیه به پین های : pinMode(dataReadyPin, INPUT); pinMode(chipSelectPin, OUTPUT); //SCP1000 پیکربندبه صورت کم نویز: writeRegister(0x02, 0x2D); writeRegister(0x01, 0x03); writeRegister(0x03, 0x02); // دادن زمان به سنسور برای راه ندازی: delay(100); } void loop() { //انتخاب مد رزولیشن بالا writeRegister(0x03, 0x0A); // نشد هیچ کاری انجام ندهید High data ready تا وقتی پین، : if (digitalRead(dataReadyPin) == HIGH) { //خواندن دیتا درجه حرارت int tempData = readRegister(0x21, 2); // تبدیل درجه حرارت به سیلیسیوس و نمایش آن: float realTemp = (float)tempData / 20.0; Serial.print("Temp[C]="); Serial.print(realTemp); //خواندن سه بیت با ارزش دیتا فشار: byte pressure_data_high = readRegister(0x1F, 1); pressure_data_high &= 0b00000111; //شما فقط به بیت های 2 تا 0 نیاز دارید //خواندن 16 بیت کم ارزش دیتا فشار: unsigned int pressure_data_low = readRegister(0x20, 2); //ترکیب دو بخش داخل یک شماره 19-بیت : long pressure = ((pressure_data_high << 16) | pressure_data_low)/4; // نمایش درجه حرارت: Serial.println("\tPressure [Pa]=" + String(pressure)); } } //SCP1000 خواندن یا نوشتن روی رجیستر از : unsigned int readRegister(byte thisRegister, int bytesToRead ) { byte inByte = 0; // SPI بایت دریافتی از unsigned int result = 0; // برگرداندن نتیجه Serial.print(thisRegister, BIN); Serial.print("\t"); // SCP1000 ،منتظر 6 بیت برای نام رجیستر بیت. شیفت بیت های باقیمانده با دو بیت thisRegister = thisRegister << 2; // حالا ترکیب آدرس و دستور داخل یک بایت byte dataToSend = thisRegister & READ; Serial.println(thisRegister, BIN); // برای انتخاب دستگاه low روی chip select قرارگیری : digitalWrite(chipSelectPin, LOW); // فرستاندن رجیستر دستگاهی که شما می خواهید بخوانید: SPI.transfer(dataToSend); // فرستادن یک مقدار از 0 برای خواندن اولین بایت برگشت داده شده: result = SPI.transfer(0x00); // کاهش شماره بایت های باقیمانده برای خواندن: bytesToRead--; // اگر هنوز بایت دیگری برای خواندن دارید: if (bytesToRead > 0) { // شیفت دادن اولین بایت باقیمانده برای خواندن دومین بایت: result = result << 8; inByte = SPI.transfer(0x00); // فقط ترکیب بایت با قبلی دریافت شده: result = result | inByte; //کاهش شماره بایت های باقیمانده برای خواندن: bytesToRead--; } // chip select برای انتخاب high قرارگیری روی: digitalWrite(chipSelectPin, HIGH); // برگرداندن نتیجه: return(result); } // SCP1000 فرستادن دستور نوشتن به void writeRegister(byte thisRegister, byte thisValue) { // منتظر 6 بیت برای آدرس رجیستر بایت. شیفت بیت های باقیمانده با دو بیت SCP1000 ، thisRegister = thisRegister << 2; //ترکیب آدرس رجیستر و دستور داخل یک بایت: byte dataToSend = thisRegister | WRITE; // برای انتخاب دستگاه high روی chip select قرارگیری : digitalWrite(chipSelectPin, LOW); SPI.transfer(dataToSend); //Send register location SPI.transfer(thisValue); /فرستادن مفدار برای ثبت در رجیستر // chip select برای انتخاب دوباره high قرارگیری روی: digitalWrite(chipSelectPin, HIGH); }
    لینک سایت:Arduino - BarometricPressureSensor
    ویرایش توسط hesam.time : 04-03-2013 در ساعت 07:59 AM

کلمات کلیدی این موضوع

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •  

SEO by vBSEO