گاهی نیاز داریم که اطلاعاتی رو در میکرو ذخیره کنیم که حتی بعد از قطع منبع تغذیه میکرو ، پایدار بمونه یا نیاز داریم که با استفاده از سنسورها یا صفحه کلید ، اطلاعاتی رو بدون پروگرامر و کامپیوتر
وارد کنیم یا تغییر بدیم . برای این کار میتونیم از حافظه ایپرام داخلی خود میکرو استفاده کنیم . در میکروی اتمگا 328 که در مدل آردوینو uno استفاده شده ، مقدار 1 کیلوبایت حافظه ایپرام در نظر
گرفته شده . در میکروهای دیگه میتونید به دیتاشیت میکرو مراجعه کرده و از میزان حافظه ایپرام میکرو مطلع بشید .
ممکنه برای بعضی از دوستان این سئوال به وجود بیاد ، چرا باید از ایپرام داخلی میکرو استفاده کنیم ، وقتی به راحتی میتونیم از حافظه خارجی با ظرفیت خیلی بیشتر استفاده کنیم ؟!!!
جواب این سئوال فقط به خاطر امنیت بیشتر هستش . چون شخص ثالث به راحتی میتونه ایپرام خارجی ما رو برداره و اطلاعاتشو دامپ کنه اما حافظه داخلی داخل میکرو هستش و شخص
به راحتی قادر به دامپ اطلاعات نخواهد بود .
برای کار با حافظه داخلی باید از کتابخانه EEPRAM استفاده کنیم برای این کار باید این کتابخانه رو داخل برنامه قرار بدیم :
کار با ایپرام داخلی آسونتر از اون چیزیه که فکرشو میکنید . من برای مثال یه کد قرار میدم که ابتدا در یه متغییر از جنس کاراکتر ، یه شماره تلفن قرار میدم ، در تابع ستاپ اطلاعات رو روی
ایپرام مینویسم و در تابع لوپ اون رو میخونم و از طریق سریال مانیتور چاپش میکنم . کد زیر رو ببینید :
کد:
#include <EEPROM.h>
char val[] = {"4222068"};
void setup(){
Serial.begin(9600);
for (byte i = 0; i < (sizeof(val)-1); i++) {
EEPROM.write(i, val[i]);
}
}
void loop() {
for (byte k = 0; k < (sizeof(val)-1); k++) {
char ss = EEPROM.read(k);
Serial.print(ss);
}
Serial.print("\n");
delay(2000);
}
تنها نکته قابل اشاره در این کد استفاده از تابع sizeof هستش که کارش شمارش مقدار آرایه هستش .
کتابخانه قدرتمند ایپرام این قابلیت رو داره که حجم زیادی از اطلاعات رو در یک پروسه داخل ایپرام بنویسیم . فرض کنید میخوایم رشته ای از اطلاعات رو بگیریم و داخل ایپرام بریزیم .
برای این کار از تابع ()put استفاده میکنیم . برای دسترسی به داده ها هم از تابع ()get استفاده میکنیم .
مثال زیر رو ببینید :
کد:
#include "EEPROM.h"
typedef struct {
char name1[10] ;
char name2[10] ;
char name3[10] ;
}melon;
melon water;
void setup() {
Serial.begin(9600);
char myName1[10] = "Ahmad";
strcpy(water.name1, myName1);
char myName2[10] = "Ali";
strcpy(water.name2, myName2);
char myName3[10] = "Meri";
strcpy(water.name3, myName3);
EEPROM.put(0, water);
}
void loop() {
Serial.println("Extract Var from eeprom");
EEPROM.get(0, water);
Serial.print("Var 1 = ");
Serial.println(water.name1);
delay(2000);
Serial.print("Var 2 = ");
Serial.println(water.name2);
delay(2000);
Serial.print("Var 3 = ");
Serial.println(water.name3);
delay(2000);
در مثال بالا ما با استفاده از کد استراکچر ، ۳ اسم ساختیم ، در فانکشن ستاپ ، اسمها رو با استفاده از تابع ()put به ایپرام دادیم و در فانکشن loop ، با استفاده از تابع ()get ، اسمها
رو از ایپرام استخراج و در سریال مانیتور نمایش دادیم .
تابع پوت و گت ۲ تا مقدار میگیرن که اولی آدرس ایپرام و دومی شیئ که تمایل داریم ذخیره بشه .
منبع آموزش