• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

WebServer на esp8266 WeMos D1 R1. Запись в файл на SD-карте

Народ, подскажите возможно ли. У меня есть метеостанция, которая пишет данные в файл на sd-карте. Файл в принципе придерживается формата json, но не совсем. Но это не важно. В общем иногда что-то идет не так и в файл записывается пустое значение. Не знаю пока почему, разбираюсь. И в этом случае данные как json не считываются. У меня на этом постоен вывод на WEB страничке в таблицу и в график. Так вот пока я не нашел откуда беруться такие ошибки, самое простое вручную исправить файл. Но вынимать каждый раз SD-карту и править ее на компе не очень удобно, скажем так. Открыть файл на WEB страничку просто. Отредактировать его тоже не проблема. Но вот как этот результат передать обратно и сохранить в файл? Передача в скетч ардуино не работает. Там слишком длинное значение строковой переменной получается. Можно ли с WEB страницы сохранить в файл? На всех форумах по WEB программированию пишут, что нужно воспользоваться серверным языком. Но какой в нашем случае серверный язык?
 

CodeNameHawk

Moderator
Команда форума
Ну с С++ я пока не очень. Больше на языке Ардуино. Я понимаю, что одно из другого, но отличается.
Но я понимаю как это сделать на языке Ардуино. А мне интересно можно ли это через именно WEB часть сделать?
Хотя мне кажется я понял, что вы имели в виду. У нормального сервера это PHP или там Ajax, а у нас именно С++ на серверной части, а html, Java это клиентская часть.
Тогда получается только бить на части строку, чтобы в строковую переменную влезало?
 

Сергей_Ф

Moderator
Команда форума
Ну с С++ я пока не очень. Больше на языке Ардуино. Я понимаю, что одно из другого, но отличается.
Но я понимаю как это сделать на языке Ардуино. А мне интересно можно ли это через именно WEB часть сделать?
Хотя мне кажется я понял, что вы имели в виду. У нормального сервера это PHP или там Ajax, а у нас именно С++ на серверной части, а html, Java это клиентская часть.
Тогда получается только бить на части строку, чтобы в строковую переменную влезало?
Пусть будет Ардуино, только это не язык, а платформа, строго говоря.
Вы как то вывели в браузер и на экран содержимое файла. Отредактировали в браузере. Теперь надо проделать обратную процедуру - передать из браузера в файл. Вот и смотрите как выводили, но вместо read используйте write для записи. Там немного сложнее, конечно, но при желании разберётесь.
 
Read то сделать можно многими спорсобами с помощью JavaScript, но вот записать в файл везде на форумах пишут, что это невозможно. Пишут, что это можно сделать только средствами серверных языков типа PHP, Ajax. Я скажем PHP знаю немного, и на IIS писал вебморды к простеньким базам данных. Но на esp PHP не поставить. Или я ошибаюсь?
 

Сергей_Ф

Moderator
Команда форума
Read то сделать можно многими спорсобами с помощью JavaScript, но вот записать в файл везде на форумах пишут, что это невозможно. Пишут, что это можно сделать только средствами серверных языков типа PHP, Ajax. Я скажем PHP знаю немного, и на IIS писал вебморды к простеньким базам данных. Но на esp PHP не поставить. Или я ошибаюсь?
Это как вы через JavaScript считаете данные из файловой системы esp или с SD-карты к ней подключенной? Можно поподробнее?
 
Это как вы через JavaScript считаете данные из файловой системы esp или с SD-карты к ней подключенной? Можно поподробнее?
Да, виноват. Я открывал просто файл в WEB, без возможности его редактирования. Просто /file.txt.
А чтобы записать данные в какой-нибудь Edit надо наверное через ESP. Но все равно весь файл в строковую переменную не поместится. Т.е. таки надо резать его по длинне переменной типа String. Потом удалять старый файл и создавать новый и записывать в него подряд строковые переменные, полученные с веб странички.
 
