آموزش آردوینو

کار با حافظه EEPROM در آردوینو (آموزش ای ای پرام Arduino)

این آموزش توضیح می دهد که EEPROM چیست و چه کاربردی در پروژه های آردوینو دارد. ما همچنین به شما نشان خواهیم داد که چگونه در حافظه EEPROM بنویسید و مقادیر قبلی را بخوانید و یک نمونه پروژه بسازید تا مفاهیم آموخته شده را به صورت عملی فرا بگیرید.

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

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

حافظه EEPROM چیست؟

میکروکنترلر روی برد آردوینو (ATMEGA328 در برد Arduino UNO، در شکل زیر نشان داده شده است) دارای EEPROM (حافظه فقط خواندنی قابل برنامه ریزی با قابلیت پاک شدن الکتریکی) است. این یک فضای کوچک است که می تواند متغیرهای بایت را ذخیره کند.

متغیرهای ذخیره شده در EEPROM در آنجا نگهداری می‌شوند و زمانی رخ می‌دهند که آردوینو را ریست یا خاموش کنید. به سادگی، EEPROM یک ذخیره سازی دائمی مشابه یک هارد دیسک در رایانه ها است. EEPROM را می توان به صورت الکترونیکی خواند، پاک کرد و دوباره نوشت. در آردوینو، می توانید با استفاده از کتابخانه EEPROM به راحتی از EEPROM بخوانید و بنویسید.

در EEPROM چند بایت می توانید ذخیره کنید؟

هر مکان EEPROM می تواند یک بایت ذخیره کند، به این معنی که شما فقط می توانید اعداد 8 بیتی را ذخیره کنید که شامل مقادیر صحیح بین 0 تا 255 است. تعداد بایت هایی که می توانید در EEPROM ذخیره کنید به میکروکنترلرهای بردهای آردوینو بستگی دارد. به جدول زیر دقت کنید:

Microcontroller EEPROM
ATmega328 (Arduino Uno, Nano, Mini) 1024 bytes
ATmega168 (Arduino Nano) 512 bytes
ATmega2560 (Arduino Mega) 4096 bytes

با این حال، اگر نیاز به ذخیره داده های بیشتری دارید، می توانید یک قطعه EEPROM (آی سی جداگانه) خریداری کنید.

EEPROM عمر محدودی دارد. در آردوینو، EEPROM برای انجام 100000 چرخه نوشتن/پاک کردن برای هر مکان آماده شده است. با این حال، خواندن مقادیر آن نامحدود است. این بدان معنی است که می توانید هر چند بار که بخواهید از EEPROM چیزی را بخوانید بدون اینکه عمر آن را تمام کنید.

کاربرد EEPROM در پروژه های آردوینو

EEPROM در پروژه‌های آردوینو که نیاز به حفظ داده‌ها دارند، حتی زمانی که آردوینو ریست می‌شود یا زمانی که برق قطع می‌شود، مفید است. یادآوری آخرین وضعیت یک متغیر یا به خاطر سپردن چند بار فعال شدن یک دستگاه بسیار مفید است.

به عنوان مثال، سناریوی زیر را تصور کنید:

  1. شما در حال کنترل یک لامپ با آردوینو خود هستید و لامپ روشن است.
  2. آردوینو به طور ناگهانی برق خود را از دست می دهد.
  3. وقتی برق دوباره وصل می شود، لامپ خاموش می ماند یعنی آخرین وضعیت خود را حفظ نمی کند.

کاربرد EEPROM در پروژه های آردوینو

شما قطعا نمی خواهید این اتفاق بیفتد. شما می خواهید که آردوینو قبل از از دست دادن برق به یاد داشته باشد که چه اتفاقی افتاده و بعد از برگشت برق، آخرین وضعیت خود را ادامه دهد.

برای حل این مشکل، می توانید وضعیت لامپ را در EEPROM ذخیره کنید و شرطی را به طرح خود اضافه کنید تا در ابتدا بررسی کنید که آیا وضعیت لامپ با وضعیت ذخیره شده قبلی در EEPROM مطابقت دارد یا خیر.

ما این را با مثالی در ادامه این پست نشان خواهیم داد.

کار با EEPROM در آردوینو

با استفاده از کتابخانه EEPROM می توانید به راحتی چیزی را در EEPROM بخوانید و بنویسید.

اگر در مورد این مطلب سوالی دارید در قسمت نظرات بپرسید

برای گنجاندن کتابخانه EEPROM کافیست خط زیر را در کد خود قرار دهید.

#include <EEPROM.h>

نوشتن در EEPROM

برای نوشتن داده ها در EEPROM، از تابع EEPROM.write() استفاده می کنیم که دو پارامتر می گیرد. اولی مکان یا آدرس EEPROM است که می‌خواهید داده‌ها را در آن ذخیره کنید، و دومی مقداری است که می‌خواهیم ذخیره کنیم:

