نحوه نوشتن و خواندن اطلاعات روی کارت حافظه SD و میکرو SD با آردوینو

فهرست مطالب

مقدمه

معمولا ذخیره کردن اطلاعات، یکی از اصلی ترین بخش های یک پروژه است. باتوجه به نوع اطلاعات و حجم آن ها، راه ها و وسایل مختلفی برای ذخیره ی آن ها وجود دارد. یکی از متداول ترین وسایل ذخیره ی اطلاعات، کارت های حافظه ی SD و micro SD است که در وسایلی مثل گوشی های تلفن همراه، مینی کامپیوتر ها و … استفاده می شود.

در این آموزش شما با نحوه ی راه اندازی و کار با ماژول های SD و micro SD با استفاده از آردوینو آشنا می شوید.

در انتهای این آموزش به عنوان یک پروژه ی ساده، دمای محیط را هر یک ساعت یک بار اندازه گیری  کرده و  روی کارت حافظه ذخیره می کنیم.

آنچه در این آموزش یاد می گیرید

ماژول کارت حافظه ی SD و micro SD چیست؟

ماژول های SD و micro SD به شما اجازه می دهند تا با کارت حافظه ارتباط برقرار کنید و روی آنها اطلاعاتی را بنویسید و یا از آن ها اطلاعات بخوانید. رابط کاربری این ماژول ها SPI است.

برای راه اندازی این ماژول ها با برد های آردوینو از کتابخانه ی SD استفاده می شود. این کتابخانه به صورت پیش فرض روی نرم افزار آردوینو وجود دارد.

نکته
این ماژول ها قابلیت کار با کارت های حافظه با ظرفیت های بالا را ندارند. معمولا حداکثر ظرفیت قابل شناسایی این ماژول ها برای کارت حافظه ی SD، 2GB و برای کارت های micro SD، 16GB است.

دیتاشیت ماژول کارت حافظه SD Card را می‌توانید از اینجا دانلود کنید.

معرفی پایه های (Pinout) ماژول کارت حافظه SD Card

این ماژول دارای 6 پایه به شرح زیر است:

  • VCC: تغذیه ماژول – 5ولت
  • GND: زمین
  • CS: پایه ChipSelect
  • MISO: پایه فرستنده – معادل پین Tx پورت سریال
  • MOSI: پایه گیرنده – معادل پین Rx پورت سریال
  • SCK: پایه کلاک ماژول

پین اوت (Pinout) این ماژول را می‌توانید در تصویر زیر مشاهده کنید.

لوازمی که به آن احتیاج دارید

قطعات مورد نیاز

آردوینو Uno × 1
ماژول میکرو SD × 1
ماژول DS3231 × 1
سیم جامپر نری به مادگی × 1
کارت حافظه میکرو SD × 1

نرم افزار های مورد نیاز

Arduino IDE

معرفی دستورات کاربردی کتابخانه ی SD

در جدول زیر راجع به دستورات کاربردی کتابخانه ی SD توضیح مختصری داده شده است.

* file یک شی (instance) از کلاس File است.

توضیحات کامل تر راجع به این کتابخانه را می توانید در اینجا مشاهده کنید.

راه اندازی ماژول SD و micro SD با آردوینو

نکته
ماژولی که در این آموزش استفاده شده است، ماژول micro SD است، با این حال، کد ها و آموزش های داده شده را می توانید برای ماژول های SD نیز استفاده کنید.

سیم بندی

استفاده از این ماژول بسیار ساده می باشد و پیکربندی آن بصورت زیر است:

کد

نوشتن اطلاعات روی کارت حافظه با آردوینو:

