راه اندازی فلش مموری

به آموزش راه اندازی فلش مموری خوش اومدید.

تو این آموزش روش ذخیره و خوندن اطلاعات از فلش مموری ESP32 رو در نرم افزار Arduino IDE یاد می گیریم. اطلاعاتی که تو فلش مموری هستن با ریست کردن و یا خاموش کردن از بین نمیرن . برای مثال ذخیره کردن وضعیت یک پین GPIO رو با هم بررسی می کنیم.

برای بررسی این مثال لازمه قطعات زیر رو داشته باشیم :

  • ESP32 DOIT DEVKIT V1 Board
  • LED  5mm
  • مقاومت ۳۳۰ اهم
  • کلید Pushbutton
  • مقاومت ۱۰ کیلو اهم
  • بِردبُرد
  • سیم جامپر

فلش مموری

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

کابردهای حافظه فلش

  • ذخیره آخرین وضعیت یک متغیر
  • ذخیره تنظیمات
  • ذخیره تعداد دفعات فعال شدن یک برنامه
  • و یا هر اطلاعات و داده ای که نیاز هست به صورت دائمی ذخیره بشه.

کتابخونه EEPROM

برای اینکه بتونیم تو نرم افزار Arduino IDE از حافظه فلش ESP32 داده بخونیم و یا بنویسیم لازمه کتابخونه EEPROM رو نصب کنیم. با استفاده از این کتابخونه و ESP32 حداکثر تا ۵۱۲ بایت تو حافظه فلش دسترسی داریم. این یعنی ۵۱۲ آدرس حافظه میشه داشت و یک مقدار بین ۰ تا ۲۵۵ رو تو این آدرس ها میشه ذخیره کرد.  

نوشتن

برای نوشتن تو حافظه فلش با دستور ()EPROM.write که دو ورودی داره (آدرس حافظه و مقداری که باید نوشته بشه) اجرا میشه.

EEPROM.write(address, value);

مثال : نوشتن ۹ تو آدرس صفر و ذخیره کردن.

EEPROM.write(0, 9);
EEPROM.commit();

خوندن

برای خوندن از حافظه فلش با دستور ()EPROM.read که ورودیش آدرس حافظه است اجرا میشه.

EEPROM.read(address);

مثال : خوندن محتوای آدرس صفر مثال قبلی.

EEPROM.read(0);

تو جواب ۹ دریافت میشه.

نگهداری آخرین وضعیت GPIO

برای اثبات این موضوع ما وضعیت یک پین خروجی رو که مربوط به یک LED هست رو بررسی می کنیم . سناریوی زیر رو تصور کنید:

  • یک لامپی رو با ESP32 داریم کنترل می کنیم
  • تنظیمات رو برای روشن کردن لامپ انجام میدیم
  • به طور ناگهانی منبع تغذیه ESP32 قطع میشه
  • و با وصل شدن مجدد ESP32 به منبع ، لامپ همچنان خاموشه. دلیلش اینه که تنظیماتی که قبل قطع شدن تغذیه اعمال شد ذخیره نشدن.

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

این راه حل رو تو شکل زیر میشه متوجه شد.

شماتیک

کلید و LED و مقاومت ها رو مطابق شکل زیر ببندید .

کد برنامه

کد زیر رو تو نرم افزار Arduino IDE کپی و تو ESP32 آپلود کنید.

/*********
  Rui Santos
  Complete project details at https://randomnerdtutorials.com  
*********/

// include library to read and write from flash memory
#include <EEPROM.h>

// define the number of bytes you want to access
#define EEPROM_SIZE 1

// constants won't change. They're used here to set pin numbers:
const int buttonPin = 4;    // the number of the pushbutton pin
const int ledPin = 16;      // the number of the LED pin

// Variables will change:
int ledState = HIGH;         // the current state of the output pin
int buttonState;             // the current reading from the input pin
int lastButtonState = LOW;   // the previous reading from the input pin

// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.
unsigned long lastDebounceTime = 0;  // the last time the output pin was toggled
unsigned long debounceDelay = 50;    // the debounce time; increase if the output flickers

void setup() { 
  Serial.begin(115200);
  
  // initialize EEPROM with predefined size
  EEPROM.begin(EEPROM_SIZE);

  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);

  // read the last LED state from flash memory
  ledState = EEPROM.read(0);
  // set the LED to the last stored state
  digitalWrite(ledPin, ledState);
}

void loop() {
  // read the state of the switch into a local variable:
  int reading = digitalRead(buttonPin);

  // check to see if you just pressed the button
  // (i.e. the input went from LOW to HIGH), and you've waited long enough
  // since the last press to ignore any noise:

  // If the switch changed, due to noise or pressing:
  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;
      }
    }
  }
  // save the reading. Next time through the loop, it'll be the lastButtonState:
  lastButtonState = reading;
  
  // if the ledState variable is different from the current LED state
  if (digitalRead(ledPin)!= ledState) {  
    Serial.println("State changed");
    // change the LED state
    digitalWrite(ledPin, ledState);
    // save the LED state in flash memory
    EEPROM.write(0, ledState);
    EEPROM.commit();
    Serial.println("State saved in flash memory");
  }
}

تو این کد هر دفعه با فشار دادن کلید وضعیت LED تغییر می کنه. همچنین با ریست کردن و یا قطعی منبع تغذیه آخرین وضعیتی که برای LED تعریف شده رو هم به یاد میاره . خب با هم ببینیم این عملکرد متفاوت تو کدوم بخش کد تعریف شده.

بعد از اینکه کتابخونه و تنظیمات مربوط به اندازه EEPROM و متغیرهای دیگه نوشته شد ، تو قسمت ()setup تنظیمات مقداردهی اولیه به EEPROM اعمال میشه . تو این بخش آخرین وضعیت LED از آدرس صفر حافظه فلش خونده میشه (خطوط ۲۶ تا ۳۳).

بعد از خوندن وضعیت خاموش یا روشن بودن  LED از حافظه فلش ، باید بلافاصله LED هم همون وضعیت رو دریافت کنه (خطوط ۳۶ و ۳۸).

تو قسمت ()loop بررسی میشه که آیا بعد از زدن کلید وضعیت متغیر ()ledState به درستی به روز رسانی میشه یا نه. برای این کار یک تایمر در نظر گرفته شده (خطوط ۴۱ تا ۷۰).

هر بار که LED تغییر وضعیت میده باید تو حافظه فلش ذخیره بشه. همچنین وضعیت GPIO با ledState مقایسه میشه که متفاوت نباشن (خطوط ۷۳ و ۷۴).

اگر وضعیت این دو با هم فرق داشته باشه با دستور ()digitalWrite این ناهماهنگی برطرف میشه (خط ۷۶).

تو مرحله بعدی هم با دستور ()EEPROM.write وضعیت LED تو حافظه فلش ذخیره میشه. آدرس حافظه و مقداری که باید ذخیره بشه(مقدار متغیر ledState) ورودی های این دستور هستن . تو مرحله آخر هم این تغییرات اعمال میشه (خط ۷۸ و ۷۹).

پیاده سازی

بعد از آپلود کردن کد ، کلید رو بزنید که LED خاموش (یا روشن) بشه. با ریست کردن ESP32 و یا خاموش کردنش وضعیت LED باید بدون تغییر بمونه.

پایان آموزش راه اندازی فلش مموری.

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

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

قبلا حساب کاربری ایجاد کرده اید؟
گذرواژه خود را فراموش کرده اید؟
Loading...