EEPROM.write(address, value);

به عنوان مثال، برای نوشتن 9 در آدرس 0، شما باید کد زیر را بنویسید:

EEPROM.write(0, 9);

خواندن در EEPROM

برای خواندن یک بایت از EEPROM، از تابع EEPROM.read() استفاده می کنیم. این تابع یک پارامتر را میگیرد که آدرسی است که میخواهم آن را بخوانیم.

EEPROM.read(address);

به عنوان مثال، برای خواندن بایت ذخیره شده قبلی در آدرس 0 از دستور زیر استفاده میکنیم:

EEPROM.read(0);

این تابع عدد 9 را برمی گرداند که مقدار ذخیره شده در آن مکان است.

بروزرسانی در حافظه EEPROM

تابع EEPROM.update() بسیار مفید است زیرا فقط در صورتی روی EEPROM مقدار جدیدی را می نویسد که مقدار جدید با مقدار ذخیره شده قبلی متفاوت باشد.

از آنجایی که EEPROM به دلیل چرخه های نوشتن/پاک کردن محدود، امید عمر محدودی دارد، استفاده از تابع EEPROM.update() به جای EEPROM.write در استفاده از چرخه های نوشتن و پاک کردن صرفه جویی میکند.

شما باید از تابع EEPROM.update() به صورت زیر استفاده کنید:

EEPROM.update(address, value);

در حال حاضر، مقدار 9 در آدرس 0 ذخیره شده است. بنابراین، اگر دستور زیر را وارد کنید:

EEPROM.update(0, 9);

آردوینو دوباره روی EEPROM نمی نویسد، زیرا مقدار ذخیره شده در حال حاضر همان است که می خواهیم بنویسیم.

ذخیره وضعیت LED در حافظه EEPROM

در این مثال، ما به شما نشان می‌دهیم که چگونه آردوینو حالت LED را به خاطر بسپارد، حتی زمانی که آردوینو را ریست می‌کنیم یا برق قطع می‌شود.

شکل زیر نشان می دهد که ما قصد داریم چه چیزی را مثال بزنیم:

ذخیره وضعیت LED در حافظه EEPROM

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

در اینجا قطعات مورد نیاز برای این پروژه را لیست کرده ایم:

  • Arduino UNO
  • LED
  • مقاومت 220Ω
  • دکمه فشاری
  • مقاومت 1kΩ
قطعات مورد نیاز را از فروشگاه قطعات آیرنکس تهیه کنید.

شماتیک پروژه در زیر قرار داده شده است. این مدار فقط دارای یک دکمه است که LED را روشن و خاموش می کند.

مدار وضعیت ال ای دی در ای ای پرام آردوینو

کد زیر را در Arduino IDE کپی کرده و در برد آردوینو خود آپلود کنید. مطمئن شوید که برد و پورت COM مناسب را انتخاب کرده اید.

#include 

const int buttonPin = 8;    // پین دکمه
const int ledPin = 4;       // پین ال ای دی

int ledState;                // متغیر وضعیت ال ای دی 
int buttonState;             // متغیر وضعیت دکمه
int lastButtonState = LOW;   // آخرین وضعیت دکمه


// کد های مربوط به دیبانس
long lastDebounceTime = 0;  // آخرین تایم دیبانس
long debounceDelay = 50;    // مقدار زمان دیبانس

void setup() {
  // تعیین ورودی و خروجی
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);

  //تعیین وضعیت اولیه ال ای دی
  digitalWrite(ledPin, ledState);

  // سریال مانیتور
  Serial.begin (9600);

  //بررسی وضعیت ال ای دی
  checkLedState(); 
}

void loop() {
  // خواندن وضعیت دکمه
  int reading = digitalRead(buttonPin);

  if(reading != lastButtonState) {
    // ریست تایمر دیبانس
    lastDebounceTime = millis();
  }

  if((millis() - lastDebounceTime) > debounceDelay) {
    // بررسی وضعیت دکمه
    if(reading != buttonState) {
      buttonState = reading;

      // وضعیت جدید ال ای دی
      if(buttonState == HIGH) {
        ledState = !ledState;
      }
    }
  }

  // تنظیم وضعیت جدید
  digitalWrite(ledPin, ledState);
  //ذحیره وضعیت در ای ای پرام
  EEPROM.update(0, ledState);
  // ذخیره آخرین وضعیت دکمه
  lastButtonState = reading;
}

// چاپ وضعیت در سریال مانیتور
void checkLedState() {
   Serial.println("LED status after restart: ");
   ledState = EEPROM.read(0);
   if(ledState == 1) {
    Serial.println ("ON");
    digitalWrite(ledPin, HIGH);
   } 
   if(ledState == 0) {
    Serial.println ("OFF");
    digitalWrite(ledPin, LOW);
   }
}

