внутренняя память esp8266 как SD card

Vypra

Member
Нужно прикрепить SD карту к Node MCU v3 для сбора данных.
Вопрос возник потому что как всегда GPIO закончились, остались свободные только GPIO6...GPIO11, к которым нельзя прикрепить SD карту, потому что пины связаны с внутренней памятью.
Можно ли как-то выделить часть внутренней памяти, чтоб работало как SD карта, там хранить файл, дописывать его периодически, и как-то сливать?
 

Vypra

Member
SPIFFS не подходит?
Да. Подходит.
Я не знаю как использовать ее. Код у меня написан в Arduino IDE.
Также я записываю настройки конфигурации в EEPROM. Не будет ли конфликта между областями памяти EEPROM и SPIFFS ? Ведь у ESP8266 EEPROMа как такового нет, это кусок одной и той же памяти?
 

Vypra

Member
Разобрался. Спасибо.
Есть ли возможность сливать на комп созданный на esp8266 файл?
 

Vypra

Member
Ftp или http-сервер на esp есть.
Да, подходит. Почитал, http-сервер предпочтительней в ввиду простого подключения через браузер без дополнительных приложений, как в Ftp.
Пока правда не нашел как файл скачать. Функционал должен быть простой - подключился со смартфона, запустилась одна кнопка "скачать файл", нажал, скачал. Может кто подскажет?
Еще один момент, у меня проект работает на RemoteXY, не будет ли конфликта между RemoteXY и http-сервером? Хотя меня абсолютно устраивает работать в RemoteXY, если нужно скачать файл, отсоединился от сессии RemoteXY, зашел в браузер.
 

Vypra

Member
Добавил в начало Setup скетча ESP_FIle_download_from_SPIFFS.ino инициализацию файловой системы, форматирование и создание нового файла с тестовой строчкой. Загрузил в ESP8266, подключился, в мониторе порта сказало нам что файл существует, страничка в браузере на телефоне подгрузилась. Нажал на страничке кнопку Download и ввел имя файла, который нужно скачать.
Файл скачался, НО ПУСТОЙ.
Хорошо, вписываем в строку ввода произвольное имя файла (которого не существует в SPIFFS на ESP8266), опять загружается, тоже пустой. Никакого сообщения, что файла не существует, нет. Он просто создает на телефоне или компе файл в загрузках, но данные не переносит с ESP8266.
Что за фигня?
 

Vypra

Member
Меня интересует подключение. На ESP8266 был прошит скетч с RemoteXY, после него я прошил ESP_FIle_download_from_SPIFFS.ino. Настройки сети WiFi на ESP8266 остались, потому что я подключаюсь с мобильного напрямую к сети RemoteXY со старым паролем.

В скетче ESP_FIle_download_from_SPIFFS.ino есть блок настройки сети:

