دسترسی ساده به SPIFFS در ESP32 و ESP8266
SPIFFS -> تمامی میکروکنترلر ها برای ذخیره اطلاعات نرم افزاری از یک حافظه فلش استفاده میکنند. میکروکنترلر ها حافظه با حجم های متفاوتی دارند که بر اساس پیچیدگی پروژه شما باید به آن توجه کنید. هسته های وای فای شرکت ESPRESSIF که اغلب با ESP8266 و یا ESP32 شناخته می شوند؛ حافظه های فلش مگابایتی دارند که فضای مناسبی برای ذخیره اطلاعات حجیم و پیچیده است.
این تمام ماجرا نیست، این هسته ها یک قابلیت فوق العاده در اختیار شما قرار می دهند که به سادگی بتوانید به حافظه پردازنده خود دسترسی مستقیم داشته باشید. مزیت این سیستم ذخیره اطلاعاتی هست که با قطع برق و یا ریست شدن پردازنده نباید از بین بروند.
Serial Peripheral Interface File System که به اختصار SPIFFS گفته می شود این امکان را به شما می دهد تا مثل یک فلش مموری فایل های html , css, js, txt یا حتی تصاویر و فیلم های کم حجم را بر روی ESP32 یا ESP8266 ذخیره کنید و هر زمان داخل برنامه به آن نیاز داشتید ؛ اطلاعات را بخوانید یا ویرایش کنید.
حافظه OTA
OTA یا Over the air بخشی از حافظه فلش هست که به کمک آن میتوانید برنامه فریم ور پردازنده خودتون رو تغییر بدید. در واقع یجوری آپدیت نرم افزاری بدون سیم هست که بعدا آموزش استفاده از این قابلیت رو هم میذارم. اما اینجا چه ربطی داره؟ برای اینکه اطلاعات حافظه FS یا همون SPIFFS رو تغییر بدید؛ اول فایل ها و اطلاعات روی این بخش حافظه باگذاری میشه و بعد از راه اندازی ماژول ESP32 یا ESP8266 به حافظه FS منتقل میشه.
کتابخانه SPIFFS
برای راه اندازی سیستم فایل های پردازنده وای فای خودتون کافیه این کتابخانه ها رو فراخوانی کنید. (به طور پیش فرض مورد نصب برد وای فای نصب میشه /:)
آموزش راه اندازی NodeMCU (طبق این آموزش باید هسته وای فای خودتون رو به آردوینو معرفی کنید!)
#include
#include //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 ایجاد کنید.
سپس افزونه دانلود شده را از حالت فشرده (zip) خارج کنید و کل پوشه آن را داخل پوشه جدید که ایجاد کردید منتقل کنید.
نرم افزار آردوینو را ببندید و مجدد باز کنید؛ افزونه های نصب شده مانند تصویر زیر به نرم افزار شما اضافه خواهد شد 🙂
پس از اتمام نصب افزونه برای ESP32 یا ESP8266 به سراغ انتقال اطلاعات میرویم! ابتدا برنامه خودتون رو در پوشه مشخصی سیو کنید و بیاید تا بگم /:
در کنار فایل اصلی آردوینو که با پسوند .ino ذخیره شده یک پوشه جدید با اسم data ایجاد کنید. زمانی که از افزونه sketch Data Upload استفاده کنید؛ تمامی اطلاعات داخل پوشه data به پردازنده شما منتقل میشه 🙂
تا اینجا اطلاعات رو به SPIFFS هسته وای فای ESP32 یا ESP8266 انتقال دادیم! راستی دو نکته بسیار مهم برای آپلود اطلاعات باید در نظر داشته باشید؛ اول اینکه هسته وای فای شما باید در مود پروگرام باشه تا اطلاعات رو دریافت کنه و دوم نباید سریال مانیتور باز باشه وگرنه خطا میده و آپلود نمیشه و میای این زیر کامنت میذاری کار نکرد 🙁
توابع SPIFFS
در اکثر سایت ها میتونید توابعش رو پیدا کنید و آخر سر هم نمیتونید همشو راه اندازی کنین /: بخاطر همین بیاید به روش من این کار رو انجام بدیم 🙂
ما توابعش رو براتون ساده کردیم و یسری تابع جدید در اختیارتون میذاریم که ساده تر بتونید از این حافظه استفاده کنید. البته این نکته رو در نظر داشته باشید که برای ذخیره و خواندن اطلاعات کاربرد داره و برای اون داستان وب سرور حرفه ای که گفتم باید از تابع اصلیش که بعدا آموزش میدم استفاده کنید.
اول روی این لینک بزنید و فایل هدر که حاوی توابع ساده شده هست رو دانلود کنید.
حالا برای استفاده از توابع کافیه این فایل هدر رو کنار برنامه آردوینو خودتون بریزیرد و با اون پوشه data که گفتم باید ترکیبی مثل فایل های زیر داشته باشید 🙂
فراخوانی فایل هدر در برنامه آردوینو
برای استفاده از فایل هدر باید آن را به برنامه اصلی معرفی کنید؛ مانند نمونه کد زیر فایل هدر 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 استفاده کنید، میتونید داخل فایل هدر دست ببرید /:
با سلام
ممنون بابت آموزش جامع و عالیتون، ممنون میشم راه حل
دریافت فایل های روی spiffs بر روی کامپیوتر رو هم بگید
یا یه رفرنس معرفی کنید.
با تشکر
سلام از طریق وب سرور میتونید فایل های سیستم فایل SPIFFS رو دانلود یا آپلود کنید
دمت گرم
موفق باشید🙂