در آموزش های قبلی نحوه راه اندازی SPIFFS در ماژول های ESP32 شرح داده شد . SPIFFS یا همان فایل سیستم قابلیتی است که بسیاری از میکروکنترلر های جدید مانند مدل های با هسته ARM آن را دارند . این قابلیت امکان استفاده از بخشی از حافظه میکرکنترلر را به عنوان محل ذخیره فایل های مختلف می دهد . در واقع بخشی از حافظه همانند یک درایو جدا عمل خواهد کرد . قابلیت SPIFFS توانایی زیادی به پلتفرم هایی همچون ESP32 خواهد داد . با استفاده از این قابلیت می توانید رابط های گرافیکی مختلف را از طریق وب سرور اجرا کنید در واقع امکان ذخیره فایل های HTML ، CSS ، JS و… را خواهید داشت بدون آنکه مجبور باشید کد های هریک از این فایل ها را در برنامه خود وارد کنید . اما SPIFFS خود مشکلاتی دارد ، از جمله اینکه تفاوتی نمی کند فایل شما چه حجم دارد ، کامپایلر تنها اندازه های مشخصی برای پارتیشن بندی حافظه میکرو در نظر خواهد گرفت . به طور مثال شما می خواهید چند فایل مختلف را که حجمی مغادل 100KByte دارند در SPIFFS قرار دهید ، در این حالت می توانید از نوع اول پارتیشن بندی یعنی اختصاص 2MByte به SPIFFS استفاده کنید که در این حالت عملا شما 1.5Mbyte از حافظه برنامه تان را از دست می دهید . علاوه بر آن نیز شما امکان ذخیر فایل های با حجم بالا را نخواهید داشت . در این حالت می توانید از SD کارت کمک بگیرید . بر خلاف میکروکنترلر های قدیمی مانند AVR ها در میکروکنترلر های با معماری جدید اغلب واحد های سخت افزاری جهت ارتباط با SD کارت وجود دارد که به راحتی و با سرعت بالا می توانید فابل های مختلف را از یک SD واکشی کنید . ESP32 نیز دارای واحد ” SD/SDIO/MMC Host Controller ” جهت راه اندازی SD می باشد . ESP توانایی راه اندازی SD کارت با سرعت 80MHz در مد 8 بیتی را دارد . شما بدون درگیر کردن CPU تنها با کانفیگ این پریفرال می توانید خواندن دیتا از SD را شروع کنید و در صورت پایان خواندن از طریق یک وقفه CPU را با خبر کند . می توانید از واحد SD برای بوت کردن eSP32 از طریق SD کارت استفاده کنید البته برای این کار نیاز به شناخت و تسلط برمعماری Xtensa خواهید داشت . در این پروژه قصد داریم ESP32 به صورت وب سرور راه اندازی کنیم و فایل های HTML ، CSS و… را در یک SD قرار دهیم تا ESP32 فایل های ذخیره شده را برای Client ارسال کند .

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

در تصویر زیر پایه های ماژول SD کارت نشان داده شده است :

پین های VCC و GND تغذیه ماژول می باشند و مابقی پین ها برای ارتباط I2C هستند .

 

برای اتصال ماژول SD کارت به ESP32 و اجرای پروژه مراحل زیر را انجامدهید :

1- ابتدا ماژول SD را همانند تصویر زیر به برد ESP32 متصل کنید :

2- SD کارت را به کامپیوتر متصل کنید . سپس SD کارت باید فرمت کنید (حتما از FAT32 استفاده کیند ) :

 

3- سپس نوبت به کپی کردن فایل های Html و CSS بر روی کارت SD است . برای این کار یک فایل txt در داخل درایو SD کارت بسایز و کد های Html زیر را در آن کپی کنید و در آخر اسم فایل را به 

index.html تغییر دهید .

<!DOCTYPE HTML><html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" type="text/css" href="style.css">
  <link rel="icon"  type="image/png" href="favicon.png">
  <title>ESP Web Server</title>
</head>
<body>
  <h1>Hello World!</h1>
  <p>This page was built with files from a microSD card.</p>
</body>
</html>

 

همین کار را برای فایل CSS نیز باید انجام دهید . برای این کار یک فایل txt بسازید و پس از کپی کردن کد های زیر در آن ، اسم آن را به style.css تغییر دهید . هردو فایل style.css و index.html باید در درون SD کارت موجود باشند . اگر در هنگام تغییر نام فایل txt پیغامی مشاهده کردین OK را بزنید .

 

html {
    font-family: Arial; 
    text-align: center;
}
body {
    max-width: 400px; 
    margin:0px auto;
}

 

4- حال SD را در درون ماژول SD قرار داده و برد را به کامپیوتر متصل کنید و کد های زیر را در آردوینو IDE بر روی برد ESP32 پروگرام کنید :

#include <Arduino.h>
#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include "FS.h"
#include "SD.h"
#include "SPI.h"

// Replace with your network credentials
const char* ssid = "در این قسمت نام وایفای خود را وارد کنید";
const char* password = "در این قسمت نیز رمز وایفای خود را وارد کنید";

// Create AsyncWebServer object on port 80
AsyncWebServer server(80);

void initSDCard(){
  if(!SD.begin()){
    Serial.println("Card Mount Failed");
    return;
  }
  uint8_t cardType = SD.cardType();

  if(cardType == CARD_NONE){
    Serial.println("No SD card attached");
    return;
  }

  Serial.print("SD Card Type: ");
  if(cardType == CARD_MMC){
    Serial.println("MMC");
  } else if(cardType == CARD_SD){
    Serial.println("SDSC");
  } else if(cardType == CARD_SDHC){
    Serial.println("SDHC");
  } else {
    Serial.println("UNKNOWN");
  }
  uint64_t cardSize = SD.cardSize() / (1024 * 1024);
  Serial.printf("SD Card Size: %lluMB\n", cardSize);
}

void initWiFi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.print("Connecting to WiFi ..");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(1000);
  }
  Serial.println(WiFi.localIP());
}

void setup() {
  Serial.begin(115200);
  initWiFi();
  initSDCard();

  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send(SD, "/index.html", "text/html");
  });

  server.serveStatic("/", SD, "/");

  server.begin();
}

void loop() {
  
}

 

پس از وارد کردن نام و رمز وایفای خود در کد های بالا و آپلود آن بر روی برد خود ، وارد Serial monitor آردوینو IDE شوید و یک بار برد را ریست کنید سپس IP را که نمایش می دهد در مرورگر خود وارد کنید .

Tags:
About Author: USER_4