Wemos R1 D1 проблема компилирования кода с функциями записи в SD карту

Здравствуйте! Есть плата ESP8266 wemos d1r1. К ней подключены датчики: холла, температуры, расходомер жидкости. Это все работает данные для проверка в com-порт выводит. Также создана HTML-разметка для вывод этой информации в окно браузера тоже все работает. Но возникла необходимость подключить SD карту . и вот здесь начались проблемы. возникает следующая ошибка. уже нет вариантов как исправить. помогите пожалуйста.
C:\Users\dns\Documents\Arduino\wemositog44\wemositog44.ino: In function ‘void setup()’:
C:\Users\dns\Documents\Arduino\wemositog44\wemositog44.ino:91:12: error: expected primary-expression before ‘.’ token
91 | file = fs.open(“/data.txt”);
| ^
In file included from C:\Users\dns\Documents\Arduino\wemositog44\wemositog44.ino:6:
C:\Users\dns\Documents\Arduino\wemositog44\wemositog44.ino: In function ‘void writeFile(fs::FS&, const char*, const char*)’:
C:\Users\dns\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\libraries\SD\src/SD.h:36:20: error: invalid conversion from ‘uint8_t’ {aka ‘unsigned char’} to ‘const char*’ [-fpermissive]
36 | #define FILE_WRITE SDClassFileWrite
| ^~~~~~~~~~~~~~~~
| |
| uint8_t {aka unsigned char}
C:\Users\dns\Documents\Arduino\wemositog44\wemositog44.ino:164:28: note: in expansion of macro ‘FILE_WRITE’
164 | File file = fs.open(path,FILE_WRITE);
| ^~~~~~~~~~
In file included from C:\Users\dns\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\libraries\FSTools/FSTools.h:3,
from C:\Users\dns\Documents\Arduino\wemositog44\wemositog44.ino:1:
C:\Users\dns\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\cores\esp8266/FS.h:226:45: note: initializing argument 2 of ‘fs::File fs::FS::open(const char*, const char*)’
226 | File open(const char* path, const char* mode);
| ~~~~~~~~^~
C:\Users\dns\Documents\Arduino\wemositog44\wemositog44.ino: In function ‘void appendFile(fs::FS&, const char*, const char*)’:
C:\Users\dns\Documents\Arduino\wemositog44\wemositog44.ino:180:41: error: no matching function for call to ‘fs::FS::open(const char*&, lfs_open_flags)’
180 | File file = fs.open(path, LFS_O_APPEND);
| ^
In file included from C:\Users\dns\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\libraries\FSTools/FSTools.h:3,
from C:\Users\dns\Documents\Arduino\wemositog44\wemositog44.ino:1:
C:\Users\dns\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\cores\esp8266/FS.h:226:10: note: candidate: ‘fs::File fs::FS::open(const char*, const char*)’
226 | File open(const char* path, const char* mode);
| ^
~
C:\Users\dns\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\cores\esp8266/FS.h:226:45: note: no known conversion for argument 2 from ‘lfs_open_flags’ to ‘const char*’
226 | File open(const char* path, const char* mode);
| ~~~~~~~~^~
C:\Users\dns\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\cores\esp8266/FS.h:227:10: note: candidate: ‘fs::File fs::FS::open(const String&, const char*)’
227 | File open(const String& path, const char* mode);
| ^
~
C:\Users\dns\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\cores\esp8266/FS.h:227:47: note: no known conversion for argument 2 from ‘lfs_open_flags’ to ‘const char*’
227 | File open(const String& path, const char* mode);
| ~~~~~~~~~~^~
Multiple libraries were found for “SD.h”
Used: C:\Users\dns\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.1.2\libraries\SD
Not used: C:\Users\dns\AppData\Local\Arduino15\libraries\SD
Not used: C:\Users\dns\Documents\Arduino\libraries\SD
exit status 1

Compilation error: expected primary-expression before ‘.’ token

Приводу весь код

#include <FSTools.h>

#include <Adafruit_Sensor.h>
#include <Adafruit_NeoPixel.h>
#include <SPI.h>
#include <SD.h>

#include <SDFS.h>

#include <AVision_ESP8266.h>
#include <ArduinoHttpClient.h>
#include <EasyNTPClient.h>
#include <NTP.h>
#include <NTPClient.h>//Библиотеки для получения времени от NTP-сервера
#include <DallasTemperature.h>
#include <OneWire.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <Uri.h>
#include <WiFiUdp.h>

