پرش به محتوا

دسترسی ساده به SPIFFS در ESP32 و ESP8266

SPIFFS -> تمامی میکروکنترلر ها برای ذخیره اطلاعات نرم افزاری از یک حافظه فلش استفاده میکنند. میکروکنترلر ها حافظه با حجم های متفاوتی دارند که بر اساس پیچیدگی پروژه شما باید به آن توجه کنید. هسته های وای فای شرکت ESPRESSIF که اغلب با ESP8266 و یا ESP32 شناخته می شوند؛ حافظه های فلش مگابایتی دارند که فضای مناسبی برای ذخیره اطلاعات حجیم و پیچیده است.

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

Serial Peripheral Interface File System که به اختصار SPIFFS گفته می شود این امکان را به شما می دهد تا مثل یک فلش مموری فایل های html , css, js, txt یا حتی تصاویر و فیلم های کم حجم را بر روی ESP32 یا ESP8266 ذخیره کنید و هر زمان داخل برنامه به آن نیاز داشتید ؛ اطلاعات را بخوانید یا ویرایش کنید.

ESP32 ESP8266 SPIFFS

حافظه OTA

OTA یا Over the air بخشی از حافظه فلش هست که به کمک آن میتوانید برنامه فریم ور پردازنده خودتون رو تغییر بدید. در واقع یجوری آپدیت نرم افزاری بدون سیم هست که بعدا آموزش استفاده از این قابلیت رو هم میذارم. اما اینجا چه ربطی داره؟ برای اینکه اطلاعات حافظه FS یا همون SPIFFS رو تغییر بدید؛ اول فایل ها و اطلاعات روی این بخش حافظه باگذاری میشه و بعد از راه اندازی ماژول ESP32 یا ESP8266 به حافظه FS منتقل میشه.

کتابخانه SPIFFS

برای راه اندازی سیستم فایل های پردازنده وای فای خودتون کافیه این کتابخانه ها رو فراخوانی کنید. (به طور پیش فرض مورد نصب برد وای فای نصب میشه /:)

آموزش راه اندازی NodeMCU (طبق این آموزش باید هسته وای فای خودتون رو به آردوینو معرفی کنید!)

				
					#include <FS.h>
    #include <SPIFFS.h> //Just ESP32
				
			

تنظیمات آردوینو برای انتخاب مقدار فضای SPIFFS

مشابه تصاویر روبرو مقدار فضای دو حافظه FS و OTA رو میتوانید تنظیم کنید!

کاربرد حافظه SPIFFS

اگر تجربه کار با ماژول وای فای رو داشته باشید، حتما وب سرور لوکال ساختید یا نمونه هاش رو دیدید! مثلا این نمونه ای هست من خودم قبلا گذاشتم رو سایت -> پروژه وب سرور 10 کانال با NodeMCU

همونطور که داخل فیلم تست این پروژه هم مشخص هست قالب صفحه وب خیلی ساده و مختصر با فقط HTML ایجاد شده! اما اگر شما علاقه دارید وب سرور حرفه ای طراحی کنید و به آن قالب اضافه کنید ؛ لازم هست علاوه بر کد های HTML از JS و CSS هم استفاده کنید. راه حل استفاده از SPIFFS هست که به سادگی کد های خودتون رو روی آن ذخیره کنید و داخل برنامه ESP32 یا ESP8266 ازش استفاده کنید!

اما تو این آموزش قصد ندارم نحوه طراحی وب سرور حرفه ای رو بذارم/:

خب داستان اینجا تموم نمیشه و کاربرد های دیگ ای هم داره؛ مثلا برای ذخیره اطلاعات به جای استفاده از EEPROM میتونید از این حافظه استفاده کنید. مزیت این حافظه نسبت به EEPROM توابع ساده تر آن و دسترسی بهتر برای تغییر اطلاعات داخل SPIFFS هست. نحوه کار به این صورته که داخل سیستم ویندوزی خودتون فایل هایی ایجاد میکنید و هر کدوم اطلاعات رو داخل یک فایل .txt ذخیره کنید. بعد از آماده شدن اطلاعات به سادگی روی پردازنده خودتون منتقل کنید و با استفاده از توابع پایین که توضیح میدم ، اطلاعات رو بخوانید یا حتی ویرایش کنید (کل فایل رو حذف کنید یا نام فایل ها رو تغییر بدید!)

انتقال اطلاعات از PC به SPIFFS

برای ریختن اطلاعات افزونه هایی برای آردوینو نوشته شده که به سادگی میتونید نصب کنید و اطلاعات رو منتقل کنید. البته در اینجا ما فقط دسترسی برای ارسال اطلاعات از PC به SPIFFS هسته وای فای خودمان رو داریم و نمیتوانیم اطلاعات داخل SPIFFS رو به PC با این روش منتقل کنیم!

