ذخیره دما و شدت نور روی یک میکرو SD یکی دیگر از کاربردهای این تراشه است
SD کارت چیست؟
از کارتهای (Secure Digital) SD یا کارتهای دیجیتال امن میتوان برای ذخیره اطلاعات استفاده نمود. به عنوان مثال، در دوربینهای دیجیتال و موبایل ها برای ذخیره اطلاعات از SD کارت ها استفاده میشود یا در برخی دستگاهها برای ذخیره اطلاعات دریافتی از سنسورها، SD کارت مورد استفاده قرار می گیرد. SD کارتها ظرفیتهای متنوعی دارند و ترجیحاً به صورت FAT32 (File Allocation Table) فرمت میشوند.
ولتاژ کاری میکرو sd کارتها ۳/۳ ولت میباشد. بنابراین برای استفاده از آنها در مدار آردوینو باید از یک تراشه مبدل سطح ولتاژ و یک تنظیم کننده ولتاژ ۳/۳ ولتی بهره برد.
ماژول میکرو sd از طریق پروتکل (SPI) (Serial Peripheral Interfac) با برد آردوینو ارتباط برقرار میکند. پایههای SPI روی میکرو SD به ترتیب MOSI، MISO، SCK و CS نام دارند که به ترتیب به پایههای ۱۱، ۱۲، ۱۳ و ۱۰ آردوینو متصل میشوند. اطلاعات در یک فایل a.csv ذخیره میشود ( ویرگول مقادیر را جدا میکند.) که میتوانیم این فایل را به صورت EXCEL بارگذاری کنیم. اسامی فایلها باید با فرمت FAT 8.3 باشند و نباید از ۸ کاراکتر تجاوز کنند که در نهایت به نقطه و پسوند ۳ حرفی فایل منتهی میشود. مانند File1234.csv اگر یک فایل csv با استفاده از Excel روی میکرو sd ساخته شود، باید پیش از خارج ساختن SD از لپ تاپ یا کامپیوتر Eject شود.
فایل csv که روی SD کارت نوشته شده، باید به صورت رشته ای که هر مقدار را با ویرگول جدا میکند، دربیاید. دستور زیر اطلاعات نور، دما و رطوبت را به رشتههایی تبدیل میکند که با ویرگول از یکدیگر جدا شده اند.
data=string(light)+”,”+string(temp)+”,”+string(humid)
اطلاعات تنها در صورتی روی SD کارت نوشته میشوند که دستور ()file.close تایپ شود. بنابراین پس از نوشتن هر دستور (data)file.print ln باید دستور ()file.close را نیز بنوسیم و پیش از دستور پرینت باید دستور (“filename,File_Write”)sd.open تایپ شود. تابع ()sd.open تنظیم پیشفرض FILE_READ را دارد. بنابراین برای نوشتن اطلاعات باید دستور FILE_WRITE تایپ شود.
ترتیب دستورهایی که برای نوشتن اطلاعات روی SD کارت باید اجرا شود به صورت زیر خواهد بود:
sd.open(“filename,FILE_WRITE);
file.print ln(data);
file.close();
ثبت دما و شدت نور روی SD کارت
ذخیره دما و شدت نور روی یک میکرو SD یکی دیگر از کاربردهای این تراشه است.( شکل زیر را ببینید) هنگامی که مقاومت وابسته به نور (LDR) و سنسورهای LM35DZ به صورت جداگانه عمل میکنند، سیگنال LDR الگویی سینوسی دارد. اما سیگنال LM35DZ معمولاً تخت است ( شکل ۲ را ببینید) هنگامی که دو سنسور در کنار هم کار میکنند، ممکن است بین سیگنال LDR و سیگنال LM35DZ تداخل به وجود بیاید البته این تداخل میتواند با استفاده از یک خازن بایپس خنثی شود. ( شکل ۲) خازن های الکترولیتی دارای قطب مثبت و منفی هستند و کاتد که پایهاش با یک خط سفید مشخص شده به زمین متصل میشود. اتصالات برای شکل زیر در جدول ۱ آورده شده)
یک مثال دیگر از نویز، اثر ریپل AC میباشد. به طور کلی در فرکانس ۵۰ تا ۶۰ هرتز که فرکانس برق شهری است، به دلیل متناوب بودن سیگنال، رکتانس (Reactance) خازن شبیه به مقدار مقاومتی میباشد و برابر با (2πfc)/۱ می باشد.
که در اینجا f فرکانس سیگنال و c ظرفیت خازنی خازن مورد نظر میباشد. یک خازن بایپس راکتانس بالایی در برابر سیگنال ها با فرکانس پایین ( مانند سیگنال LM35DZ) دارد و در برابر سیگنال های فرکانس بالا ( مانند سیگنال LDR) راکتانس کمی از خود نشان میدهد. هنگامی که یک خازن بایپس بین سیگنال LM35DZ و زمین اتصال پیدا کرده، نویز با فرکانس بالا به زمین انتقال مییابد و سیگنال بدون نویز به میکروکنترلر میرسد.
ظرفیت خازنی مورد نیاز برای خازن بایپس بستگی به کف بازه ی فرکانسی دارد که باید فیلتر شود و راکتانس خازن باید به طرز قابل توجهی پاایین تر از امپدانس خروجی سنسور LM35DZ باشد.
سنسور LM35DZ جریان خروجی برابر با ۶۰mA دارد و ولتاژ خروجی نیز برابر با ۲۰۰mV است که در دمای ℃۲۰ امپدانس خروجی باعث میشود راکتانس خازن یک دهم امپدانس خروجی (Z)(LM35DZ) شود. سپس اگر فرکانس را ۵۰Hz در نظر بگیریم، با استفاده از معادله (2πfz)/c=1 مقدار ظرفیت خازن مورد نیاز ۱۰µF خواهد بود.
از دستور (INTERNAL)analogReference برای رفرنس قرار دادن ولتاژ خروجی LM35DZ که ۱/۱V بود به جای مقدار پیشفرض ۵V استفاده میکنیم. بنابراین هنگامی که سنسور دما و مقاومت وابسته به نور در کنار هم به کار برده میشوند دستور (INTERNAL)analogReference غیر فعال می شود.
کدی که در ادامه ارائه شده؛ برای ثبت اندازهگیری شدت نور و دما بر روی یک SD کارت، ابتدا وجود SD کارت را چک میکند و سپس بررسی میکند که آیا میتوان روی SD کارت اطلاعات را ثبت کرد. اندازهگیری شدت نور به وسیله ی یک LDR و یک مدار جداکننده ولتاژ توضیح داده شد. کتابخانه SD در آردوینو IDE موجود است و از آن برای نوشتن روی میکرو SD استفاده میشود. فایل data.csv پاک خواهد شد و یک فایل جدید به وجود میآید.
نحوه اتصال پایههای ماژول میکرو SD به سنسورها
کد ثبت اطلاعات دریافتی از سنسورها روی میکرو SD
#include // include SPI library
#include // include SD library
File file; // #associate file with SD library
String filename = "data.csv"; // filename
int CSpin = 10; // chip select pin
int lightPin = A0; // LDR light intensity pin
int tempPin = A1; // temperature sensor pin
int i = 0; // data record counter
int light;
float temp;
String data;
void setup()
{
Serial.begin(9600); // #define Serial output baud rate
Serial.println("checking SD card"); // #print message to Serial Monitor
if(SD.begin(CSpin) == 0) // #check for presence of SD card
{
Serial.println("Card fail"); // #return to void setup() if SD card not found
return;
}
Serial.println("Card OK");
if(SD.exists(filename)>0) SD.remove(filename); // #delete existing file
file = SD.open(filename, FILE_WRITE); // create new file
if(file == 1) // file opened
{
String header = "i, light, temp"; // create column headers
file.println(header); // #write column header to SD card
file.close(); // #close file after writing to SD card
}
else Serial.println("Couldn't access file"); // #file not opened
}
void loop()
{
i++; // #increase data record counter
Serial.print("record ");Serial.println(i); // #print record number
light = analogRead(lightPin); // light reading
temp = (500.0*analogRead(tempPin))/1023; // #temp reading
// referenced to 5V create string from readings
data = String(i) + "," + String(light) + "," + String(temp);
file = SD.open(filename, FILE_WRITE); // #open data file before writing
file.println(data); // #write data string to file
file.close(); // #close file after writing to SD card
delay(5000); // #delay 5s before next reading
}
اطلاعات روی یک SD کارت میتواند خوانده شود و محتوا روی یک مانیتور سریال نمایش داده شود. دستور ()serial.print کد اسکی (ASCII) را برای یک کاراکتر الفبا یا عددی نمایش میدهد و دستور ()serial.write کد اسکی را به کاراکتر حروف یا عدد تبدیل میکند.
در لیست کد زیر؛ از ()serial-write برای نمایش محتوای data.csv استفاده میشود.
کد نمایش محتویات یک فایل
#include // include SPI library
#include // include SD library
File file; // #associate file with SD library
String filename = "data.csv"; // filename
int CSpin = 10; // chip select pin
void setup()
{
Serial.begin(9600); // #define Serial output baud rate
if(SD.begin(CSpin) == 0) // #check for presence of SD card
{
Serial.println("Card fail");
return; // #return to void setup() if SD card not found
}
Serial.println("Card OK");
file = SD.open(filename); // open file to read display contents of file
while (file.available()>0) Serial.write(file.read());
file.close(); // #close file after reading
}
void loop()
{} // #nothing in void loop() function
1 دیدگاه در “ثبت دما و شدت نور با آردوینو”
برای پروژه ای نیاز بود علاوه بر ذخیره دیتا روی sd کارت همزمان از طریق فرستنده بیسیم هم اطلاعات مخابره بشه. مشکل اینجا بود که نمیتونستم 2 Slave که هر دو با پروتکول SPI کار میکردند رو طوری مدیریت کنم که همزمان فعال باشن. البته بعدا متوجه شدم که باید با یه فرکانسی پایه cs رو برای هرکدوم از ماژولها فعال و غیر فعال کنم
ممنون میشم با یک مثال عملی این مساله رو توضیح بدید. ممنون