تابع ()shiftIn آردوینو

تابع ()shiftIn آردوینو جزو توابع ورودی خروجی پیشرفته آردوینو می باشد. به کمک تابع ()shiftIn آردوینو می توان یک بایت (۸ بیت) داده را به صورت بیت به بیت از پین داده خواند. از بیت با بیشترین ارزش (یعنی چپ‌ترین) یا کم‌ارزش‌ترین (یعنی راست‌ترین) بیت شروع می‌کند. برای هر بیت، پین کلاک بالا می‌رود، بیت بعدی از خط داده خوانده می‌شود و سپس پین کلاک پایین گرفته می‌شود.

نکته مهم 1: اگر با دستگاهی که با لبه‌های بالارونده کلاک می‌شود، ارتباط برقرار می‌کنید، باید قبل از اولین فراخوانی تابع ()shiftIn، مطمئن شوید که پین ​​کلاک در وضعیت پایین (low) قرار دارد. مثلاً با فراخوانی بهdigitalWrite(clockPin, LOW).

نکته مهم 2: این یک پیاده‌سازی نرم‌افزاری است؛ آردوینو همچنین یک کتابخانه SPI ارائه می‌دهد که از پیاده‌سازی سخت‌افزاری استفاده می‌کند، که سریع‌تر است اما فقط روی پین‌های خاصی کار می‌کند.

 

استفاده از تابع ()shiftIn آردوینو - نحو و سینتکس

در برنامه نویسی آردوینو، تابع ()shiftIn برای خواندن همزمان داده‌های سریال به صورت زیر استفاده می شود:

byte incoming = shiftIn(dataPin, clockPin, bitOrder)

همانطور که در عبارت بالا دیدیه می شود، تابع ()shiftIn پارامتر زیر را می پذیرد:

dataPin: پینی که داده‌ها از آن خوانده می‌شوند. انواع داده‌های مجاز:int.

clockPin: پینی که سیگنال زمان‌بندی را فراهم می‌کند.

bitOrder: کدام ترتیب برای جابجایی بیت‌ها در نظر گرفته شده است؛ یا MSBFIRST یا LSBFIRST . (ابتدا بیت با بیشترین اهمیت یا اول بیت با کمترین اهمیت). MSBFIRST مخفف Most Significant Bit First می باشد به معنای بیت با بیشترین اهمیت اول و LSBFIRST مخفف Least Significant Bit First می باشد به معنای بیت با کمترین اهمیت اول.

 

مقدار برگشتی از تابع ()shiftIn آردوینو

این تابع یک بایت (0 - 255) را برمی‌گرداند که نشان دهنده 8 بیت خوانده شده از دستگاه است. نوع داده: byte

 

مثال از تابع ()shiftIn آردوینو

#define DATA_PIN  4    // Pin connected to serial data output 
#define CLOCK_PIN 5    // Pin connected to clock input (CLK)

void setup() {
  pinMode(DATA_PIN, INPUT);
  pinMode(CLOCK_PIN, OUTPUT);

  Serial.begin(9600);
}

void loop() {
  // Read 8 bits from the data line using shiftIn()
  byte dataByte = shiftIn(DATA_PIN, CLOCK_PIN, MSBFIRST);

  // Print the byte in binary format
  Serial.print("Received Byte: ");
  Serial.println(dataByte, BIN);

  delay(1000); // Wait before next read
}