مقدمه
معمولا ذخیره کردن اطلاعات، یکی از اصلی ترین بخش های یک پروژه است. باتوجه به نوع اطلاعات و حجم آن ها، راه ها و وسایل مختلفی برای ذخیره ی آن ها وجود دارد. یکی از متداول ترین وسایل ذخیره ی اطلاعات، کارت های حافظه ی SD و micro SD است که در وسایلی مثل گوشی های تلفن همراه، مینی کامپیوتر ها و … استفاده می شود.
در این آموزش شما با نحوه ی راه اندازی و کار با ماژول های SD و micro SD با استفاده از آردوینو آشنا می شوید.
در انتهای این آموزش به عنوان یک پروژه ی ساده، دمای محیط را هر یک ساعت یک بار اندازه گیری کرده و روی کارت حافظه ذخیره می کنیم.
آنچه در این آموزش یاد می گیرید
- راه اندازی ماژول های SD و micro SD
- نوشتن اطلاعات روی کارت حافظه
- خواندن اطلاعات از کارت حافظه
ماژول کارت حافظه ی SD و micro SD چیست؟
ماژول های SD و micro SD به شما اجازه می دهند تا با کارت حافظه ارتباط برقرار کنید و روی آنها اطلاعاتی را بنویسید و یا از آن ها اطلاعات بخوانید. رابط کاربری این ماژول ها SPI است.
برای راه اندازی این ماژول ها با برد های آردوینو از کتابخانه ی SD استفاده می شود. این کتابخانه به صورت پیش فرض روی نرم افزار آردوینو وجود دارد.
نکته
دیتاشیت ماژول کارت حافظه SD Card را میتوانید از اینجا دانلود کنید.
Micro SD TF Card Module Datasheet
معرفی پایه های (Pinout) ماژول کارت حافظه SD Card
این ماژول دارای 6 پایه به شرح زیر است:
- VCC: تغذیه ماژول – 5ولت
- GND: زمین
- CS: پایه ChipSelect
- MISO: پایه فرستنده – معادل پین Tx پورت سریال
- MOSI: پایه گیرنده – معادل پین Rx پورت سریال
- SCK: پایه کلاک ماژول
پین اوت (Pinout) این ماژول را میتوانید در تصویر زیر مشاهده کنید.
لوازمی که به آن احتیاج دارید
قطعات مورد نیاز
نرم افزار های مورد نیاز
معرفی دستورات کاربردی کتابخانه ی SD
* file یک شی (instance) از کلاس File است.
توضیحات کامل تر راجع به این کتابخانه را می توانید در اینجا مشاهده کنید.
راه اندازی ماژول SD و micro 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 ابتدا باید کتابخانه ی آن را (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;
}
}
رسم نمودار در اکسل
سلول ها را انتخاب کنید و با آن ها نمودار رسم کنید.
یک گام جلوتر
- دستگاه کنترل ورود و خروج بسازید. با استفاده از یک ماژول RFID و آردوینو، ساعت ورود و خروج چند نفر را روی کارت حافظه ذخیره کنید. (برای هر نفر یک کارت RFID درنظر بگیرید)
Comments (23)
سلام خسته نباشید
از مطالبتون واقعا استفاده کردم فقط یک سوال من چجوری میتونم فایل هایی با پسوند های متفاوت مانند wav و یا غیره را روی کارت حافظه بریزم؟؟
سلام ممنون
درست متوجه منظورتان نشدم. برای انجام چه کاری نیاز به ریختن فایل با پسوند wav بر روی کارت حافظه دارید؟ این مقاله برای آموزش دادن نحوه ی ذخیره اطلاعات دریافت شده توسط آردوینو از طریق حسگرها و ماژول های متصل به آن است. که این اطلاعات دریافت شده را می توان در فایل های ذخیره متن مانند txt و dsv و امثال آن ذخیره کرد. در صورتی که در رایانه و یا فلش مموری دیگری فایل با پسوند wav دارید و می خواهید بر روی یک کارت حافظه SD بریزید نیازی به واسطه آردوینو نیست. همچنین برای خواندن قایل با پسوند wav از روی کارت حافظه می توانید برای اطلاعات بیشتر از لینک زیر استفاده نمایید. “https://www.instructables.com/Audio-Player-Using-Arduino-With-Micro-SD-Card/”
سلام
توی کدوم قسمت برنامه میشه تایم ثبت شدن رو تغییر داد؟
الان مثلا شما هر یک ساعت ذخیره میکنید من هر دقیقه میخام
سلام.
برای ذخیره کردن اطلاعات در هر یک ساعت، در ابتدا ساعت کنونی در آخر setup با عنوان oldHour ذخیره میشه. سپس در حلقه اصلی برنامه یعنی void، هر بار ساعت چک شده و با ساعت ذخیره شده در مرحله قبل یعنی oldHour مقایسه میشه و موقعی که متفاوت بود، به این معنی هست که وارد ساعت جدید شدیم و در اون لحظه شرط if برقرار شده و دما ذخیره میشه و همچنین oldHour آپدیت میشه. حالا برای اینکه این ذخیره کردن رو برای دقیقه انجام بدید کافیه که همین مراحل رو برای دقیقه برید. یعنی تنها دو خط انتهایی setup و همچنین حلقه void تصحیح کنید. (1- به جای ذخیره ساعت کنونی در انتهای setup، دقیقه کنونی رو به عنوان oldMinute ذخیره کنید. میتونید از کد oldMinute = now.minute(); استفاده کنید. 2- در حلقه اصلی، دقیقه کنونی را هر بار حساب کنید و با دقیقه ذخیره شده از قبل یعنی oldMinute مقایسه کنید. 3- شرط if رو برابر نبودن دقیقه کنونی و دقیقه ذخیره شده از قبل یعنی oldMinute قرار بدید. 4- در داخل حلقه if، همانند قبل اطلاعات را ذخیره کنید و این بار oldMinute را آپدیت کنید.)
سلام
وقت بخیر
میخواهم برنامه ای بنویسم که در ان ابتدا بارکد خوان بار کد رو جعبه را خوانده و سپس به وسیله دوربین از جعیه عکس گرفته شود و عکس با نام بارکد رو جعبه ذخیره گردد.
با کارت حافظه و اردینو که در این مطلب گفتید میتوانم این کارا انجام دهم؟
سلام. وقت شما هم بخیر.
بله میتونید با همین ماژول کار ذخیره کردن اطلاعات رو انجام بدید. فقط لازمه که بر اساس نوع بارکدخوان و دوربینی که استفاده میکنید ارتباطشون رو با آردوینو برقرار کنید. همچنین یک گزینه مناسب برای شما میتونه استفاده از برد ESP32-CAM باشه که میتونید این رو جایگزین برد آردوینو کنید و عکس گرفتن رو هم با همین برد انجام بدید.
آیا این کتاب خانه ها ار زبان فارسی هم پشتیبانی میکند؟
سلام،
به شخصه تا به حال ندیدم که این موضوع امتحان شده باشه، اما ازونجایی که این کتابخونه صرفا انتقال دهنده کدهای ASCII هست، به احتمال بالا تفاوتی بین زبانهای مختلف قائل نیست و از تمامی زبانها پشتیبانی میکنه.
سلام من میخواستم کد های آردیونو رو روی مموری بنویسم چون در خود آردیونو حافظه کم می آوردم
این کار امکان پذیر است
و چه تفاوتی در خواندن و نوشتن دارد
سلام
نه این کار امکان پذیر نیست. در واقع کدهای آردوینو (و در حالت کلی سایر میکروکنترلرها) نیاز به حافظه اجرایی برای ذخیره کردن دارن ولی مموری حافظه اجرایی نیست. کدهای میکروکنترلرها فقط روی حافظه اجرایی داخلی خودشون ذخیره میشه.
برای رفع مشکلی که شما دارید، بهترین کار استفاده از میکروکنترلرهاییه که حافظه بیشتری دارن، مثلا بردهای ESP32. این بردها در عین حال که حافظه چند ده برابری دارن، قیمت خیلی کمتری رو نسبت به آردوینو دارن. برای مقایسه حافظه کافیه بدونید برد آردوینو Uno حافظه داخلی 32کیلوبایتی داره در حالی که برد ESP32 حافظه 4 مگابایت داره. تو پست زیر میتونید اطلاعات بیشتری رو در مورد برد ESP32 کسب کنید.
https://thecaferobot.com/learn/getting-started-with-the-esp32-development-board/
با سلام و عرض ادب
بابت مطالب عالی سپاسگذارم
من نیاز به راهنمایی دارم اگر بتونید کمک کنید متشکر می شوم
می خوام یه ژیروسکوپ mpu6050 رو به آردینو وصل کنم و اطلاعات ارتعاش و دما رو در کارت حافظه میکرو ذخیره کنم . به طور مجزا راه اندازی کردمشون ولی نمی دونم چطوری هر دو همزمان راه اندازی کنم نیاز به کد برنامهش دارم ممنونم.
سلام دوست عزیز
خیلی خوشحالیم که کمک کننده بوده براتون
راه اندازی همزمان دو ماژول تفاوتی با راه اندازی جداشون نداره به شرطی که اون دو ماژول از نظر پروتکل ارتباطی و پین های مورد استفاده تداخلی با همدیگه نداشته باشن این مورد هم در ماژول های میکرو SD و MPU6050 وجود نداره و تداخلی با هم ندارن چون پروتکل ارتباطی ماژول MPU6050، پروتکل I2C و پروتکل استفاده شده در ماژول میکرو SD، پروتکل SPI هست. در نتیجه میتونید هر دو کدی که برای راه اندازی جداگونه استفاده کردید رو به راحتی ترکیب کنید و برای راه اندازی همزمان هر دو ماژول میکرو SD و MPU6050 استفاده کنید.
روزخوش
بیان مطالب بسیار روان بود ، یه سوال از حضورتون داشتم ، بنده یه برنامه دیتالاگر دارم که به وای فای وصل میشه و دیتا رو بر روی مموری و سرور ذخیره میکنه
اگه بخوام که SSID و PASS رو روی مموری ذخیره کنم و میکرو این مشخصات رو از مموری بخونه و با اون به مودم کانکت بشه ، امکان پذیر هست ؟
سلام.
بله امکانش وجود داره. میتونید اسم وایفای و رمز عبور رو که در مموری ذخیره شدن توسط میکروتون بخونید و با اون به وایفای متصل شید.
سلام وقت بخیر…ممنونم از اینکه علمتون رو در اختیار همگان میذارید…
من میخوام یک سری اعداد که در SD CARD ذخیره شده رو با استفاده از ماژول شیلد دیتالاگر در اختیار آردوینو قرار بدم و اردوینو طبق همون اعداد یک سری تصمیم گیریها انجام بده…..آیا این برنامه ای که نوشتید برای ماژول شیلد دیتالاگر نیز قابل استفاده است؟؟
اعداد در یک فایل اکسل هستند…
سلام.
بله قابل استفاده هست. البته لازمه که کمی تغییرات در اون انجام بدید. مثلا خواندن از فایلتون، نوشتن یک سری if statement برای اجرای شروط مورد نظرتون و …
همه اعدادی که در اکسل ثبت کردم به صورت یکجا میان…آیا امکانش هست که اعداد یکی یکی فراخوانی شوند !!؟؟
سلام یه سوال داشتم الان دما رو از روی LCD میخونه و ذخیره میکنه یا با سریال بهش میدیم اونو میخونه و ذخیره میکنه ؟
سلام وقت بخیر
هیچ کدام. ماژول DS3231 دارای سنسور دماست و موقع راه اندازی توسط برد به وسیله پروتکل I2C مقدار دمای اندازه گیری شده را از طریق همین ارتباط به میکرو میدهد برای ذخیره سازی روی SD CARD
موفق باشید
سلام خسته نباشید
من چتور میتونم نوع داده دستور خواندن اطلاعات از رم را عوض کنم
myFile.read() وقتی من این دستور را به سترینگ تبدیل میکنم اعداد عجیب نشان میدهد
سلام خسته نباشید
من چطور میتونم نوع داده دستور خواندن اطلاعات از رم را عوض کنم
myFile.read() وقتی من این دستور را به سترینگ تبدیل میکنم اعداد عجیب نشان میدهد
سلام خسته نباشید خیلی ممنون از آموزشتون
یک سوال داشتم چطور میتوان یک جمله را از رم حذف کرد
با سلام
متوجه منظور شما نشدم
اگر منظور شما پاک کردن یک خط داخل یک فایل می باشد. به صورت کلی از این طریق پیش باید بروید.
کل فایل را میخوانید و داخل یک متغییر string میریزید و با دستور replace (در صورتی که مقدار را میدانید) یا با دستور remove (محل مقدار را میدانید) بخش مورد نظر را پاک کرده و دوباره همین متغییر را بر روی حافطه write میکنید.