#include <SPI.h>
#include <SD.h>
File myFile;
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.print("Initializing SD card...");
if (!SD.begin(10)) {
Serial.println("initialization failed!");
while (1);
}
Serial.println("initialization done.");
// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
myFile = SD.open("test.txt", FILE_WRITE);
// if the file opened okay, write to it:
if (myFile) {
Serial.print("Writing to test.txt...");
myFile.println("This is a test file :)");
myFile.println("testing 1, 2, 3.");
for (int i = 0; i < 20; i++) {
myFile.println(i);
}
// close the file:
myFile.close();
Serial.println("done.");
} else {
// if the file didn't open, print an error:
Serial.println("error opening test.txt");
}
}
void loop() {
// nothing happens after setup
}

نتیجه اجرای کد بالا:

 

خواندن اطلاعات از کارت حافظه با آردوینو:

#include <SPI.h>
#include <SD.h>
File myFile;
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.print("Initializing SD card...");
if (!SD.begin(10)) {
Serial.println("initialization failed!");
while (1);
}
Serial.println("initialization done.");
// open the file for reading:
myFile = SD.open("test.txt");
if (myFile) {
Serial.println("test.txt:");
// read from the file until there's nothing else in it:
while (myFile.available()) {
Serial.write(myFile.read());
}
// close the file:
myFile.close();
} else {
// if the file didn't open, print an error:
Serial.println("error opening test.txt");
}
}
void loop() {
// nothing happens after setup
}

نتیجه اجرای کد بالا:

 

پروژه: ذخیره ی دما هر یک ساعت یک بار با استفاده از ماژول DS3231

ماژول DS3231 علاوه بر آی سی ساعت و تقویم، سنسور دما هم دارد.

سیم بندی

کد

برای کار با ماژول DS3231 ابتدا باید کتابخانه ی آن را (Sodaq_DS3231.h) به نرم افزار آردوینو اضافه کنید.

/*
Save temperature in SD/microSD card every hour with DS3231 + SD/microSD module + Arduino
modified on 15 Apr 2019
by Mohammadreza Akbari @ Electropeak
Home
*/ #include <SPI.h> #include <SD.h> #include <Wire.h> #include "Sodaq_DS3231.h" File myFile; DateTime now; int newHour = 0; int oldHour = 0; void save_temperature() { myFile = SD.open("temp.txt", FILE_WRITE); now = rtc.now(); myFile.print(now.hour()); myFile.print(":"); myFile.print(now.minute()); rtc.convertTemperature(); //convert current temperature into registers myFile.print(","); myFile.println(rtc.getTemperature()); //read registers and save temperature on deg C myFile.close(); } void setup () { Wire.begin(); rtc.begin(); Serial.begin(9600); Serial.print("Initializing SD card..."); if (!SD.begin(10)) { Serial.println("initialization failed!"); while (1); } Serial.println("initialization done."); now = rtc.now(); oldHour = now.hour(); } void loop () { now = rtc.now(); newHour = now.hour(); if (oldHour != newHour) { save_temperature(); oldHour = newHour; } }
پس از ذخیره ی دما در ساعات مختلف روز، می توانید این اطلاعات را توسط نرم افزار Excel به صورت نمودار رسم کنید.

رسم نمودار در اکسل

برای این کار مراحل زیر را دنبال کنید: کارت حافظه را به کامپیوتر خود وصل کنید. وارد نرم افزار اکسل شوید و از پنجره ی Data گزینه ی From Text را انتخاب کنید و فایل مورد نظر را از کارت حافظه ی خود انتخاب کنید.

سلول ها را انتخاب کنید و با آن ها نمودار رسم کنید.

یک گام جلوتر

  • دستگاه کنترل ورود و خروج بسازید. با استفاده از یک ماژول RFID و آردوینو، ساعت ورود و خروج چند نفر را روی کارت حافظه ذخیره کنید. (برای هر نفر یک کارت RFID درنظر بگیرید)

آموزش های مشابه

