2 فایل پیوست
مثال های آموزشی از آردینو - استفاده از spi برای خواندن یک سنسور فشار بارومتری
این مثال چگونگی استفاده ازکتابخانه ارتباطات (SPI Serial Periheral Interface) ،(واسط وسایل جانبی سریال)،برای خواندن داده ها از یک سنسور
فشار بارومتری SCP1000 را نشان می دهد.
سخت افزار مورد نیاز
برد برک آوت سنسور فشار SCP1000
برد آردینو
بردبرد یا برد نمونه
مدار:
فایل پیوست 35
تصویر از Fritzing .برای مثال های بیشتر ،به صفحه پروژه Fritzng نگاه کنید.
شماتیک:
فایل پیوست 36
سنسور فشار هوای بارومتری 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