unsigned long last_time;                // Переменная для хранения времени  с начало включения прибора
String dataMessage;  //переменная для записи данных на карту SD
String formattedDate;
String dayStamp;
String timeStamp; //переменная для сохранения данных о времени
const char* ssid = "wifi";  // Ввод вашей Wi-fi
const char* password = "password";  //Ввод вашего пароля
ESP8266WebServer server(80);
#define NTP_ADDRESS  "1.asia.pool.ntp.org"
#define ONE_WIRE_PIN D7                         // датчик темпетаруты
//настройки для датчика температуры
OneWire oneWire(ONE_WIRE_PIN);
DallasTemperature sensors(&oneWire);
const int digitalInPin = D5;               // Определяем номер вывода, к которому подключен  датчик Холла
// для датчика Холла
unsigned long currentTime;
unsigned long cloopTime;
int sensorValue = 0;  
int key=0;// Задаем переменную для значений, полученных с модуля
float f=0;
// для основного датчика расхода жидкости
uint8_t   pinSensor = D3;                                         // Определяем номер вывода Arduino, к которому подключён освной датчик расхода воды.
float    varQ;                                                  // Объявляем переменную для хранения рассчитанной скорости потока воды (л/с).
float    varV;
float VAR1;
float VAR;
 // для вспомогательного датчика расхода жидкости