این یک کد ساده است که با هر بار فشار دادن دکمه، حالت LED را تغییر می دهد. اما نکته خاصی در مورد این کد وجود دارد یعنی وضعیت LED را حتی پس از ریستارت کردن یا روشن کردن آردوینو به خاطر می آورد.

حالت LED را در متغیر ledState ذخیره می کنیم و با خط زیر آن را در EEPROM ذخیره می کنیم:

EEPROM.update(0,ledState);

در ابتدای کد موجود در setup()، متغیر ledState ذخیره شده در EEPROM را بررسی می کنیم و زمانی که برنامه را مجدداً راه اندازی می کنیم، led را مطابق با آن حالت روشن یا خاموش می کنیم. ما این کار را با تابع checkLedState() که در انتهای کد ایجاد کرده ایم انجام می دهیم.

void checkLedState() {
    Serial.println("LED status after restart: ");
    ledState = EEPROM.read(0);
     if (ledState == 1) {
       Serial.println ("ON");
       digitalWrite(ledPin, HIGH);
     } 
     if (ledState == 0) {
       Serial.println ("OFF");
       digitalWrite(ledPin, LOW);
     }
}
4.3 (3 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

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

20 نظر

  1. سلام درود،راستش من یک سنسور کنترل رطوبت درست کردم تا رطوبت رو کنترل کنه و چند بار هم تو حافظه eeprom مقدار تنظیم رطوبت رو ذخیره کردم ولی وقتی که اردوینو خاموش شد دوباره برگشت به حالت اول و صفر بود عدد رطوبت میتونید راهنمایی کنید؟

    1. سلام عزیز
      کدی که نوشتید را در انجمن ارسال کنید

  2. سلام من یک آردوینوی نانو خریدم
    مشکل اینجاست که همه پایه ها رو HIGH در نظر میگیره
    یعنی هرکدی که مینویسم و دستور digitalread بهش میدم ، با وجود اینکه ولتاژی در پایه ها نیست ولی میزنه HIGH
    مشکل چیه؟

    1. سلام عزیز
      کدتان را در انجمن ارسال کنید

  3. سلام وقت بخیر این کد هایی که داخل سایت آموزش داده میشن مربوط به چه نرم افزاری هست کد ویژن یا اتمل استودیو؟

    1. سلام عزیز
      ما برای نرم افزار های مختلف آموزش داریم. این مطلب برای نرم افزار آردوینو هست و برای یادگیری آردوینو میتوانید دوره آموزش آردوینو را مشاهده کنید.

  4. با سلام و خسته نباشید. بنده میخواستم در آردوینو برنامه ای بنویسم که اگر پسورد صحیح بود چرا ال ای دی روشن شود. آیا چنین کاری مقدور است؟

    1. سلام عزیز
      بله میتوانید این پروژه را اجرا کنید. برای یادگیری برنامه نویسی آردوینو دوره آموزش آردوینو را مشاهده کنید.

  5. سلام. ببخشید چطور میتونم در eeprom شماره موبایل ذخیره کنم و بخوانم؟ جلسه مربوط به eeprom دوره را هم مجددا دیدم اما متوجه نشدم چه باید بکنم.

    1. سلام عزیز
      هر عدد از شماره را در یک حافظه EEPROM ذخیره کنید.

  6. سلام آیا در eeprom آردینو یونو امکان ذخیره ۸ شماره تلفن همراه وجود دارد؟

  7. سلام. اگر برنامه و دستورات دیگر هم در EEPROM ذخیره می شوند؟ یا ما از همه فضای EEPROM می توانیم برای داده هایی که خودمون در خافظه می نویسیم و فراخوانی می کنیم استهفاده کنیم؟

    1. سلام عزیز
      حافظه EEPROM محدود هست و فقط باید داده هایی را در آن ذخیره کنید که بعدا به آن ها نیاز خواهید داشت و نمیخواهید با قطع برق از بین برود.

  8. سلام استاد خسته نباشید استاد ادرس دهی ها چجوریه تا چقدر است

    1. سلام عزیز
      با توجه به میکروکنترلر برد شما متفاوت هست باید بررسی کنید چقدر حافظه eeprom دارید.

    1. نام آی سی و کلمه arduino رو در گوگل سرچ کنید طرح شماتیک رو میتونید دانلود کنید

  9. سلام.خسته نباشید آقای رحیمی.ببخشید اگه بخوایم یه حافظه eeprom خارجی مثل آیسی athyc816 به اردوینو متصل کنیم چیکار کنیم؟

    1. سلام عزیز
      میتونید کتابخانه External EEPROM Arduino رو دانلود کنید که با آیسی های 24LC1025 و 24LC256 تست شده

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *