Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

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

Тема в разделе "Раздел для начинающих", создана пользователем Vypra, 26 ноя 2019.

  1. Vypra

    Vypra Новичок

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

    lookingooder Читатель

    Сообщения:
    66
    Симпатии:
    10
    SPIFFS не подходит?
     
  3. Vypra

    Vypra Новичок

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

    lookingooder Читатель

    Сообщения:
    66
    Симпатии:
    10
    Не будет. У меня работает и то и то в одном флаконе.
    Example of ESP8266 Flash File System (SPIFFS) | Circuits4you.com
     
    Vypra нравится это.
  5. Vypra

    Vypra Новичок

    Сообщения:
    179
    Симпатии:
    2
    Разобрался. Спасибо.
    Есть ли возможность сливать на комп созданный на esp8266 файл?
     
  6. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    2.279
    Симпатии:
    238
    что мешает? Ftp или http-сервер на esp есть.
     
  7. Vypra

    Vypra Новичок

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

    Vypra Новичок

    Сообщения:
    179
    Симпатии:
    2
  9. Vypra

    Vypra Новичок

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

    Vypra Новичок

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

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

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

    Сергей_Ф Moderator Команда форума

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

    Vypra Новичок

    Сообщения:
    179
    Симпатии:
    2
    Код (Text):
    1.  
    2. #ifdef ESP8266
    3. #include <ESP8266WiFi.h>       // Built-in
    4. #include <ESP8266WiFiMulti.h>  // Built-in
    5. #include <ESP8266WebServer.h>  // Built-in
    6. #include <ESP8266mDNS.h>
    7. #include "FS.h"
    8. #else
    9. #include <WiFi.h>              // Built-in
    10. #include <WiFiMulti.h>         // Built-in
    11. #include <ESP32WebServer.h>    // https://github.com/Pedroalbuquerque/ESP32WebServer download and place in your Libraries folder
    12. #include <ESPmDNS.h>
    13. #include "FS.h"
    14. #endif
    15.  
    16. #include "Network.h"
    17. #include "Sys_Variables.h"
    18. #include "CSS.h"
    19. #include <SPI.h>
    20.  
    21. #ifdef ESP8266
    22. ESP8266WiFiMulti wifiMulti;
    23. ESP8266WebServer server(80);
    24. #else
    25. WiFiMulti wifiMulti;
    26. ESP32WebServer server(80);
    27. #endif
    28.  
    29.  
    30. // File
    31. const char* filename1 = "/data.csv";
    32.  
    33. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    34. void setup(void) {
    35. Serial.begin(115200);
    36.  
    37.   // File System
    38.   if (SPIFFS.begin())
    39.   {
    40.     Serial.println("SPIFFS Initialize....ok");
    41.   }
    42.   else
    43.   {
    44.     Serial.println("SPIFFS Initialization...failed");
    45.   }
    46.  
    47.  
    48.   if (SPIFFS.exists(filename1))
    49.   {
    50.     Serial.println("Файл существует");
    51.   }
    52.  
    53.   else
    54.   {
    55.     if (SPIFFS.format())
    56.     {
    57.       Serial.println("Файловая система отформатирована");
    58.     }
    59.     else
    60.     {
    61.       Serial.println("Ошибка форматирования файловой системы");
    62.     }
    63.  
    64.     //Create New File And Write Data to It
    65.     //w=Write Open file for writing
    66.     File f = SPIFFS.open(filename1, "w");
    67.  
    68.     if (!f)
    69.     {
    70.       Serial.println("Файл не открывается");
    71.     }
    72.     else
    73.     {
    74.       //Write data to file
    75.       Serial.println("Запись данных в файл");
    76.       f.print("Тест");
    77.       f.close();  //Close file
    78.     }
    79.   }
    80.  
    81.  
    82.  
    83.   if (!WiFi.config(local_IP, gateway, subnet, dns)) { //WiFi.config(ip, gateway, subnet, dns1, dns2);
    84.     Serial.println("WiFi STATION Failed to configure Correctly");
    85.   }
    86.   wifiMulti.addAP(ssid_1, password_1);  // add Wi-Fi networks you want to connect to, it connects strongest to weakest
    87.   wifiMulti.addAP(ssid_2, password_2);  // Adjust the values in the Network tab
    88.   wifiMulti.addAP(ssid_3, password_3);
    89.   wifiMulti.addAP(ssid_4, password_4);  // You don't need 4 entries, this is for example!
    90.  
    91.   Serial.println("Connecting ...");
    92.   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
    93.     delay(250); Serial.print('.');
    94.   }
    95.   Serial.println("\nConnected to " + WiFi.SSID() + " Use IP address: " + WiFi.localIP().toString()); // Report which SSID and IP is in use
    96.   // The logical name http://fileserver.local will also access the device if you have 'Bonjour' running or your system supports multicast dns
    97.   if (!MDNS.begin(servername)) {          // Set your preferred server name, if you use "myserver" the address would be http://myserver.local/
    98.     Serial.println(F("Error setting up MDNS responder!"));
    99.     ESP.restart();
    100.   }
    101. #ifdef ESP32
    102.   // 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)
    103.   Serial.println(MISO);
    104.   pinMode(19, INPUT_PULLUP);
    105. #endif
    106.   Serial.print(F("Initializing SD card..."));
    107.   SPIFFS.begin();                           // Start the SPI Flash Files System
    108.   // 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.
    109.   //----------------------------------------------------------------------
    110.   ///////////////////////////// Server Commands
    111.   server.on("/",         HomePage);
    112.   server.on("/download", File_Download);
    113.   ///////////////////////////// End of Request commands
    114.   server.begin();
    115.   Serial.println("HTTP server started");
    116. }
    117. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    118. void loop(void) {
    119.   server.handleClient(); // Listen for client connections
    120. }
    121.  
    122. // All supporting functions from here...
    123. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    124. void HomePage() {
    125.   SendHTML_Header();
    126.   webpage += F("<a href='/download'><button>Download</button></a>");
    127.   append_page_footer();
    128.   SendHTML_Content();
    129.   SendHTML_Stop(); // Stop is needed because no content length was sent
    130. }
    131. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    132. void File_Download() { // This gets called twice, the first pass selects the input, the second pass then processes the command line arguments
    133.   if (server.args() > 0 ) { // Arguments were received
    134.     if (server.hasArg("download")) SD_file_download(server.arg(0));
    135.   }
    136.   else SelectInput("File Download", "Enter filename to download", "download", "download");
    137. }
    138. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    139. void SD_file_download(String filename) {
    140.   File download = SPIFFS.open("/" + filename, "w");
    141.   if (download) {
    142.     server.sendHeader("Content-Type", "text/text");
    143.     server.sendHeader("Content-Disposition", "attachment; filename=" + filename);
    144.     server.sendHeader("Connection", "close");
    145.     server.streamFile(download, "application/octet-stream");
    146.     download.close();
    147.   } else ReportFileNotPresent("download");
    148. }
    149. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    150. void SendHTML_Header() {
    151.   server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate");
    152.   server.sendHeader("Pragma", "no-cache");
    153.   server.sendHeader("Expires", "-1");
    154.   server.setContentLength(CONTENT_LENGTH_UNKNOWN);
    155.   server.send(200, "text/html", ""); // Empty content inhibits Content-length header so we have to close the socket ourselves.
    156.   append_page_header();
    157.   server.sendContent(webpage);
    158.   webpage = "";
    159. }
    160. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    161. void SendHTML_Content() {
    162.   server.sendContent(webpage);
    163.   webpage = "";
    164. }
    165. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    166. void SendHTML_Stop() {
    167.   server.sendContent("");
    168.   server.client().stop(); // Stop is needed because no content length was sent
    169. }
    170. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    171. void SelectInput(String heading1, String heading2, String command, String arg_calling_name) {
    172.   SendHTML_Header();
    173.   webpage += F("<h3 class='rcorners_m'>"); webpage += heading1 + "</h3><br>";
    174.   webpage += F("<h3>"); webpage += heading2 + "</h3>";
    175.   webpage += F("<FORM action='/"); webpage += command + "' method='post'>"; // Must match the calling argument e.g. '/chart' calls '/chart' after selection but with arguments!
    176.   webpage += F("<input type='text' name='"); webpage += arg_calling_name; webpage += F("' value=''><br>");
    177.   webpage += F("<type='submit' name='"); webpage += arg_calling_name; webpage += F("' value=''><br><br>");
    178.   append_page_footer();
    179.   SendHTML_Content();
    180.   SendHTML_Stop();
    181. }
    182. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    183. void ReportFileNotPresent(String target) {
    184.   SendHTML_Header();
    185.   webpage += F("<h3>File does not exist</h3>");
    186.   webpage += F("<a href='/"); webpage += target + "'>[Back]</a><br><br>";
    187.   append_page_footer();
    188.   SendHTML_Content();
    189.   SendHTML_Stop();
    190. }
     
  13. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    2.279
    Симпатии:
    238
    Вы знаете что такое "w" в этом вызове? Это write - запись, а вам надо файл читать. Это read.
    Откройте файл на чтение и вычитывайте его содержимое. Примеры есть даже в Ардуино , не ленитесь.
     
    Последнее редактирование: 7 дек 2019
  14. Vypra

    Vypra Новичок

    Сообщения:
    179
    Симпатии:
    2
    Ирония в том, что эта часть - исходный код, который я не менял. У автора это по идее работает. Но не суть. С "r" тоже пустой файл.
    Пробовал через роутер подключиться, настройки у автора в Network.h Вообще не получилось подключиться. А напрямую телефон-esp8266 страница грузится. Все же думаю это я неправильно настроил соединение.
     
  15. Vypra

    Vypra Новичок

    Сообщения:
    179
    Симпатии:
    2
    Мой Network.h :
    Код (Text):
    1. // Adjust the following values to match your needs
    2.  
    3. // -----------------------------------------------
    4. #define   servername "fileserver"     // Set your server's logical name here e.g. if myserver then address is http://myserver.local/
    5. IPAddress local_IP(192,168,1,150); // Set your server's fixed IP address here
    6. IPAddress gateway(192,168,1,1);    // Set your network Gateway usually your Router base address
    7. IPAddress subnet(255,255,255,0);   // Set your network sub-network mask here
    8. IPAddress dns(192,168,1,150);           // Set your network DNS usually your Router base address
    9. const char ssid_1[]     = "*******";  // Здесь ввожу имя WiFi сети моего роутера
    10. const char password_1[] = "*********"; // Здесь ввожу пароль WiFi сети моего роутера
    11.  
    12. const char ssid_2[]     = "your_SSID2";
    13. const char password_2[] = "your_PASSWORD_for SSID2";
    14.  
    15. const char ssid_3[]     = "your_SSID3";
    16. const char password_3[] = "your_PASSWORD_for SSID3";
    17.  
    18. const char ssid_4[]     = "your_SSID4";
    19. 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 и страница закачки подгружается. Но файл качает пустой.
    Почему через роутер не получилось?
     

    Вложения:

    • ip.jpg
      ip.jpg
      Размер файла:
      78,4 КБ
      Просмотров:
      4
  16. Vypra

    Vypra Новичок

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

    nikolz Гуру

    Сообщения:
    5.350
    Симпатии:
    473
    про подключение через роутер...
    в исходном коде (про который вы спрашивали у автора) ESP работает как точка доступа - т е является роутером.
    роутер - это центральный узел вашей сети
    -----------------------------
    если вы хотите соединить две esp через роутер, то вы должны эти esp включить в режим станция
    -----------------------------
    для обмена файлами
    на одной ставите сервер на другой клиента
    разница между ними лишь в том что сервер всегда готов
    и слушает запросы от клиентов
    а клиенты посылают запросы когда им хочется
    -----------------------
    Теперь конкретно Ваш случай
    вам надо на компе создать сервер для приема файла
    а на ESP которая в режиме станция клиента для отправки
    -------------------------
     
  18. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    2.279
    Симпатии:
    238
    Не перепутали? Вроде надо загрузить на клиента, компьютер- download, а не на сервер, esp - upload. Ну я так понял, по крайней мере из приведённого описание в первом посте.
     
    Последнее редактирование: 11 дек 2019
  19. nikolz

    nikolz Гуру

    Сообщения:
    5.350
    Симпатии:
    473
    я привел пояснение когда надо загрузить на ком
    если надо загрузить на ESP с компа
    то в предыдущем пояснении надо поменять местами комп и ESP
    -------------------
    в зависимости от того что будет всегда готово , там и создать сервер
    -------------
     
  20. Сергей_Ф

    Сергей_Ф Moderator Команда форума

    Сообщения:
    2.279
    Симпатии:
    238
    @nikolz я то вас понял, но последний вопрос у @Vypra скорее всего по операторам:
    WiFi.mode(WIFI_STA);
    WiFi.mode(SOFT_AP);

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

Поделиться этой страницей