ESP8266 SPIFFS

آموزش کار با ESP8266 – SPIFFS

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

SPI Flash File System

خب اول باید بدانیم اصلا SPIFFS چی هست؟ ترجمه‌ی لغتی آن می شود: سیستم ارتباط سریالی به فایلهای محیط فلش. البته من این مدلی ترجمه‌اش کردم چون درکش را راحت تر می کند.

تا الان وقتی که ما می خواستیم کد HTML را در ESP8266 ذخیره کنیم. باید آنرا به صورت یک رشته ذخیره می کردیم. و مستقیم نمی‌توانستیم یک فایل HTML را داخل ESP8266 ذخیره کنیم. ولی از الان به بعد SPIFFS این امکان را به ما می‌دهد که شبیه کامپیوتر در داخل ESP8266 فولدری ایجاد کنیم. و سپس داخل آن فایلهای خود را ذخیره کنیم. تقریبا شبیه کامپیوتر ولی با محدودیت فضای حافظه‌ی کمتر. فایل را بخوانیم و داخل آن بنویسیم.

اگر توجه داشته باشید در برنامه‌ی آردوینو در هنگام انتخاب بورد. در قسمت Tools>Flash Size وقتی می‌خواهیم مقدار حافظه را مشخص کنیم. با همچین گزینه‌هایی مواجه می‌شویم.

Flash Size

Flash Size

 

می‌بینید که اندازه‌ی فلش را می توانیم انتخاب کنیم، با اندازه‌های مختلفی از SPIFFS . این اندازه باید بر اساس اندازه‌ی فایل ما تنظیم شود. هرچقدر که فایل ما فضا نیاز دارد، اینجا برایش جای بیشتری در نظر می گیریم.

خب حالا قبل از اینکه به بحثهای اصلی بپردازیم. باید یک پلاگین را در برنامه‌ی آردوینو خود نصب کنید. اگه توجه کنید می‌بینید که در منوی Tools من، یک گزینه به اسم ESP8266 Sketch Data Upload هست، که به احتمال زیاد در منوی شما نیست.

اول از همه به این آدرس برای دانلود رفته: آخرین ورژن  PLUGIN را دانلود کنید. و در این لینک هم کلیه توضیحات را برای نصب داده شده است. ولی من به طور خلاصه توضیح می‌دهم.

  1. فولدر Sketch ها را پیدا کنید.File > Preferences > Sketchbook Location
  2. بعد یک فولدر به اسم tools درست کنید.
  3. فایل زیپ را به داخل آن انتقال داده.
  4. فایل زیپ را Extract کنید.
  5. در آخر باید مسیری به این شکل داشته باشید. <sketchbook directory>/tools/ESP8266FS/tool/esp8266fs.jar

بعد اتمام کار آردوینو را بسته و دوباره باز کنید. حال باید گزینه‌ی ESP8266 Sketch Data Upload در منوی Tools اضافه شده باشد.

Uploading files to SPIFFS

برای بارگذاری فایلها داخل ESP8266 اول از همه باید در داخل فولدری که برنامه در آن است. یک فولدر به اسم data ایجاد کنید. برای پیدا کردن فولدر برنامه این مسیر را بروید:

Sketch File Folder

Sketch File Folder

تمام فایلهای خود را داخل این فولدر قرار دهید. توجه داشته باشید که فایلهای بزرگ را نمی‌توانید در داخل ESP8266 ذخیره کنید.

اندازه‌ی فایلهای خود را بدست آورده و Flash Size را طبق آن تنظیم کنید.

سپس بعد از بارگذاری برنامه‌ی خود باید یکبار هم به طور جداگانه فایلهای خود را بارگذاری کنید. برای این کار اول مطمئن شوید که سریال مونیتور را بسته باشید. سپس به همان روش قبلی ESP8266 را به مد برنامه ریزی برده. و از منوی tools > ESP8266 Sketch data upload را انتخاب کنید.

اگر کد خطایی دریافت کردید به احتمال زیاد حجم فایلهای شما از ظرفیت حافظه‌ی SPIFFS بیشتر است.

توجه داشته باشید که با تغییر در اندازه‌ی SPIFFS باید برنامه را هم دوباره بارگذاری کنید.

در ادامه برنامه‌ای را برای شما قرار می دهم که در آن از SPIFFS استفاده شده. برنامه‌ی ساده‌ای است و طبق آدرس URI به دنبال فایل آن می‌گردد و اگر موجود باشد به آن پاسخ می دهد.

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <FS.h>   // Include the SPIFFS library

ESP8266WebServer server(80);    // Create a webserver object that listens for HTTP request on port 80

String getContentType(String filename); // convert the file extension to the MIME type
bool handleFileRead(String path);       // send the right file to the client (if it exists)

const char* ssid = "SSID";
const char* password = "PASSWORD";

void setup() {
  Serial.begin(115200);         // Start the Serial communication to send messages to the computer
  delay(10);
  Serial.println('\n');
//Constant IP for Local WiFi
  IPAddress ipWiFi(192, 168, 1, 22);
  IPAddress gatewayWiFi(192, 168, 1, 249);
  IPAddress subnetWiFi(255, 255, 255, 0);

  WiFi.config(ipWiFi, gatewayWiFi, subnetWiFi);
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
  
    }
  Serial.println(F("Local WiFi Connected"));
SPIFFS.begin();

server.onNotFound([]() {                              // If the client requests any URI
    if (!handleFileRead(server.uri()))                  // send it if it exists
      server.send(404, "text/plain", "404: Not Found"); // otherwise, respond with a 404 (Not Found) error
  });

  server.begin();                           // Actually start the server
  Serial.println("HTTP server started");
}

void loop(void) {
  server.handleClient();
}

String getContentType(String filename) { // convert the file extension to the MIME type
  if (filename.endsWith(".html")) return "text/html";
  else if (filename.endsWith(".css")) return "text/css";
  else if (filename.endsWith(".js")) return "application/javascript";
  else if (filename.endsWith(".ico")) return "image/x-icon";
  return "text/plain";
}

bool handleFileRead(String path) { // send the right file to the client (if it exists)
  Serial.println("handleFileRead: " + path);
  if (path.endsWith("/")) path += "index.html";         // If a folder is requested, send the index file
  String contentType = getContentType(path);            // Get the MIME type
  if (SPIFFS.exists(path)) {                            // If the file exists
    File file = SPIFFS.open(path, "r");                 // Open it
    size_t sent = server.streamFile(file, contentType); // And send it to the client
    file.close();                                       // Then close the file again
    return true;
  }
  Serial.println("\tFile Not Found");
  return false;                                         // If the file doesn't exist, return false
}

 

دیدگاه ها :

من بات نیستم

  1. رسول آقاجانی گفت:

    بسیار عالی و جالب

  2. امیرحسین گفت:

    این مطالب برای من بسیار مفید بود مرسی
    فقط اینکه سایت شما در نتایج گوگل دیده نمیشه , سایت را از instagramپیدا کردم
    من مدت زیادی دنبال مطالب فارسی ای که از پایه اموزش بدهند بودم و تقریبا نبود
    مرسی از سایت خوبتون

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

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