برای انتقال اطلاعات از PC به هسته ESP8266 این افزونه رو دانلود کنید!

برای انتقال اطلاعات از PC به هسته ESP32 این افزونه رو دانلود کنید!

بعد از دانلود افزونه مورد نظرتون (یا هر جفت افزونه ها!) به قسمت Documents سیستم خودتون بروید و در پوشه Arduino که کتابخانه های آردوینو نصب شده یک پوشه جدید با نام tools ایجاد کنید.

SPIFFS ESP32 ESP8266 افزونه

سپس افزونه دانلود شده را از حالت فشرده (zip)  خارج کنید و کل پوشه آن را داخل پوشه جدید که ایجاد کردید منتقل کنید.

نرم افزار آردوینو را ببندید و مجدد باز کنید؛ افزونه های نصب شده مانند تصویر زیر به نرم افزار شما اضافه خواهد شد 🙂

آپلود SPIFFS ESP32 ESP8266

پس از اتمام نصب افزونه برای ESP32 یا ESP8266 به سراغ انتقال اطلاعات میرویم! ابتدا برنامه خودتون رو در پوشه مشخصی سیو کنید و بیاید تا بگم /:
در کنار فایل اصلی آردوینو که با پسوند .ino ذخیره شده یک پوشه جدید با اسم data ایجاد کنید. زمانی که از افزونه sketch Data Upload استفاده کنید؛ تمامی اطلاعات داخل پوشه data به پردازنده شما منتقل میشه 🙂

تا اینجا اطلاعات رو به SPIFFS هسته وای فای ESP32 یا ESP8266 انتقال دادیم! راستی دو نکته بسیار مهم برای آپلود اطلاعات باید در نظر داشته باشید؛ اول اینکه هسته وای فای شما باید در مود پروگرام باشه تا اطلاعات رو دریافت کنه و دوم نباید سریال مانیتور باز باشه وگرنه خطا میده و آپلود نمیشه و میای این زیر کامنت میذاری کار نکرد 🙁

توابع SPIFFS

در اکثر سایت ها میتونید توابعش رو پیدا کنید و آخر سر هم نمیتونید همشو راه اندازی کنین /: بخاطر همین بیاید به روش من این کار رو انجام بدیم 🙂

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

اول روی این لینک بزنید و فایل هدر که حاوی توابع ساده شده هست رو دانلود کنید.

حالا برای استفاده از توابع کافیه این فایل هدر رو کنار برنامه آردوینو خودتون بریزیرد و با اون پوشه data که گفتم باید ترکیبی مثل فایل های زیر داشته باشید 🙂

نمونه کد SPIFFS ESP32 ESP8266

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

برای استفاده از فایل هدر باید آن را به برنامه اصلی معرفی کنید؛ مانند نمونه کد زیر فایل هدر SPIFFS را فراخوانی میکنیم.

این نکته رو کلا برای فایل های هدر مد نظر داشته باشید؛ برای استفاده از توابع یک کتابخانه دیگر در فایل هدر، باید آن کتابخانه را در فایل هدر فراخوانی کنید نه فایل اصلی برنامه ، که البته کتابخانه تعریف شده هم داخل فایل هدر قابل استفاده است هم در برنامه اصلی :/

				
					#include "SPIFFS_function.h"
				
			

توابع فایل هدر SPIFFS

راه اندازی حافظه SPIFFS

				
					SPIFFS.begin(FORMAT_SPIFFS_IF_FAILED);
				
			

تابع بالا حافظه SPIFFS را راه اندازی میکند. در صورت بروز خطا در راه اندازی میتواند کل حافظه SPIFFS را فرمت کند.

در آرگومان آن باید مشخص کنید که در صورت بروز خطا حافظه فرمت شود یا خیر!

این تابع در حلقه setup استفاده میشود.

				
					#define FORMAT_SPIFFS_IF_FAILED false
if (!SPIFFS.begin(FORMAT_SPIFFS_IF_FAILED))
  {
    Serial.println("SPIFFS Mount Failed");
    return;
  }
				
			

لیست فایل های SPIFFS

				
					FSlistDir(String dirname, uint8_t levels);
				
			

تابع بالا لیست تمامی فایل ها و پوشه های SPIFFS را در قالب رشته String برمیگرداند.

در آرگومان اول (dirname) نام پوشه مورد نظرتون رو میتونید وارد کنید تا لیست فایل های فقط همان پوشه را برگرداند. برای نوشتن نام پوشه یا فایل باید از اسلش قبل از اسم آن استفاده کنید.