uint8_t   pinSen = D4;                                         // Определяем номер вывода Arduino, к которому подключён вспомогательный датчик расхода воды.
float    varQ2;                                                  // Объявляем переменную для хранения рассчитанной скорости потока воды (л/с).
float    varV2;
File file; // объект для работы с картой памяти
 //  Определение NTP-клиент для получения времени
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, NTP_ADDRESS ,10800, 300000);
void setup() {
  Serial.begin(115200);
  Serial.println("Connecting to ");
  Serial.println(ssid);
   WiFi.begin(ssid, password);

  //check wi-fi is connected to wi-fi network
  while (WiFi.status() != WL_CONNECTED) {
  delay(1000);
  Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected..!");
  Serial.print("Got IP: ");  Serial.println(WiFi.localIP());

  server.on("/", handle_OnConnect);
  server.onNotFound(handle_NotFound);

  server.begin();
  Serial.println("HTTP server started");
//проверка есть ли файл на SD карте
  
  // Установка время смещения в секундах, чтобы оно соответствовало вашему часовому поясу
  // GMT +1 = 3600
  // GMT +8 = 28800
  // GMT -1 = -3600
  // GMT 0 = 0
  timeClient.setTimeOffset(10800);// GMT +3 = 10800
  //для основного датчика расхода воды
  pinMode(pinSensor, INPUT);                                 // Конфигурируем вывод к которому подключён датчик, как вход.
     varQ=0; 
     varV=0;  
    //для вспомогательного датчика расхода воды 
  //pinMode(pinSen, INPUT);                                 // Конфигурируем вывод к которому подключён датчик, как вход.
 //    varQ2=0; varV2=0; 
  file = fs.open("/data.txt");
  if(!file) {
    Serial.println("File doens't exist");
    Serial.println("Creating file...");
    writeFile(SDFS,"/data.txt", "Date, H, tmp, V \r\n"); //если файла не существует создаем с данным заголовко
  }
  else {
    Serial.println("File already exists");  
  }
  file.close();//окончание работы с файлов на sd карте
 timeClient.begin();
}
 
void loop() {
  
timeClient.update();
String formattedTime = timeClient.getFormattedTime();
   server.handleClient();
  Serial.println(WiFi.localIP());
  //измерение температуры
  sensors.requestTemperatures();
  Serial.println(sensors.getTempCByIndex(0));
  delay(500);
  //измерение оборотов
  sensorValue = digitalRead(digitalInPin);  // Записываем в переменную значения с модуля
  Serial.print("Hall Sensor = " );        // Выводим текст
  Serial.println(sensorValue);            // Выводим значение
  if (sensorValue==0 and key%2==0) {
   currentTime = millis();
   key++;}
  if (sensorValue==1 and key%2!=0) {
   cloopTime = millis()-currentTime;
   key++;}
   delay(500);
   Serial.print("time " ); 
   Serial.println(cloopTime);
  if (cloopTime!=0) {
    f=60000/(2*cloopTime);
    Serial.print("f " ); 
    Serial.println((String) "частота "+f+"об/мин ");}
  else {
    Serial.println("двигатель не вращается");}
    
    //для основго датчика расхода 
     varQ           = 0;                                         // Сбрасываем скорость потока воды.
     uint32_t varL  = pulseIn(pinSensor, HIGH, 200000);          // Считываем длительность импульса, но не дольше 0,2 сек.
    if( varL ){                                                 // Если длительность импульса считана, то ...
        float varT = 2.0 * (float)varL / 1000000;               // Определяем период следования импульсов в сек.
        float varF = 1/varT;                                    // Определяем частоту следования импульсов в Гц.
        varQ       = varF / 450.0f;                             // Определяем скорость потока с основного датчика л/с.
        varV      += varQ * varT;      }                         // Определяем объем с основного датчика л.
    //для вспомогтальеого датчика расхода    
    /* varQ2           = 0;                                          // Сбрасываем скорость потока воды.
  
     uint32_t varL2  = pulseIn(pinSen, HIGH, 200000);          // Считываем длительность импульса, но не дольше 0,2 сек.
    if( varL2 ){                                                 // Если длительность импульса считана, то ...
        float varT2 = 2.0 * (float)varL2 / 1000000;               // Определяем период следования импульсов в сек.
        float varF2 = 1/varT2;                                    // Определяем частоту следования импульсов в Гц.
        varQ2       = varF2 / 450.0f;                             // Определяем скорость потока воды л/с.
        varV2      += varQ2 * varT2;    }      */                   // Определяем объем  л.

  //   float VAR = varV-varV2;                                          //итоговый объем л.
  if(millis() - last_time > 300000) {     //запись в карту каждый 5 минут
  dataMessage = String(formattedTime) + ","+ String(f) + "," + String(sensors.getTempCByIndex(0)) + ","+ String(varV) + "," +  "\r\n";
  Serial.print("Save data: ");
  Serial.println(dataMessage);
  appendFile(SDFS, "/data.txt", dataMessage.c_str());
  }
    }
    //функция создания файла 
void writeFile(fs::FS &fs, const char* path, const char * message) {
  Serial.printf("Writing file: %s\n", path);

  File file = fs.open(path,FILE_WRITE);
  if(!file) {
    Serial.println("Failed to open file for writing");
    return;
  }
  if(file.print(message)) {
    Serial.println("File written");
  } else {
    Serial.println("Write failed");
  }
  file.close();
  }
  //функция записи данных в файл 
void appendFile(fs::FS &fs, const char* path, const char* message) {
  Serial.printf("Appending to file: %s\n", path);

  File file = fs.open(path, LFS_O_APPEND);
  if(!file) {
    Serial.println("Failed to open file for appending");
    return;
  }
  if(file.print(message)) {
    Serial.println("Message appended");
  } else {
    Serial.println("Append failed");
  }
  file.close();
}


    //функция для создания переменных, значения которых будут отпарвлены пользователю на сайт
void handle_OnConnect() {
 float f1=f;//записываем частоты вращения
 float t1=(sensors.getTempCByIndex(0));//записываем значение температуры
 float varV;//значение объёма,л.
  server.send(200, "text/html", SendHTML(f1,t1,VAR)); 
}
//создание разметки сайта для отображения данных
void handle_NotFound(){
  server.send(404, "text/plain", "Not found");
}
String SendHTML(float f1,float t1,float VAR ){
  String ptr = "<!DOCTYPE html> <html>\n";
  ptr +="<meta http-equiv=\"Content-type\" content=\"text/html; charset=utf-8\"><head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
  ptr +="<link href=\"https://fonts.googleapis.com/css?family=Open+Sans:300,400,600\" rel=\"stylesheet\">\n";
  ptr +="<title>ESP32. Информация о GPS</title>\n";
  ptr +="<style>html { font-family: 'Open Sans', sans-serif; display: block; margin: 0px auto; text-align: center;color: #333333;}\n";
  ptr +="body{margin-top: 50px;}\n";
  ptr +="h1 {margin: 50px auto 30px;}\n";
  ptr +=".side-by-side{display: inline-block;vertical-align: middle;position: relative;}\n";
  ptr +=".humidity-icon{background-color: #3498db;width: 30px;height: 30px;border-radius: 50%;line-height: 36px;}\n";
  ptr +=".humidity-text{font-weight: 600;padding-left: 15px;font-size: 19px;width: 160px;text-align: left;}\n";
  ptr +=".humidity{font-weight: 300;font-size: 60px;color: #3498db;}\n";
  ptr +=".temperature-icon{background-color: #f39c12;width: 30px;height: 30px;border-radius: 50%;line-height: 40px;}\n";
  ptr +=".temperature-text{font-weight: 600;padding-left: 15px;font-size: 19px;width: 160px;text-align: left;}\n";
  ptr +=".temperature{font-weight: 300;font-size: 60px;color: #f39c12;}\n";
  ptr +=".superscript{font-size: 17px;font-weight: 600;position: absolute;right: -20px;top: 15px;}\n";
  ptr +=".data{padding: 10px;}\n";
  ptr +="</style>\n";
  //ptr +="<meta http-equiv=\"refresh\" content=\"2\" >\n";
  ptr +="<script>\n";
  ptr +="setInterval(loadDoc,200);\n";
  ptr +="function loadDoc() {\n";
  ptr +="var xhttp = new XMLHttpRequest();\n";
  ptr +="xhttp.onreadystatechange = function() {\n";
  ptr +="if (this.readyState == 4 && this.status == 200) {\n";
  ptr +="document.getElementById(\"webpage\").innerHTML =this.responseText}\n";
  ptr +="};\n";
  ptr +="xhttp.open(\"GET\", \"/\", true);\n";
  ptr +="xhttp.send();\n";
  ptr +="}\n";
  ptr +="</script>\n";
  ptr +="</head>\n";
  ptr +="<body>\n";
   ptr +="<div id=\"webpage\">\n";
   ptr +="<h1>Wemos.D1. Информация от датчиков:</h1>\n";
   ptr +="<div class=\"data\">\n";
   ptr +="<div class=\"side-by-side temperature-icon\">\n";
   ptr +="<svg version=\"1.1\" id=\"Layer_1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"\n";
   ptr +="width=\"9.915px\" height=\"22px\" viewBox=\"0 0 9.915 22\" enable-background=\"new 0 0 9.915 22\" xml:space=\"preserve\">\n";
   ptr +="<path fill=\"#FFFFFF\" d=\"M3.498,0.53c0.377-0.331,0.877-0.501,1.374-0.527C5.697-0.04,6.522,0.421,6.924,1.142\n";
   ptr +="c0.237,0.399,0.315,0.871,0.311,1.33C7.229,5.856,7.245,9.24,7.227,12.625c1.019,0.539,1.855,1.424,2.301,2.491\n";
   ptr +="c0.491,1.163,0.518,2.514,0.062,3.693c-0.414,1.102-1.24,2.038-2.276,2.594c-1.056,0.583-2.331,0.743-3.501,0.463\n";
   ptr +="c-1.417-0.323-2.659-1.314-3.3-2.617C0.014,18.26-0.115,17.104,0.1,16.022c0.296-1.443,1.274-2.717,2.58-3.394\n";
   ptr +="c0.013-3.44,0-6.881,0.007-10.322C2.674,1.634,2.974,0.955,3.498,0.53z\"/>\n";
   ptr +="</svg>\n";
   ptr +="</div>\n";
   ptr +="<div class=\"side-by-side temperature-text\">Температура, C</div>\n";
   ptr +="<div class=\"side-by-side temperature\">";
   ptr +="<p>";
   ptr +=(float)t1;
   ptr +="</p>\n";
   ptr +="\n";
   ptr +="<span class=\"superscript\">C</span></div>\n";
   ptr +="</div>\n";
   ptr +="<div class=\"data\">\n";
   ptr +="<div class=\"side-by-side temperature-text\">Частот вращения, об.мин.</div>\n";
   ptr +="<div class=\"side-by-side temperature\">";
   ptr +="<p>";
   ptr +=(float)f1;
   ptr +="</p>\n";
   ptr +="\n";
   ptr +="<span class=\"superscript\">об.мин.</span></div>\n";
   ptr +="</div>\n";
   ptr +="<div class=\"data\">\n";
   ptr +="<div class=\"side-by-side humidity-icon\">\n";
   ptr +="<svg version=\"1.1\" id=\"Layer_2\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" x=\"0px\" y=\"0px\"\n\"; width=\"12px\" height=\"17.955px\" viewBox=\"0 0 13 17.955\" enable-background=\"new 0 0 13 17.955\" xml:space=\"preserve\">\n";
   ptr +="<path fill=\"#FFFFFF\" d=\"M1.819,6.217C3.139,4.064,6.5,0,6.5,0s3.363,4.064,4.681,6.217c1.793,2.926,2.133,5.05,1.571,7.057\n";
   ptr +="c-0.438,1.574-2.264,4.681-6.252,4.681c-3.988,0-5.813-3.107-6.252-4.681C-0.313,11.267,0.026,9.143,1.819,6.217\"></path>\n";
   ptr +="</svg>\n";
   ptr +="</div>\n";
   ptr +="<div class=\"side-by-side humidity-text\">Расход, л./div>\n";
   ptr +="<div class=\"side-by-side humidity\">";
   ptr +=(float)VAR;
   ptr +="<span class=\"superscript\">л.</span></div>\n";
   ptr +="</div>\n";
  ptr +="</div>\n";
  ptr +="</body>\n";
  ptr +="</html>\n";
  return ptr;
}

Начнем с начала. Што такое fs? Где оно обьявлено/описано?

@Avshim , вы рано с файла начинаете. Посмотрите примеры работы с карточкой.Где у вас определение объекта SD? Где инициализация?

1 лайк

Это не оно?

    //функция создания файла 
void writeFile(fs::FS &fs, const char* path, const char * message) {
  Serial.printf("Writing file: %s\n", path);

Нинаю, у него ни SD ни fs нигде ниаписано

так он жеж и пытается SD прикрутить, видимо надо последовать примеру b707 и начать с малого…
ТС! Ты откуда начальный проект сдёрнул, хочу почитать автора?

Ты про объявление переменных и объектов тоже не слышал? Не объявлена у него fs

1 лайк