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

کار با حافظه 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(, 9);

خواندن در EEPROM

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

EEPROM.read(address);

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

EEPROM.read();

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

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

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

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

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

EEPROM.update(address, value);

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

EEPROM.update(, 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(,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);
     }
}
5/5 - (1 امتیاز)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام آیرنکس را دنبال کنید.
تصویر از محمد رحیمی

محمد رحیمی

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

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

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