مقدمه
رفتن برق و قطع شدن تغذیه تجهیزات، یکی از معضلات سیستم های کامپیوتری و الکتریکی میباشد. گاهی اوقات دیتا و اطلاعاتی در سیستم شما وجود دارد که نمیخواهید با قطع برق پاک شوند. اگر بخواهید دیتا و اطلاعات شما با قطع شدن تغذیه مدار از بین نرود، یک راه ساده آن است که اطلاعات خود را بر روی حافظه EEPROM ذخیره کنید. از آنجا که بسیاری از پروژه ها با آردوینو انجام می شود، بنابراین ذخیره دیتا در EEPROM آردوینو از مسائل پرکاربرد هست.
در بعضی از پروژه ها، مانند پرینتر سه بعدی، زمانی که سیستم ریست میشود، برای کالیبره شدن تجهیزات و مقدار دهی اولیه آنها میتوان دیتاهای مربوطه را در حافظه EEPROM آردوینو (یا هر میکروکنترلر دیگری) ذخیره کرد تا در زمان روشن شدن، سیستم به صورت خودکار کالیبره شود.
EEPROM حافظه ماندگار سیستم است و اطلاعات ذخیره شده بر روی آن با قطع شدن تغذیه پاک نمیشود. بنابراین می توانید اطلاعاتی را که نیاز به ماندگاری آنها در سیستم دارید در حافظه EEPROM ذخیره کنید.
آنچه در این آموزش یاد میگیرید
در این آموزش میخواهیم توسط یک مثال ساده، کاربرد و نقش حافظه EEPROM را بررسی کنیم. از آردوینو UNO به عنوان میکرو کنترلر استفاده میکنیم. تراشه اصلی آردوینو UNO، آیسی Atmega328p میباشد. حافظه EEPROM آردوینو 1Kbyte میباشد.
در این آموزش، توسط کتابخانه EEPROM آردوینو، نحوه ذخیره اطلاعات و همچنین خواندن اطلاعات از حافظه EEPROM بررسی میشود.
فرآیندی که در این آموزش دنبال میکنید:
- حافظه EEPROM چیست و چگونه کار می کند.
- بررسی کتابخانه EEPROM در نرمافزار Arduino
- نحوه نوشتن/خواندن دیتا بر روی حافظه EEPROM
- یک مثال کاربردی برای ذخیره و خواندن دیتا از حافظه EEPROM
حافظه EEPROM چیست؟
EEPROM خلاصۀ عبارت Electrically Erasable Programmable Read-Only Memory میباشد. این عبارت بیان میدارد که این حافظه به صورت الکتریکی قابل برنامهنویسی بوده و مخصوص خواندن (read) طراحی شده است. EEPROM حافظه ماندگار میکروکنترلر بوده و شما میتوانید برای ذخیره متغیرها به صورت بایت از این حافظه کوچک بهره بگیرید. یعنی زمانی که برد خاموش شود، اطلاعات مدنظر پاک نمیشوند.
مهمترین ویژگیهای EEPROM عبارتند از:
- قابلیت خواندن اطلاعات به میزان نامحدود
- میزان محدود پاک کردن و نوشتن بر روی آن (حدود 100,000 بار)
- هر خانه حافظه EEPROM شامل 1 بایت میباشد. بنابراین میتوان داده هایی با اندازه 0 تا 255 را در آن ها ذخیره کرد.
- تعداد خانه های حافظه برای میکروکنترلر Atmega328p شامل 1Kbyte میباشد.
لوازمی که به آن احتیاج دارید
قطعات موردنیاز
نرمافزارهای موردنیاز
استفاده از EEPROM آردوینو
برای کار با حافظه EEPROM آردوینو باید از کتابخانه EEPROM استفاده کنیم. خوشبختانه این کتابخانه به صورت پیش فرض بر روی نرمافزار آردوینو وجود دارد. از طریق منوی File و مانند شکل زیر میتوانید به مثالهای کتابخانه EEPROM آردوینو دسترسی داشته باشید.
حال با بیان یک مثال به بررسی بیشتر دستورات پرکاربرد این کتابخانه میپردازیم و 3 گام زیر را طی میکنیم:
گام اول: سیم بندی
توسط دستور Update میتوان مقدار مدنظر (0 تا 255) را در هر خانه حافظه EEPROM ذخیره کرد. دستور Write هم چنین کاربردی دارد. اما تنها تفاوت و مزیت دستور Update نسبت به دستور Write این است که: قبل از اینکه عمل Write را بر روی EEPROM انجام دهد، چک میکند که آیا این مقدار جدید با مقدار قبلی ذخیره شده بر روی آن، یکی هست یا نه. اگر یکسان بود دیگر عمل Write را انجام نمیدهد. این کار به افزایش طول عمر حافظه EEPROM کمک میکند.
دستور مهم دیگری به نام read وجود دارد که جهت خواندن اطلاعات از آدرس مدنظر حافظه EEPROM کاربرد دارد.
هم اکنون میخواهیم توسط یک آزمایش ساده، عملکرد این دستورات را بررسی کنیم.
ابتدا مداری مانند شکل زیر از طریق پتانسیومتر آماده کرده و پایه ورودی را به A0 متصل کنید:
گام دوم: آپلود کد برای نوشتن/خواندن دیتا در EEPROM
در ادامه میخواهیم مقادیر پتانسیومتر را به ترتیب بر روی خانه های حافظه EEPROM ذخیره کنیم. بدین منظور برنامه زیر را بر روی آردوینوی خود آپلود نمایید:
#include <EEPROM.h>
int address = 0;
const int pot = A0;
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println("Ready to write to 0-20 Address of EEPROM");
delay(3000);
for (address = 0 ; address <= 20 ; address++) {
int reading = analogRead(pot);
int val = map(reading, 0, 1023, 0, 255);
Serial.print("Address: ");
Serial.print(address);
Serial.print(" write: ");
Serial.println(val);
EEPROM.update(address, val);
delay(500);
}
Serial.println();
Serial.println("Ready to see value of 0-20 Address of EEPROM");
delay(2000);
for (address = 0 ; address <= 20 ; address++) {
int data = EEPROM.read(address);
Serial.print("Address: ");
Serial.print(address);
Serial.print(" read: ");
Serial.println(data);
delay(500);
}
Serial.println();
}
در این برنامه قصد داریم با دستور EEPROM.update و توسط پتانسیومتر، مقادیر دلخواهی بین 0 تا 255 در خانه های 0 تا 20 حافظه EEPROM ذخیره کنیم و سپس به وسیله دستور EEPROM.read مقادیر ذخیره شده بر روی حافظه را میخوانیم. در زمان Write، دیتاهای پتانسیومتر با فاصله زمانی نیم ثانیه از یکدیگر در آدرس های 0 تا 20 حافظه EEPROM ذخیره میشوند.
گام سوم: مشاهدۀ خروجی
پس از اینکه آپلود را انجام دادید، برای مشاهده خروجی، سریال مانیتور آردوینو را باز کنید. در ابتدا، عبارتی با این معنی که “برای Write کردن اطلاعات بر روی آدرسهای 0-20 آماده باشید” ظاهر میگردد. 3 ثانبه بعد دیتای موجود بر روی پایه A0 با فاصله زمانی نیم ثانیه بر روی آدرسهای 0 تا 20 ذخیره میگردد. شما با چرخاندن پتانسیومتر میتوانید مقدار دیتای ذخیره شده را تغییر دهید.
در ادامه و پس از 2 ثانیه توقف، دیتای نوشته شده بر روی آدرسهای 0 تا 20 خوانده شده (read) و بر در سریال مانیتور قابل مشاهده میباشند. همانطور که پیشبینی میشد، دیتای خوانده شده از آدرسهای 0 تا 20 با دیتای نوشته بر روی آن مطابقت دارند.
فیلم زیر نیز گویای توضیحات بالا میباشد:
مثال: ذخیره وضعیت LED در حافظه EEPROM
حالا که یاد گرفته اید چگونه حافظه EEPROM آردوینو را برنامه نویسی نید، وقت آن رسیده در عمل آن را استفاده کنیم. اکنون در یک مثال کاربردی میخواهیم عملکرد EEPROM را مورد ارزیابی قرار دهیم. یک عدد LED را توسط میکروسوئیچ روشن و خاموش میکنیم. هدف این است که وضعیت LED بر روی حافظه EEPROM ذخیره شود تا وقتی سیستم ریست شد و برق مدار قطع شد، وضعیت LED مانند قبل از قطع برق شود. برای مثال، اگر زمانی که برق سیستم میرود LED در حالت روشن باشد، در زمان وصل نیز وضعیت LED در حالت روشن باقی بماند.
این در صورتی است که در حالت عادی، با ریست شدن سیستم، وضعیت LED به مقدار پیش فرض خود برمیگردد.
گام اول: سیم بندی
ابتدا مدار آن را به صورت زیر آماده میکنیم:
گام دوم: کد
برنامه زیر را بر روی آردوینو آپلود کنید:
/*
Made on 22 Aug 2021
By Amirmohammad Shojaei
Home
based on randomnerdtutorials.com example
*/
#include
const int buttonPin = 7; // pushbutton pin
const int ledPin = 8; // LED pin
int ledState; // variable to hold the led state
int buttonState; // the current reading from the input pin
int lastButtonState = LOW; // the previous reading from the input pin
// the following variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long lastDebounceTime = 0; // the last time the output pin was toggled
long debounceDelay = 50; // the debounce time; increase if the output flickers
void setup() {
// set input and output
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
//check stored LED state on EEPROM using function defined at the end of the code
checkLedState();
}
void loop() {
// read the state of the switch into a local variable
int reading = digitalRead(buttonPin);
if(reading != lastButtonState) {
// reset the debouncing timer
lastDebounceTime = millis();
}
if((millis() - lastDebounceTime) > debounceDelay) {
// whatever the reading is at, it's been there for longer
// than the debounce delay, so take it as the actual current state:
// if the button state has changed:
if(reading != buttonState) {
buttonState = reading;
// only toggle the LED if the new button state is HIGH
if(buttonState == HIGH) {
ledState = !ledState;
}
}
}
// set the LED state
digitalWrite(ledPin, ledState);
// save the current LED state in the EEPROM
EEPROM.update(0, ledState);
// save the reading. Next time through the loop,
// it'll be the lastButtonState
lastButtonState = reading;
}
// Prints and upates the LED state
// when the Arduino board restarts or powers up
void checkLedState() {
ledState = EEPROM.read(0);
if(ledState == 1) {
digitalWrite(ledPin, HIGH);
}
if(ledState == 0) {
digitalWrite(ledPin, LOW);
}
نکاتی در رابطه با کد برنامه قابل ذکر میباشد:
- کتابخانه EEPROM پیوست شده است.
- اساس این برنامه بر مبنای مثال Debounce آردوینو میباشد.
- در این برنامه بعد هر بار فشار دادن سوئیچ، وضعیت جدید LED بر روی آدرس 0 حافظه EEPROM ذخیره میگردد.
- حال تابعی به نام checkLedState() تعریف میشود. این تابع در حلقه Setup() قرار گرفته و پس از هر بار روشن شدن آردوینو اجرا میشود. اجرای این حلقه باعث میشود وضعیت LED دقیقا مطابق همان چیزی شود که بر روی آدرس 0 حافظه EEPROM ذخیره شده است.
گام سوم: خروجی
خروجی به صورت زیر میباشد:
همانطور که مشاهده میکنید:
- اگر قبل از ریست شدن LED روشن باشد، بعد از ریست نیز روشن می ماند.
- اگر قبل از ریست شدن LED خاموش باشد، بعد از ریست شدن نیز خاموش میماند.
یک گام جلوتر
پس از انجام کامل این آموزش، می توانید موضوعات و طرح های زیر را به عنوان گام بعدی انجام دهید:
- استفاده از آیسی AT24LC256 به عنوان EEPROM خارجی
- یادگیری عملکرد انواع دیگر حافظه ها