Comments (23)

  • MAN Reply

    سلام خسته نباشید
    از مطالبتون واقعا استفاده کردم فقط یک سوال من چجوری میتونم فایل هایی با پسوند های متفاوت مانند wav و یا غیره را روی کارت حافظه بریزم؟؟

    دسامبر 19, 2020 at 2:51 ب.ظ
    • مهران ملکی Reply

      سلام ممنون
      درست متوجه منظورتان نشدم. برای انجام چه کاری نیاز به ریختن فایل با پسوند wav بر روی کارت حافظه دارید؟ این مقاله برای آموزش دادن نحوه ی ذخیره اطلاعات دریافت شده توسط آردوینو از طریق حسگرها و ماژول های متصل به آن است. که این اطلاعات دریافت شده را می توان در فایل های ذخیره متن مانند txt و dsv و امثال آن ذخیره کرد. در صورتی که در رایانه و یا فلش مموری دیگری فایل با پسوند wav دارید و می خواهید بر روی یک کارت حافظه SD بریزید نیازی به واسطه آردوینو نیست. همچنین برای خواندن قایل با پسوند wav از روی کارت حافظه می توانید برای اطلاعات بیشتر از لینک زیر استفاده نمایید. “https://www.instructables.com/Audio-Player-Using-Arduino-With-Micro-SD-Card/”

      دسامبر 27, 2020 at 9:44 ق.ظ
  • احسان Reply

    سلام
    توی کدوم قسمت برنامه میشه تایم ثبت شدن رو تغییر داد؟
    الان مثلا شما هر یک ساعت ذخیره میکنید من هر دقیقه میخام

    می 2, 2021 at 10:24 ب.ظ
    • مهران ملکی Reply

      سلام.
      برای ذخیره کردن اطلاعات در هر یک ساعت، در ابتدا ساعت کنونی در آخر setup با عنوان oldHour ذخیره میشه. سپس در حلقه اصلی برنامه یعنی void، هر بار ساعت چک شده و با ساعت ذخیره شده در مرحله قبل یعنی oldHour مقایسه میشه و موقعی که متفاوت بود، به این معنی هست که وارد ساعت جدید شدیم و در اون لحظه شرط if برقرار شده و دما ذخیره میشه و همچنین oldHour آپدیت میشه. حالا برای اینکه این ذخیره کردن رو برای دقیقه انجام بدید کافیه که همین مراحل رو برای دقیقه برید. یعنی تنها دو خط انتهایی setup و همچنین حلقه void تصحیح کنید. (1- به جای ذخیره ساعت کنونی در انتهای setup، دقیقه کنونی رو به عنوان oldMinute ذخیره کنید. میتونید از کد oldMinute = now.minute(); استفاده کنید. 2- در حلقه اصلی، دقیقه کنونی را هر بار حساب کنید و با دقیقه ذخیره شده از قبل یعنی oldMinute مقایسه کنید. 3- شرط if رو برابر نبودن دقیقه کنونی و دقیقه ذخیره شده از قبل یعنی oldMinute قرار بدید. 4- در داخل حلقه if، همانند قبل اطلاعات را ذخیره کنید و این بار oldMinute را آپدیت کنید.)

      می 3, 2021 at 9:57 ق.ظ
  • ندا Reply

    سلام
    وقت بخیر
    میخواهم برنامه ای بنویسم که در ان ابتدا بارکد خوان بار کد رو جعبه را خوانده و سپس به وسیله دوربین از جعیه عکس گرفته شود و عکس با نام بارکد رو جعبه ذخیره گردد.
    با کارت حافظه و اردینو که در این مطلب گفتید میتوانم این کارا انجام دهم؟

    می 29, 2021 at 5:49 ب.ظ
    • مهران ملکی Reply

      سلام. وقت شما هم بخیر.
      بله میتونید با همین ماژول کار ذخیره کردن اطلاعات رو انجام بدید. فقط لازمه که بر اساس نوع بارکدخوان و دوربینی که استفاده میکنید ارتباطشون رو با آردوینو برقرار کنید. همچنین یک گزینه مناسب برای شما میتونه استفاده از برد ESP32-CAM باشه که میتونید این رو جایگزین برد آردوینو کنید و عکس گرفتن رو هم با همین برد انجام بدید.

      می 30, 2021 at 9:12 ق.ظ
  • علی Reply

    آیا این کتاب خانه ها ار زبان فارسی هم پشتیبانی میکند؟

    ژوئن 19, 2021 at 7:23 ب.ظ
    • مهران ملکی Reply

      سلام،
      به شخصه تا به حال ندیدم که این موضوع امتحان شده باشه، اما ازونجایی که این کتابخونه صرفا انتقال دهنده کدهای ASCII هست، به احتمال بالا تفاوتی بین زبان‌های مختلف قائل نیست و از تمامی زبان‌ها پشتیبانی میکنه.

      ژوئن 20, 2021 at 9:28 ق.ظ
  • آرمان Reply

    سلام من میخواستم کد های آردیونو رو روی مموری بنویسم چون در خود آردیونو حافظه کم می آوردم
    این کار امکان پذیر است
    و چه تفاوتی در خواندن و نوشتن دارد

    اکتبر 14, 2021 at 11:19 ب.ظ
    • مهران ملکی Reply

      سلام
      نه این کار امکان پذیر نیست. در واقع کدهای آردوینو (و در حالت کلی سایر میکروکنترلرها) نیاز به حافظه اجرایی برای ذخیره کردن دارن ولی مموری حافظه اجرایی نیست. کدهای میکروکنترلرها فقط روی حافظه اجرایی داخلی خودشون ذخیره میشه.
      برای رفع مشکلی که شما دارید، بهترین کار استفاده از میکروکنترلرهاییه که حافظه بیشتری دارن، مثلا بردهای ESP32. این بردها در عین حال که حافظه چند ده برابری دارن، قیمت خیلی کمتری رو نسبت به آردوینو دارن. برای مقایسه حافظه کافیه بدونید برد آردوینو Uno حافظه داخلی 32کیلوبایتی داره در حالی که برد ESP32 حافظه 4 مگابایت داره. تو پست زیر میتونید اطلاعات بیشتری رو در مورد برد ESP32 کسب کنید.
      https://thecaferobot.com/learn/getting-started-with-the-esp32-development-board/

      اکتبر 16, 2021 at 10:05 ق.ظ
  • فرزاد اسلامی Reply

    با سلام و عرض ادب

    بابت مطالب عالی سپاسگذارم
    من نیاز به راهنمایی دارم اگر بتونید کمک کنید متشکر می شوم

    می خوام یه ژیروسکوپ mpu6050 رو به آردینو وصل کنم و اطلاعات ارتعاش و دما رو در کارت حافظه میکرو ذخیره کنم . به طور مجزا راه اندازی کردمشون ولی نمی دونم چطوری هر دو همزمان راه اندازی کنم نیاز به کد برنامهش دارم ممنونم.

    دسامبر 22, 2021 at 2:09 ب.ظ
    • مهران ملکی Reply

      سلام دوست عزیز
      خیلی خوشحالیم که کمک کننده بوده براتون
      راه اندازی همزمان دو ماژول تفاوتی با راه اندازی جداشون نداره به شرطی که اون دو ماژول از نظر پروتکل ارتباطی و پین های مورد استفاده تداخلی با همدیگه نداشته باشن این مورد هم در ماژول های میکرو SD و MPU6050 وجود نداره و تداخلی با هم ندارن چون پروتکل ارتباطی ماژول MPU6050، پروتکل I2C و پروتکل استفاده شده در ماژول میکرو SD، پروتکل SPI هست. در نتیجه میتونید هر دو کدی که برای راه اندازی جداگونه استفاده کردید رو به راحتی ترکیب کنید و برای راه اندازی همزمان هر دو ماژول میکرو SD و MPU6050 استفاده کنید.

      دسامبر 25, 2021 at 9:53 ق.ظ
  • حسین Reply

    روزخوش
    بیان مطالب بسیار روان بود ، یه سوال از حضورتون داشتم ، بنده یه برنامه دیتالاگر دارم که به وای فای وصل میشه و دیتا رو بر روی مموری و سرور ذخیره میکنه
    اگه بخوام که SSID و PASS رو روی مموری ذخیره کنم و میکرو این مشخصات رو از مموری بخونه و با اون به مودم کانکت بشه ، امکان پذیر هست ؟

    می 10, 2022 at 2:46 ب.ظ
    • مهران ملکی Reply

      سلام.
      بله امکانش وجود داره. میتونید اسم وای‌فای و رمز عبور رو که در مموری ذخیره شدن توسط میکروتون بخونید و با اون به وای‌فای متصل شید.

      می 14, 2022 at 11:22 ب.ظ
      • عقیل Reply

        سلام وقت بخیر…ممنونم از اینکه علمتون رو در اختیار همگان میذارید…
        من میخوام یک سری اعداد که در SD CARD ذخیره شده رو با استفاده از ماژول شیلد دیتالاگر در اختیار آردوینو قرار بدم و اردوینو طبق همون اعداد یک سری تصمیم گیریها انجام بده…..آیا این برنامه ای که نوشتید برای ماژول شیلد دیتالاگر نیز قابل استفاده است؟؟

        اعداد در یک فایل اکسل هستند…

        نوامبر 21, 2022 at 1:46 ب.ظ
        • مهران ملکی Reply

          سلام.
          بله قابل استفاده هست. البته لازمه که کمی تغییرات در اون انجام بدید. مثلا خواندن از فایلتون، نوشتن یک سری if statement برای اجرای شروط مورد نظرتون و …

          نوامبر 25, 2022 at 11:41 ق.ظ
          • عقیل

            همه اعدادی که در اکسل ثبت کردم به صورت یکجا میان…آیا امکانش هست که اعداد یکی یکی فراخوانی شوند !!؟؟

            دسامبر 20, 2022 at 2:05 ب.ظ
  • mmt Reply

    سلام یه سوال داشتم الان دما رو از روی LCD میخونه و ذخیره میکنه یا با سریال بهش میدیم اونو میخونه و ذخیره میکنه ؟

    دسامبر 19, 2022 at 5:42 ب.ظ
    • علی عبدالملکی Reply

      سلام وقت بخیر
      هیچ کدام. ماژول DS3231 دارای سنسور دماست و موقع راه اندازی توسط برد به وسیله پروتکل I2C مقدار دمای اندازه گیری شده را از طریق همین ارتباط به میکرو میدهد برای ذخیره سازی روی SD CARD
      موفق باشید

      فوریه 27, 2023 at 3:59 ب.ظ
  • احسان Reply

    سلام خسته نباشید
    من چتور میتونم نوع داده دستور خواندن اطلاعات از رم را عوض کنم
    myFile.read() وقتی من این دستور را به سترینگ تبدیل میکنم اعداد عجیب نشان میدهد

    آگوست 22, 2023 at 3:19 ب.ظ
  • احسان Reply

    سلام خسته نباشید
    من چطور میتونم نوع داده دستور خواندن اطلاعات از رم را عوض کنم
    myFile.read() وقتی من این دستور را به سترینگ تبدیل میکنم اعداد عجیب نشان میدهد

    آگوست 22, 2023 at 3:21 ب.ظ
  • سعید Reply

    سلام خسته نباشید خیلی ممنون از آموزشتون
    یک سوال داشتم چطور میتوان یک جمله را از رم حذف کرد

    آوریل 11, 2024 at 12:15 ب.ظ
    • محمد دمیرچی Reply

      با سلام
      متوجه منظور شما نشدم
      اگر منظور شما پاک کردن یک خط داخل یک فایل می باشد. به صورت کلی از این طریق پیش باید بروید.
      کل فایل را میخوانید و داخل یک متغییر string میریزید و با دستور replace (در صورتی که مقدار را میدانید) یا با دستور remove (محل مقدار را میدانید) بخش مورد نظر را پاک کرده و دوباره همین متغییر را بر روی حافطه write میکنید.

      آوریل 13, 2024 at 9:40 ق.ظ

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.