در کد زیر ابتدا تمامی اطلاعات را در سریال چاپ میکند و سپس فقط اطلاعات پوشه wifi را در سریال چاپ میکند.

				
					Serial.println(FSlistDir("/", 0));
  Serial.println(FSlistDir("/wifi", 0));
				
			

خواندن فایل از حافظه SPIFFS

				
					FSreadFile(String path);
				
			

تابع بالا اطلاعات داخل فایل مورد نظر را میخواند و برمیگرداند

در آرگومان آن (path) نام فایل مورد نظر را باید بنویسید. برای نوشتن نام باید آدرس آن فایل هم مشخص کنید.

در کد زیر فایل test.txt را در پوشه wifi و فایل web.html را در حافظه اصلی میخواند و در سریال چاپ میکند.

				
					Serial.println(FSreadFile("/wifi/test.txt"));
Serial.println(FSreadFile("/web.html"));
				
			

نوشتن در فایل از حافظه SPIFFS

				
					FSwriteFile(String path, String message);
				
			

تابع بالا اطلاعات مورد نظر را در فایل مورد نظر مینویسد. (اطلاعات ورودی جایگزین اطلاعات قبلی می شود)

در آرگومان اول (path) نام فایل مورد نظر را باید بنویسید. برای نوشتن نام باید آدرس آن فایل هم مشخص کنید.

در آرگومان دوم (message) اطلاعات ورودی برای نوشتن در فایل انتخابی را بنویسید.

در کد زیر متن “hello world” را در فایل test.txt در پوشه wifi مینویسد.

				
					FSwriteFile("/wifi/test.txt", "hello world");
				
			

افزودن اطلاعات به فایل در حافظه SPIFFS

				
					FSappendFile(String path, String message);
				
			

تابع بالا اطلاعات مورد نظر را به فایل مورد نظر اضافه میکند و در آن مینویسد. (اطلاعات ورودی به اطلاعات قبلی اضافه می شود)

در آرگومان اول (path) نام فایل مورد نظر را باید بنویسید. برای نوشتن نام باید آدرس آن فایل هم مشخص کنید.

در آرگومان دوم (message) اطلاعات ورودی برای نوشتن در فایل انتخابی را بنویسید.

در کد زیر متن “i’m IMAX” را به فایل test.txt در پوشه wifi اضافه میکند.

				
					FSappendFile("/wifi/test.txt", "i'm IMAX");
				
			

تغییر نام یا محل ذخیره فایل ها در حافظه SPIFFS

				
					FSrenameFile(String path1, String path2);
				
			

تابع بالا نام یا محل فایل مورد نظر را تغییر میدهد.

در آرگومان اول (path1) نام فعلی فایل مورد نظر را باید بنویسید. برای نوشتن نام باید آدرس آن فایل هم مشخص کنید.

در آرگومان دوم (path2) نام جدید فایل مورد نظر را باید بنویسید. برای نوشتن نام باید آدرس آن فایل هم مشخص کنید.

در کد زیر فایل test.txt را از پوشه wifi به پوشه gsm منتقل میکنیم و سپس نام فایل را به IMAX.txt تغییر میدهیم. (به جای استفاده از دو تابع میتوانید در یک تابع هم محل فایل را تغییر دهید و هم نام فایل را تغییر دهید)

				
					FSrenameFile("/wifi/test.txt","/gsm/test.txt");
FSrenameFile("/gsm/test.txt","/gsm/IMAX.txt");
or
FSrenameFile("/wifi/test.txt","/gsm/IMAX.txt");
				
			

حذف فایل از حافظه SPIFFS

				
					FSdeleteFile(String path);
				
			

تابع بالا فایل مورد نظر را حذف میکند.

در آرگومان (path) نام فایل مورد نظر برای حذف را باید بنویسید. برای نوشتن نام باید آدرس آن فایل هم مشخص کنید.

در کد زیر فایل IMAX.txt را در پوشه gsm حذف میکند.

				
					FSdeleteFile("/gsm/IMAX.txt");
				
			

و در آخر...

از اینکه این آموزش جامع را مطالعه کردید ممنونم. در صورت بروز هر گونه مشکل یا سوال از طریق دیدگاه های همین صفحه مشکل خودتون رو مطح کنید تا راهنماییتون کنم!

برای دانلود نمونه برنامه تست توابع SPIFFS کلیک کنید!

راستی اگر نیاز داشتید توابع فایل هدر رو تغییر بدید یا از توابع اصلی SPIFFS استفاده کنید، میتونید داخل فایل هدر دست ببرید /:

میلاد نیک پندار

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

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

ورود

عضو سایت نیستید؟ برای ثبت نام کلیک کنید

تماس با ما

این پیام توسط مدیریت سایت دریافت میشود.

عضویت

عضو سایت هستید؟ برای ورود کلیک کنید