А к стати может кто сталкивался, почему датчики могут выдавать кривые и пустые значения? При чем как-то периодами. Вот скажем:
Код:
20220125;15:56:27;25.2;22.0;745.5;27.4;21.0;27.1;19.3
20220125;16:06:27;25.2;21.9;745.5;27.4;20.9;27.2;19.2
20220125;16:16:27;27.0;27.9;745.5;28.7;22.6;27.5;20.9
20220125;16:26:27;28.5;44.3;745.5;28.5;25.8;29.5;23.0
20220125;16:36:27;25.8;22.9;;255.0; 6.2;27.7;19.2
20220125;16:46:27;25.8;22.1;;255.0; 6.2;27.8;18.8
20220125;16:56:27;26.3;21.5;;255.0; 6.2;28.2;18.6
20220125;17:06:27;25.2;22.7;;255.0; 6.2;27.3;19.4
20220125;17:16:27;25.2;22.1;;255.0; 6.2;27.5;18.7
20220125;17:26:27;24.6;23.0;;255.0; 6.2;26.6;19.6
20220125;17:36:27;24.2;23.4;;255.0; 6.2;26.1;20.0
20220125;17:46:27;24.0;22.7;;255.0; 6.2;26.0;19.6
20220125;17:56:27;23.9;22.7;;255.0; 6.2;25.9;19.6
20220125;18:06:27;23.9;22.7;;255.0; 6.2;26.0;19.6
20220125;18:16:27;23.7;22.6;;255.0; 6.2;25.8;19.5
20220125;18:26:27;24.8;22.7;;255.0; 6.2;27.1;19.5
20220125;18:36:27;25.3;22.6;;255.0; 6.2;27.3;19.9
20220125;18:46:27;25.9;23.4;;255.0; 6.2;27.7;20.7
20220125;18:56:27;26.4;24.0;;255.0; 6.2;28.3;20.8
20220125;19:06:27;26.0;24.7;;255.0; 6.2;27.8;22.0
20220125;19:16:28;25.3;26.0;;255.0; 6.2;27.2;23.0
20220125;19:26:28;25.0;26.3;;255.0; 6.2;26.9;23.5
20220125;19:36:28;25.0;26.9;;255.0; 6.2;26.9;24.1
20220125;19:46:28;24.9;26.9;;255.0; 6.2;27.0;24.2
20220125;19:56:28;24.9;27.3;;255.0; 6.2;26.8;24.7
20220125;20:06:28;24.8;27.5;;255.0; 6.2;26.7;24.9
20220125;20:16:28;24.9;27.6;;255.0; 6.2;26.9;24.8
20220125;20:26:28;24.8;28.0;;255.0; 6.2;26.7;25.1
20220125;20:36:28;24.8;26.9;;255.0; 6.2;27.0;24.0
20220125;20:46:28;24.5;27.5;;255.0; 6.2;26.4;24.5
20220125;20:56:28;24.6;27.5;743.8;26.0;25.9;26.9;24.0
20220125;21:06:28;24.5;27.6;743.7;25.8;26.0;26.6;24.2
20220125;21:16:28;24.2;27.8;743.5;25.5;26.3;26.2;24.6
20220125;21:26:28;24.1;27.9;743.6;25.5;26.4;26.2;24.7
Вот видите, есть 3 датчика. 2 AHT10 и один BME/BMP280 (кажется так, он мериет температуру, влажность и давление).
Вот данные идут сначала с BME - температура, влажность, давление, потом с двух AHT10 - температура, влажность.
Как видно, шло все хорошо. Потом в 16:36 пропало давление, а на первом AHT10 вообще температура 255 градусов, а влажность всего 6,2. А потом в 20:56 опять все стало корректно. Пока печатные платы, заказанные в китае, идут по почте, у меня все собрано на макетках типа BreadBoard. Может контакты?........ Хотя на макетках только 4 матрицы от табло, микросхемы управления ими и часы на DS1307. Сами датчики припаяны к ESP.
 
Далась вам эта String, пишите как бинарный файл.
Я так вообще очень поверхностно это понимаю. Типа бинарный файл это набор каких-то кодов, которые хранятся для работы компьютера. Но у меня данные, которые надо читать не компьютеру, а мне. Мне нужно считать файл именно в таком виде как я показал, чтобы я сам увидел где ошибка, иправил ее и сохранил данные обратно. На самом деле то что я привел в примере надо конечно дорабатывать. Так много не направишься. Просто у меня есть уже готовое устройство. Там раз в несколько месяцев, иногда бывает сбой в одной строке и именно это одно значение надо подправить. Конечно по хорошему надо найти причину, нор пока не могу. А этот сбой сразу не дает выводить информацию за месяц и за день, когда был сбой.
 

CodeNameHawk

Moderator
Команда форума
Типа бинарный файл это набор каких-то кодов, которые хранятся для работы компьютера
Нет. Это просто байты. Текстовый файл тоже читается и записывается как бинарный файл.

Любой датчик может может выдать ошибку, может быть наводка от есп.
Надо обрабатывать ошибочные значения, нп. выбросить их.

Если хотите редактировать файл на веб сервере, то посмотрите 5 урок https://www.youtube.com/channel/UC5ObcnxkVBgvb5-Mx7Eh31w?app=desktop
 
Нет. Это просто байты. Текстовый файл тоже читается и записывается как бинарный файл.

Любой датчик может может выдать ошибку, может быть наводка от есп.
Надо обрабатывать ошибочные значения, нп. выбросить их.

Если хотите редактировать файл на веб сервере, то посмотрите 5 урок https://www.youtube.com/channel/UC5ObcnxkVBgvb5-Mx7Eh31w?app=desktop
Да понятно, что надо обрабатывать. Надо еще понять, датчик это дурит или как раз моё считывание данных Хотя когда несколько часов такая фигня идет, скорее всего датчик дурит. Надо посмотреть, можно ли датчик отдельно перезапускать.
Видео посмотрю. Спасибо.
 
Да, у него я и учился с WEB-об на ESP работать. Как писать единичные данные я у него научился. Только вот он 3 года как пропал куда-то и ничего нового не выкладывает и на вопросы не отвечает.
Короче буду осваивать чтение и запись бинарных файлов. Может примерчик где подскажете, чтобы считать обычный текстовый файл и вывести его куда-нибудь для чтения глазами.
 
Вот собственно как считывать в Serial вижу. Но тут все внутри ардуины. А как это передать в WEB, а там принять и вывести в какое-нибудь окошко Edit не пойму.
Код:
myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");
    // считываем содержимое файла до тех пор, пока нечего будет считывать:
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    // закрываем файл:
    myFile.close();
  } else {
    // если файл не открылся, сообщаем об ошибке:
    Serial.println("error opening test.txt");  //  "ошибка при открытии test.txt"
  }
Т.е. понятно, что в цикле делаем myFile.read(). Тут же понятно сразу кидаем результат в порт и он пока читает, пишет его туда. А как вот это вовне передавать? А там и принимать?
 

Сергей_Ф

Moderator
Команда форума
Года полтора назад пытался разобраться. Не заработало у меня. Поковыряюсь еще раз.
начните с готового примера, там всё досконально описано в файле readme.md. и даже есть готовые скрипты js
ESP8266WebServer/FSBrowser
 
Сверху Снизу