• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

внутренняя память 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 Просмотры: 6

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);

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