Код:
void setup(void) 
{
Serial.begin(115200);
if (!WiFi.config(local_IP, gateway, subnet, dns)) { //WiFi.config(ip, gateway, subnet, dns1, dns2);
Serial.println("WiFi STATION Failed to configure Correctly");
}
wifiMulti.addAP(ssid_1, password_1); // add Wi-Fi networks you want to connect to, it connects strongest to weakest
wifiMulti.addAP(ssid_2, password_2); // Adjust the values in the Network tab
wifiMulti.addAP(ssid_3, password_3);
wifiMulti.addAP(ssid_4, password_4); // You don't need 4 entries, this is for example!
Возможно приходит пустой файл в связи с тем, что нужно подключиться через роутер? Хотя страничка HTTP подгрузилась при соединении с телефона к ESP8266 напрямую.
 

Сергей_Ф

Moderator
Команда форума
@Vypra если вы добавили инициализацию (форматирование) файловой системы, то что вы хотите скачать?
Хоть код бы привели. Какой помощи вы ждете без этого? У вас где-то ошибка.
 

Vypra

Member
Код:
#ifdef ESP8266
#include <ESP8266WiFi.h>       // Built-in
#include <ESP8266WiFiMulti.h>  // Built-in
#include <ESP8266WebServer.h>  // Built-in
#include <ESP8266mDNS.h>
#include "FS.h"
#else
#include <WiFi.h>              // Built-in
#include <WiFiMulti.h>         // Built-in
#include <ESP32WebServer.h>    // https://github.com/Pedroalbuquerque/ESP32WebServer download and place in your Libraries folder
#include <ESPmDNS.h>
#include "FS.h"
#endif

#include "Network.h"
#include "Sys_Variables.h"
#include "CSS.h"
#include <SPI.h>

#ifdef ESP8266
ESP8266WiFiMulti wifiMulti;
ESP8266WebServer server(80);
#else
WiFiMulti wifiMulti;
ESP32WebServer server(80);
#endif


// File
const char* filename1 = "/data.csv";

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void setup(void) {
Serial.begin(115200);

  // File System
  if (SPIFFS.begin())
  {
    Serial.println("SPIFFS Initialize....ok");
  }
  else
  {
    Serial.println("SPIFFS Initialization...failed");
  }


  if (SPIFFS.exists(filename1))
  {
    Serial.println("Файл существует");
  }

  else
  {
    if (SPIFFS.format())
    {
      Serial.println("Файловая система отформатирована");
    }
    else
    {
      Serial.println("Ошибка форматирования файловой системы");
    }

    //Create New File And Write Data to It
    //w=Write Open file for writing
    File f = SPIFFS.open(filename1, "w");

    if (!f)
    {
      Serial.println("Файл не открывается");
    }
    else
    {
      //Write data to file
      Serial.println("Запись данных в файл");
      f.print("Тест");
      f.close();  //Close file
    }
  }


 
  if (!WiFi.config(local_IP, gateway, subnet, dns)) { //WiFi.config(ip, gateway, subnet, dns1, dns2);
    Serial.println("WiFi STATION Failed to configure Correctly");
  }
  wifiMulti.addAP(ssid_1, password_1);  // add Wi-Fi networks you want to connect to, it connects strongest to weakest
  wifiMulti.addAP(ssid_2, password_2);  // Adjust the values in the Network tab
  wifiMulti.addAP(ssid_3, password_3);
  wifiMulti.addAP(ssid_4, password_4);  // You don't need 4 entries, this is for example!

  Serial.println("Connecting ...");
  while (wifiMulti.run() != WL_CONNECTED) { // Wait for the Wi-Fi to connect: scan for Wi-Fi networks, and connect to the strongest of the networks above
    delay(250); Serial.print('.');
  }
  Serial.println("\nConnected to " + WiFi.SSID() + " Use IP address: " + WiFi.localIP().toString()); // Report which SSID and IP is in use
  // The logical name http://fileserver.local will also access the device if you have 'Bonjour' running or your system supports multicast dns
  if (!MDNS.begin(servername)) {          // Set your preferred server name, if you use "myserver" the address would be http://myserver.local/
    Serial.println(F("Error setting up MDNS responder!"));
    ESP.restart();
  }
#ifdef ESP32
  // Note: SD_Card readers on the ESP32 will NOT work unless there is a pull-up on MISO, either do this or wire one on (1K to 4K7)
  Serial.println(MISO);
  pinMode(19, INPUT_PULLUP);
#endif
  Serial.print(F("Initializing SD card..."));
  SPIFFS.begin();                           // Start the SPI Flash Files System
  // Note: Using the ESP32 and SD_Card readers requires a 1K to 4K7 pull-up to 3v3 on the MISO line, otherwise they do-not function.
  //----------------------------------------------------------------------
  ///////////////////////////// Server Commands
  server.on("/",         HomePage);
  server.on("/download", File_Download);
  ///////////////////////////// End of Request commands
  server.begin();
  Serial.println("HTTP server started");
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void loop(void) {
  server.handleClient(); // Listen for client connections
}

// All supporting functions from here...
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void HomePage() {
  SendHTML_Header();
  webpage += F("<a href='/download'><button>Download</button></a>");
  append_page_footer();
  SendHTML_Content();
  SendHTML_Stop(); // Stop is needed because no content length was sent
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void File_Download() { // This gets called twice, the first pass selects the input, the second pass then processes the command line arguments
  if (server.args() > 0 ) { // Arguments were received
    if (server.hasArg("download")) SD_file_download(server.arg(0));
  }
  else SelectInput("File Download", "Enter filename to download", "download", "download");
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void SD_file_download(String filename) {
  File download = SPIFFS.open("/" + filename, "w");
  if (download) {
    server.sendHeader("Content-Type", "text/text");
    server.sendHeader("Content-Disposition", "attachment; filename=" + filename);
    server.sendHeader("Connection", "close");
    server.streamFile(download, "application/octet-stream");
    download.close();
  } else ReportFileNotPresent("download");
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void SendHTML_Header() {
  server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate");
  server.sendHeader("Pragma", "no-cache");
  server.sendHeader("Expires", "-1");
  server.setContentLength(CONTENT_LENGTH_UNKNOWN);
  server.send(200, "text/html", ""); // Empty content inhibits Content-length header so we have to close the socket ourselves.
  append_page_header();
  server.sendContent(webpage);
  webpage = "";
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void SendHTML_Content() {
  server.sendContent(webpage);
  webpage = "";
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void SendHTML_Stop() {
  server.sendContent("");
  server.client().stop(); // Stop is needed because no content length was sent
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void SelectInput(String heading1, String heading2, String command, String arg_calling_name) {
  SendHTML_Header();
  webpage += F("<h3 class='rcorners_m'>"); webpage += heading1 + "</h3><br>";
  webpage += F("<h3>"); webpage += heading2 + "</h3>";
  webpage += F("<FORM action='/"); webpage += command + "' method='post'>"; // Must match the calling argument e.g. '/chart' calls '/chart' after selection but with arguments!
  webpage += F("<input type='text' name='"); webpage += arg_calling_name; webpage += F("' value=''><br>");
  webpage += F("<type='submit' name='"); webpage += arg_calling_name; webpage += F("' value=''><br><br>");
  append_page_footer();
  SendHTML_Content();
  SendHTML_Stop();
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void ReportFileNotPresent(String target) {
  SendHTML_Header();
  webpage += F("<h3>File does not exist</h3>");
  webpage += F("<a href='/"); webpage += target + "'>[Back]</a><br><br>";
  append_page_footer();
  SendHTML_Content();
  SendHTML_Stop();
}
 

Сергей_Ф

Moderator
Команда форума
File download = SPIFFS.open("/" + filename, "w");
Вы знаете что такое "w" в этом вызове? Это write - запись, а вам надо файл читать. Это read.
Откройте файл на чтение и вычитывайте его содержимое. Примеры есть даже в Ардуино , не ленитесь.
 
Последнее редактирование:

Vypra

Member
Вы знаете что такое "w" в этом вызове? Это write - запись, а вам надо файл читать. Это read.
Откройте файл на чтение и вычитывайте его содержимое. Примеры есть даже в Ардуино , не ленитесь.
Ирония в том, что эта часть - исходный код, который я не менял. У автора это по идее работает. Но не суть. С "r" тоже пустой файл.
Пробовал через роутер подключиться, настройки у автора в Network.h Вообще не получилось подключиться. А напрямую телефон-esp8266 страница грузится. Все же думаю это я неправильно настроил соединение.
 

Vypra

Member
Мой Network.h :
Код:
// Adjust the following values to match your needs

// -----------------------------------------------
#define   servername "fileserver"     // Set your server's logical name here e.g. if myserver then address is http://myserver.local/
IPAddress local_IP(192,168,1,150); // Set your server's fixed IP address here
IPAddress gateway(192,168,1,1);    // Set your network Gateway usually your Router base address
IPAddress subnet(255,255,255,0);   // Set your network sub-network mask here
IPAddress dns(192,168,1,150);           // Set your network DNS usually your Router base address
const char ssid_1[]     = "*******";  // Здесь ввожу имя WiFi сети моего роутера
const char password_1[] = "*********"; // Здесь ввожу пароль WiFi сети моего роутера

const char ssid_2[]     = "your_SSID2";
const char password_2[] = "your_PASSWORD_for SSID2";

const char ssid_3[]     = "your_SSID3";
const char password_3[] = "your_PASSWORD_for SSID3";

const char ssid_4[]     = "your_SSID4";
const char password_4[] = "your_PASSWORD_for SSID4";
После прошивки esp8266 захожу в браузере на ноуте, что подключен к WiFi сети моего роутера, ввожу 192.168.1.150, и ничего.
Статический DNS 1 в настройках роутера менял с 192.168.1.150 на 192.168.1.2, тоже ничего.
Подключаюсь к сети esp8266 с ноута напрямую, в браузере 192.168.1.150 и страница закачки подгружается. Но файл качает пустой.
Почему через роутер не получилось?
 

Вложения

  • 78.4 KB Просмотры: 5

Vypra

Member
Мне автор ответил, чтоб напрямую скачивать файл без роутера нужно перевести ESP8266 в режим Access Point. Остальной код менять не нужно.
"The default WiFi connection is in Station mode and the setup needs to be changed to Access Point mode."
Как это сделать в Arduino IDE?
 

nikolz

Well-known member
Мне автор ответил, чтоб напрямую скачивать файл без роутера нужно перевести ESP8266 в режим Access Point. Остальной код менять не нужно.
"The default WiFi connection is in Station mode and the setup needs to be changed to Access Point mode."
Как это сделать в Arduino IDE?
про подключение через роутер...
в исходном коде (про который вы спрашивали у автора) ESP работает как точка доступа - т е является роутером.
роутер - это центральный узел вашей сети
-----------------------------
если вы хотите соединить две esp через роутер, то вы должны эти esp включить в режим станция
-----------------------------
для обмена файлами
на одной ставите сервер на другой клиента
разница между ними лишь в том что сервер всегда готов
и слушает запросы от клиентов
а клиенты посылают запросы когда им хочется
-----------------------
Теперь конкретно Ваш случай
вам надо на компе создать сервер для приема файла
а на ESP которая в режиме станция клиента для отправки
-------------------------
 

Сергей_Ф

Moderator
Команда форума
вам надо на компе создать сервер для приема файла
а на ESP которая в режиме станция клиента для отправки
Не перепутали? Вроде надо загрузить на клиента, компьютер- download, а не на сервер, esp - upload. Ну я так понял, по крайней мере из приведённого описание в первом посте.
 
Последнее редактирование:

nikolz

Well-known member
Не перепутали? Вроде надо загрузить на клиента, компьютер- download, а не на сервер, esp - upload. Ну я так понял, по крайней мере из приведённого описание в первом посте.
я привел пояснение когда надо загрузить на ком
если надо загрузить на ESP с компа
то в предыдущем пояснении надо поменять местами комп и ESP
-------------------
в зависимости от того что будет всегда готово , там и создать сервер
-------------
 

Сергей_Ф

Moderator
Команда форума
@nikolz я то вас понял, но последний вопрос у @Vypra скорее всего по операторам:
WiFi.mode(WIFI_STA);
WiFi.mode(SOFT_AP);

То что это не поможет, скорее всего, это уже другой вопрос
 
Последнее редактирование:
Сверху Снизу