SD_h как записать фаил в создаваемую папку

AndyPanda
Offline
Зарегистрирован: 20.02.2021

Здравствуйте! Возникла идея вести логи полученных с датчиков значений и упорядочивать из в папках средствами ардуино. идея в следующем: 1) я каждые 5 секунд считываю значение датчика, набираю массив 12 значений и вычисляю среднеарифметическое. 2) создаю (или открываю папку с именем текущей даты - год, месяц, день) 3) создаю в папке фаил лога минут и записываю туда полученное среднеарифметическое. 4) по прошествии часа создаю в папке часовой лог и записываю туда среднеарифметическое от минутного лога 5) тоже самое с суточными показаниями

в итоге в папке с текущем днем должно получится 3 файла : минутные значения за сутки, часовые значения за сутки и суточные значения(с этим пока не определился возможно буду создавать папку месяца)

в общем вопрос, поскольку мой код File logFile = SD.open( DATA_DIR / filename1, FILE_WRITE ); ,где DATA_DIR - имя папки, filename1 - имя файла. выдает ошибку: no match for 'operator/' (operand types are 'String' and 'String') , а примеры из скетча SD→listfiles я не понимаю как у себя применить, прошу помощи в примере рабочего куска кода.

самое разумное что я нашел это по этому адресу arduino-diy (.) com/arduino-SD-karta

чтобы люди не играли в Настрадамусов и Ванг вот код.

-----------------------

З.Ы. да, я понимаю что это быдлокод и всё там через подвыподверт, но пока так. причесывать буду потом и разносить по разным вкладкам. З.Ы.Ы как оформить код раскрывающимся катом - не знаю. и да, я надёргал куски кода из примеров и создавал под них отдельные функции. Поэтому такая каша.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

AndyPanda пишет:
Здравствуйте! .

И Вам не хворать.

Научитесь правильно вставлять.... хотя-бы программу. Очень сложно говорить о строках, когда у них нет нумера. 

AndyPanda
Offline
Зарегистрирован: 20.02.2021

да, не сразу разобрался, как это делать. строка 411

исправил. спасибо. в первом сообщении внести исправления не могу.
по существу вопроса есть что нибудь?

#include <SPI.h>  //включение SPI
#include <Wire.h> //включение I2C
/*
  // подключение часов реального времени либа от гувера ---------------------------------------------------
  #include <microDS3231.h>
  MicroDS3231 rtc3231m;
  // подключение часов реального времени либа от гувера - закончилось -------------------------------------
*/
// часы ------------------------------------------------------------------------
#include "RTClib.h"
// RTC_DS1307 rtc;
RTC_DS3231 rtc;
DateTime now;
// часы закончились -------------------------------------------------------------

// подключение SD карты ---------------------------------------------------------------------------------
#include <SD.h>

//File OPEN_Dir;

//File myFile;

Sd2Card card;
SdVolume volume;
SdFile root;

#define SDCPIN 48 // номер пина, к которому подсоединен модуль SD
//const int chipSelect = 48;
// подключение SD карты - закончилось -------------------------------------------------------------------

// подключение OLED -------------------------------------------------------------------------------------
#include <OLED_I2C.h> //подключение библиотеки маленького экрана

// OLED  myOLED(SDA, SCL, 8); // http://arduino.ru/forum/programmirovanie/pomogite-razobratsya-s-displeem-oled-lcd-display-i2c-096-iic-serial-128x64#comment-112791
OLED  myOLED(SDA, SCL);
// подключение OLED - закончилось -----------------------------------------------------------------------

// подключение DTH --------------------------------------------------------------------------------------
#include "DHT.h"

#define DHTPIN 46 // номер пина, к которому подсоединен датчик

// Раскомментируйте в соответствии с используемым датчиком

// Инициируем датчик

DHT dht(DHTPIN, DHT22);
//DHT dht(DHTPIN, DHT11);
// подключение DTH - закончилось -----------------------------------------------------------------------

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  переменные
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
extern uint8_t RusFont[]; //русские
// extern uint8_t UkrFont[];
extern uint8_t SmallFont[]; //английские
int x = 5, y, z;
unsigned long count1 = 0, SDcounter1 = 0;

long id = 1;                //Use this to store the id # of our reading. для SD карты номер значения
float refresh_rate = 0.0;  //Dataloger Refresh Rate. для SD карты задержка записи
char filename[] = "log01.csv"; // Первоначальное название файла

float ssTempArray[12], mmTempArray[60], HHTempArray[24], sumTemp1 = 0; // переменные для записи на флешку
bool flagmm = false, flagHH = false; // переменные для записи на флешку
int i = 0, j = 0, k = 0; // переменные для записи на флешку

int HH, mm, ss, YYYY, MM, dd, dow; // переменные для часов

float h, t; // переменные для влажности и температуры

String dataString, DATA_DIR, filename1, testData; // переменные для записи на флешку

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  readSDCardType(); // вывод функции SD карты. единократный

  myOLED.begin();
  dht.begin();
  z = dht.readTemperature();

  rtcSetup();

}

void loop() {
  // put your main code here, to run repeatedly:
  // Задержка 2 секунды между измерениями
  //  delay(2000);

  if (millis() - count1 > 1000) {
    count1 = millis();
    dht22();
    oled096();
    digitalClockDisplay();
    createData();
  }

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  объявление функций для setup
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void readSDCardType() {

  //OPEN_Dir = SD.open( DATA_DIR );

  Serial.print("\nInitializing SD card...");

  if (!card.init(SPI_HALF_SPEED, SDCPIN)) {
    // неверное подключение или карта неисправна
    Serial.println("initialization failed");
    return;
  } else {
    // всё ок!
    Serial.println("Wiring is correct and a card is present.");
  }

  // считываем тип карты и выводим его в COM-порт
  Serial.print("\nCard type: ");
  switch (card.type()) {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Unknown");
  }

  // инициализация файловой системы
  if (!volume.init(card)) {
    // неверная файловая система
    Serial.println("Could not find FAT16/FAT32 partition.");
    return;
  }

  // считываем тип и вычисляем размер первого раздела
  uint32_t volumesize;
  Serial.print("\nVolume type is FAT");
  Serial.println(volume.fatType(), DEC);
  Serial.println();

  volumesize = volume.blocksPerCluster(); // блоков на кластер
  volumesize *= volume.clusterCount(); // кластеров
  volumesize *= 512; // 512 байтов в блоке, итого байт..
  Serial.print("Volume size (bytes): ");
  Serial.println(volumesize);
  Serial.print("Volume size (Kbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Mbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);

  Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  root.openRoot(volume);
  // выводим список файлов
  root.ls(LS_R | LS_DATE | LS_SIZE);
  // ---------------------------------------------------------------------------------------------------------------
  //Initialize Card
  if (!SD.begin(SDCPIN))
  {
    Serial.println("Card Failure - CANT START");
    return;
  }
  Serial.println("Card Ready - START");
  /*
      //Read the Configuration information (COMMANDS.txt)
      //File commandFile = SD.open("COMMANDS.txt", FILE_WRITE);
      File commandFile = SD.open("COMMANDS.txt");
      if (commandFile)
        {
          Serial.println("Reading Command File");

          float decade = pow(10, (commandFile.available() - 1));
          while(commandFile.available())
            {
              float temp = (commandFile.read() - '0');
              refresh_rate = temp*decade+refresh_rate;
              decade = decade/10;
            }
          Serial.print("Refresh Rate = ");
          Serial.print(refresh_rate);
          Serial.println("ms");
          commandFile.close();
        }
      else
        {
          Serial.println("Could not read command file.");
          return;
        }
  */
  //Write Log File Header
  /*    if(SD.exists(filename)) {
        SD.remove(filename);
        Serial.print(filename);
        Serial.println(" ... found");
      }
      else {
        Serial.print(filename);
        Serial.println(" ... not found");
  */
  //      SD.remove(filename); // удаляет фаил с заданным именем
  File logFile = SD.open(filename, FILE_WRITE);
  if (logFile)
  {
    logFile.println("reload");
    logFile.println(", , "); //Just a leading blank line, incase there was previous data
    String header = "ID, Data, Time, Temp, Humidity";
    logFile.println(header);
    logFile.close();
    //            Serial.println(header);
  }
  else
  {
    Serial.print("Couldn't open ");
    Serial.print(filename);
    Serial.println(" file");
  }
  //    }
}

void rtcSetup() {
  // часы ----------------------------------------------------------------------------
  Wire.begin();
  rtc.begin();
  now = rtc.now();
  //  getDay(); // хз что за фигня, у меня не заработала
  //  rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); //установка времени с компа, при перепрошивке. чем отличается без "F" не знаю. раскомментировать при первичной установки времени. потом закоментировать обратно
  //  rtc.adjust(DateTime(__DATE__, __TIME__)); //установка времени с компа, при перепрошивке - работает страннее чем: rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

  /*
    clock.begin(); //включение часов.
    byte hour = getInt(compileTime, 0);
    byte minute = getInt(compileTime, 2);
    byte second = getInt(compileTime, 4); //получение времени.
    clock.fillByHMS(hour, minute, second); //подготовка для записывания в модуль времени.
    clock.setTime(); //происходит запись полученной информации во внутреннюю память, начало считывания времени.
  */
  /*
    if (! rtc.isrunning()) {
      Serial.println("RTC is NOT running!");
      // following line sets the RTC to the date & time this sketch was compiled
      //rtc.adjust(DateTime(__DATE__, __TIME__));
    }
  */
  // часы закончились ----------------------------------------------------------------
}


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  объявление функций для loop
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void dht22() {
  //Считываем влажность
  h = dht.readHumidity();
  // Считываем температуру
  t = dht.readTemperature();
  // Проверка удачно прошло ли считывание.
  if (isnan(h) || isnan(t)) {
    Serial.println("Не удается считать показания");
    return;
  }
  // Serial.print("Влажность: "+h+" %\t"+"Температура: "+t+" *C ");
  // Serial.println(«Humidity : «+String(h, 1)+»%\t Temperature : «+String(t, 1)+» *C»);
  /*
    Serial.print("Влажность: ");
    Serial.print(h);
    Serial.println(" %");
    Serial.print("Температура: ");
    Serial.print(t);
    Serial.println(" *C");
  */

}

void oled096() {
  int PY = 8, TY = PY + 8;
  int x1 = 55, x2 = 70;

  myOLED.setBrightness(10);
  myOLED.setFont(RusFont);
  myOLED.print("Ntvgthfnehf", 0, TY);  //
  myOLED.setFont(SmallFont);
  myOLED.print(String(dht.readTemperature(), 1), x2, TY);
  myOLED.print("~C", x2 + 28, TY);

  myOLED.setFont(RusFont);
  myOLED.print("Dkf;yjcnm", 0, PY);
  myOLED.setFont(SmallFont);
  myOLED.print(String(dht.readHumidity(), 1), x1, PY);
  myOLED.setFont(SmallFont);
  myOLED.print("%", x1 + 30, PY);

  /*
    y = map(dht.readTemperature()*10, 200, 300, 30, 20);
    myOLED.drawLine(x, 30, x, y);

    z = map(dht.readHumidity(), 40, 120, 63, 33);
    myOLED.drawLine(x, 63, x, z);
    myOLED.update();

    x++;
    if (x >= 127) {
      x = 0;
      myOLED.clrScr();
    }
  */
  /**/
  // рисуем график -------------------------------------------------------- работает, закоментировал временно
  y = map(dht.readTemperature() * 10, 200, 300, 63, TY + 8);
  myOLED.drawLine(x, z, x + 1, y);
  myOLED.update();
  z = y;
  x++;
  if (x >= 123) {
    x = 5;
    myOLED.clrScr();
  }
  // закончили с графиком ------------------------------------------------
  /**/

  /*
    Serial.print(dht.readHumidity());
    Serial.println(" %");
    Serial.print(dht.readTemperature());
    Serial.println(" *C");
    //  Serial.print(dht.readTemperature()*10);
    //  Serial.println(" *Cx10");
    //  Serial.print(x);
    //  Serial.println(" x");
    //  Serial.print(y);
    //  Serial.println(" y");
    //  Serial.print(z);
    //  Serial.println(" z");
  */

}

void createData() {

  //Считываем влажность
  h = dht.readHumidity();
  // Считываем температуру
  t = dht.readTemperature();

  //Create Data string for storing to SD card
  //We will use CSV Format
  //  String dataString = ( String(id) + ", " + String(dd) + "." + String(MM)+ "." + String(YYYY)+ ", " + String(HH) + ":" + String(mm) + ":00, "  + String(t) + ", " + String(h) );
  dataString = ( String(id) + ", " + String(dd) + "." + String(MM) + "." + String(YYYY) + ", " + String(HH) + ":" + String(mm) + ", "  + String(t) + ", " + String(h) );

  DATA_DIR = ( String(YYYY) + "-" + String(MM) + "-" + String(dd) );
  //String DATA_DIR = ( String(MM) + "-" + String(dd) );

  // String header = "ID, Data, Time, Temp, Humidity"; // тут для наглядности заголовка

  /**/ // попытка собрать значения и разбить на 3 файла: минуты, часы, дни
  if ( i <= 11 ) {
    if ( millis() - SDcounter1 >= 5 * 1000 ) {
      SDcounter1 = millis();
      ssTempArray[i] = t; // в массив секунд вносим считанное значение температуры с датчика

      //      Serial.print("i: ");
      //      Serial.println(i);
      //      Serial.print("ssTempArray[i]: ");
      //      Serial.println(ssTempArray[i]);

      i++;
    }
  }
  //    int sumTemp1 = 0; // переменная перенесена выше
  //    i = 0;
  else {
    for (i = 0; i <= 11; i++) {
      sumTemp1 += ssTempArray[i];
    }
    sumTemp1 /= i; // получили среднеарифметическое число температуры за минуту из 12ти значений. как теперь его записать в массив минут?

    //    Serial.print("summ - i: ");
    //    Serial.println(i);

    i = 0;
    flagmm = true;

    //    Serial.print("seconds - sumTemp1: ");
    //    Serial.println(sumTemp1);
    //    Serial.println("--------------------------------------------");
  }

  if ( flagmm ) {
    //SD.mkdir(DATA_DIR);

    if ( j <= 59 ) {
      mmTempArray[j] = sumTemp1;

      filename1 = "minutes.csv";
      testData = ( String ( mmTempArray[j] ) );

      //OPEN_Dir = SD.open( DATA_DIR );
      //IN_Directory( OPEN_Dir, 0 );
      //IN_Directory( OPEN_Dir );

      //void IN_Directory(File Dir) {
        File logFile = SD.open( DATA_DIR / filename1, FILE_WRITE );
        //File logFile = Dir.openNextFile( filename1, FILE_WRITE );
        if (logFile)
        {
          logFile.println(testData);
          logFile.close();
          //    Serial.println(dataString);
        }
        else
        {
          Serial.print( "something wrong: " );
          Serial.println( filename1 );
          //    Serial.println(" file");
        }
      }

      sumTemp1 = 0;

      //      Serial.print("j: ");
      //      Serial.println(j);
      //      Serial.print("mmTempArray[j]: ");
      //      Serial.println(mmTempArray[j]);
      //      Serial.print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!TIME: ");
      //      Serial.print(HH);
      //      Serial.print(":");
      //      Serial.println(mm);

      j++;
      flagmm = false;
    }
    else {
      sumTemp1 = 0;
      for (j = 0; j <= 59; j++) {
        sumTemp1 += mmTempArray[j];
      }
      sumTemp1 /= j; // получили среднеарифметическое число температуры за час из 60ти значений.

      //    Serial.print("summ - j: ");
      //    Serial.println(j);

      j = 0;
      flagmm = false;
      flagHH = true;

      //    Serial.print("minits - sumTemp1: ");
      //    Serial.println(sumTemp1);
      //    Serial.println("--------------------------------------------");
    }
  //}
  if ( flagHH ) {
    if ( k <= 23 ) {
      HHTempArray[k] = sumTemp1;
      sumTemp1 = 0;

      //      Serial.print("k: ");
      //      Serial.println(k);
      //      Serial.print("HHTempArray[k]: ");
      //      Serial.println(HHTempArray[k]);

      k++;
      flagHH = false;
    }
    else {
      sumTemp1 = 0;
      for (k = 0; k <= 23; k++) {
        sumTemp1 += HHTempArray[k];
      }
      sumTemp1 /= k; // получили среднеарифметическое число температуры за час из 60ти значений.

      //    Serial.print("summ - k: ");
      //    Serial.println(k);

      k = 0;
      //    flagmm = false;
      flagHH = false;

      //    Serial.print("hours - sumTemp1: ");
      //    Serial.println(sumTemp1);
      //    Serial.println("--------------------------------------------");
    }
  }
  //  }

  /**/

  //Open a file to write to
  //Only one file can be open at a time
  File logFile = SD.open(filename, FILE_WRITE);
  if (logFile)
  {
    logFile.println(dataString);
    logFile.close();
    //    Serial.println(dataString);
  }
  else
  {
    Serial.print("Couldn't open ");
    Serial.print(filename);
    Serial.println(" file");
  }

  //Increment ID number
  id++;

  //  delay(refresh_rate);
}


// ----------------------------------------------------------------------------------
// функция вывода часов  -----------------------------------------------------------
void digitalClockDisplay() {
  // digital clock display of the time
  //  int HH, mm, ss, YYYY, MM, dd, dow;
  char S_timedate[18];
  char sl, dp;
  char* cdow[] = { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" };

  DateTime now = rtc.now();
  HH = now.hour(); // печатает часы
  mm = now.minute(); // печатает минуты
  //  if (mm < 59) { mm++; } // компенсация отставания на 26 секунд минутами. тут явно лишняя
  //  ss = now.second(); // печатает секунды
  YYYY = now.year(); //год
  MM = now.month(); //месяц
  dd = now.day(); //день
  dow = now.dayOfTheWeek(); // день недели
  sl = '/';
  dp = ':';
  sprintf ( S_timedate, "%02i%1c%02i %3s %4i%1c%02i%1c%02i", HH, dp, mm, cdow[dow], YYYY, sl, MM, sl, dd);
  // S_timedate - куда выводить, массив char
  // "%02i %2c %4.3f" формат вывода аргументов пробелы отображаются также без пробелов: "%02i%2c%4.3f
  // %02(два поля - сначала нули)i(int)
  // %2(два поля)c(char)
  // %4(4 поля всего).3(после запятой)f(float)  -  в ардуино кажись не работает
  // про форматы - http://www.softtime.ru/bookphp/gl3_6.php   приблизительно
  /*
      b – целое число, представляемое в двоичном виде;
      с – целое число, представляемое в виде символа с тем же ASCII кодом;
      d – целое число, представляемое в десятичном виде;
      f – число с плавающей точкой, представляемое в виде десятичной дроби;
      o – целое число, представляемое в восьмеричном виде;
      s – строка;
      x – целое число, представляемое в шестнадцатеричном виде в нижнем регистре;
      X – целое число, представляемое в шестнадцатеричном виде в верхнем регистре

  */
  /*
      Serial.println("TIME:");
      Serial.print(HH);
      Serial.print(":");
      Serial.print(mm);
      Serial.print(":");
      Serial.println(ss);

      Serial.println("DATA:");
      Serial.print(YYYY);
      Serial.print("/");
      Serial.print(MM);
      Serial.print("/");
      Serial.println(dd);
  */
  //  myOLED.setBrightness(10);
  myOLED.setFont(SmallFont);
  myOLED.print(String(S_timedate), 0, 0);
  //  myOLED.print("~C", 107, TY);

  /*
    //выводим время -----------------------------------------------------------------
    lcd.setCursor(0, 0);
    lcd.print ( S_timedate );
    //lcd.setCursor(6, 0); // так работает - вывод дня недели
    //lcd.print ( cdow[dow] ); // так работает - вывод дня недели

    //Serial.println(S_timedate);  // проверка, что за хрень выводится в сериал порт
    // вывели время -----------------------------------------------------------------
    // рисуем двоеточие -------------------------------------------------------------
    lcd.setCursor(2, 0);
    lcd.print(":");
  */
  /*
    if (now.second()%10%2 == 0){
      lcd.setCursor(2, 0);
      lcd.print(":");
      //lcd.setCursor(5, 0); // для теста секунд
      //lcd.print(":"); // для теста секунд
    }
    else
    {
      lcd.setCursor(2, 0);
      lcd.print(" ");
      //lcd.setCursor(5, 0); // для теста секунд
      //lcd.print(" "); // для теста секунд
    }
  */
  // нарисовали двоеточие ----------------------------------------------------------

}
// функция вывода часов - закончилась -----------------------------------------------

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  левые примеры. не всегда работают
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// http://arduino-project.net/grafik/
// вывод на экран

/*
  #include <Wire.h>
  #include <Adafruit_BMP085.h>
  #include <OLED_I2C.h>

  Adafruit_BMP085 bmp;
  OLED  myOLED(SDA, SCL, 8);
  extern uint8_t SmallFont[];
  extern uint8_t RusFont[];

  void setup() {
  myOLED.begin();
  Serial.begin(9600);
  if (!bmp.begin()) {
    Serial.println("Could not find a valid BMP085 sensor, check wiring!");
    while (1) {}
  }
  }

  void loop() {
  myOLED.setFont(RusFont);
  myOLED.print("Ntvgthfnehf", 5, 0);  //
  myOLED.setFont(SmallFont);
  myOLED.print(String(bmp.readTemperature(),1), 80, 0);
  myOLED.print("~C", 107, 0);
  myOLED.setFont(RusFont);
  myOLED.print("Lfdktybt", 5, 32);
  myOLED.setFont(SmallFont);
  myOLED.print(String(bmp.readSealevelPressure() / 133.3,1), 60, 32);
  myOLED.setFont(RusFont);
  myOLED.print("vv", 92, 32);
  myOLED.update();
  }
*/

// вывод с графиком столбцами
/*
  // Для отображения сплошного графика я решил использовать рисование линий от точки X к точке Y, и смещать график вправо при каждом измерении температуры, а для построения графика атмосферного давления используем X и Z

  #include <Wire.h>
  #include <Adafruit_BMP085.h>
  #include <OLED_I2C.h>

  Adafruit_BMP085 bmp;

  OLED  myOLED(SDA, SCL, 8);

  extern uint8_t SmallFont[];
  extern uint8_t RusFont[];
  int x = 0;
  int y, z = 0;

  void setup() {
  myOLED.begin();
  Serial.begin(9600);
  if (!bmp.begin()) {
    Serial.println("Could not find a valid BMP085 sensor, check wiring!");
    while (1) {}
  }
  }

  void loop() {
  myOLED.setBrightness(10);
  myOLED.setFont(RusFont);
  myOLED.print("Ntvgthfnehf", 5, 0);  //
  myOLED.setFont(SmallFont);
  myOLED.print(String(bmp.readTemperature(), 1), 80, 0);
  myOLED.print("~C", 107, 0);
  myOLED.setFont(RusFont);
  myOLED.print("Lfdktybt", 5, 32);
  myOLED.setFont(SmallFont);
  myOLED.print(String(bmp.readSealevelPressure() / 133.3, 1), 60, 32);
  myOLED.setFont(RusFont);
  myOLED.print("vv", 92, 32);

  y = map(bmp.readTemperature(), 10, 30, 30, 20);
  myOLED.drawLine(x, 30, x, y);

  z = map(bmp.readSealevelPressure() / 133.3, 700, 780, 63, 33);
  myOLED.drawLine(x, 63, x, z);
  myOLED.update();

  x++;
  if (x >= 127) {
    x = 0;
    myOLED.clrScr();
  }
  }
*/

// вывод с графиком линией
/*
  #include <Wire.h>
  #include <Adafruit_BMP085.h>
  #include <OLED_I2C.h>

  Adafruit_BMP085 bmp;
  OLED  myOLED(SDA, SCL, 8);
  extern uint8_t SmallFont[];
  extern uint8_t RusFont[];

  int x,y,z=0;

  void setup() {
  myOLED.begin();
  Serial.begin(9600);
  if (!bmp.begin()) {
    Serial.println("Could not find a valid BMP085 sensor, check wiring!");
    while (1) {}
  }
  }

  void loop() {
  myOLED.setFont(RusFont);
  myOLED.print("Ntvgthfnehf", 5, 0);
  myOLED.setFont(SmallFont);
  myOLED.print(String(bmp.readTemperature(),1), 80, 0);
  myOLED.print("~C", 107, 0);
  y = map(bmp.readTemperature()*10, 235, 300, 63, 8);
  myOLED.drawLine(x, z, x+1, y);
  myOLED.update();
  z=y;
  x++;
  if(x>=123){x=0;myOLED.clrScr();}
  }
*/

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

AndyPanda пишет:
мой код File logFile = SD.open( DATA_DIR / filename1, FILE_WRITE ); ,где DATA_DIR - имя папки, filename1 - имя файла. выдает ошибку: no match for 'operator/' (operand types are 'String' and 'String')



Так а что по-Вашему должен делать этот код, совершать операцию деления одной строки на другую? Это как?

AndyPanda
Offline
Зарегистрирован: 20.02.2021

http://arduino.ru/forum/programmirovanie/ne-smog-naiti-opisaniemanual-po-biblioteke-sd-pomogite#comment-300168

 

сообщение 4) В примерах создают файл в корне карты. А как создать файл в подкаталоге?

сообщение 8) в мануале написано так: "directory/filename.txt"

предпологаестя создать директорию и в ней фаил и в него записать значения.

b707
Онлайн
Зарегистрирован: 26.05.2017

AndyPanda - начните с того, что выкиньте из кода все, что не относится к Sdкарте - OLED дисплей, RTC, датчики температуры. Оставьте коротенький код, в котором все, что вы будете делать - создавать каталоги на карточке и писать туда файлы.

80% за то, что на таком коротком коде вы сами найдете ошибку. А не найдете - приносите этот код сюда, посмотрим все вместе

Если что - это вовсе не глум, свои программы отлаживаю именно так.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

b707 пишет:

AndyPanda - начните с того, что выкиньте из кода все, что не относится к Sdкарте 

Слона надо кушать по частям.

AndyPanda
Offline
Зарегистрирован: 20.02.2021

b707 пишет:

AndyPanda - начните с того, что выкиньте из кода все, что не относится к Sdкарте - OLED дисплей, RTC, датчики температуры. Оставьте коротенький код, в котором все, что вы будете делать - создавать каталоги на карточке и писать туда файлы.

80% за то, что на таком коротком коде вы сами найдете ошибку. А не найдете - приносите этот код сюда, посмотрим все вместе

Если что - это вовсе не глум, свои программы отлаживаю именно так.

С одной стороны я это всё понимаю, что сложно разбираться с каждым уникумом индивидуально

С другой все упражнения в остроумии от некоторых товарищей показывают, что они приходят посоревноваться в этом остроумии и при этом, скорее всего ничего не знают по теме.

С третей, я в самом начале написал, прямым текстом что у меня не получается создать папку, а в ней фаил лога и попросил кусок рабочего кода (и тут или я неправильно сформулировал что маловероятно или чтецы слеповаты и без понимания)

если что, лишнее повыкидывал, но мне надо создавать имена основываясь на дате с часов (да и до этого код работал нормально. в корень зиписывалось правильно)

ошибка в строке 186

#include <SPI.h>  //включение SPI
#include <Wire.h> //включение I2C
// часы ------------------------------------------------------------------------
#include "RTClib.h"
// RTC_DS1307 rtc;
RTC_DS3231 rtc;
DateTime now;
// часы закончились -------------------------------------------------------------
// подключение SD карты ---------------------------------------------------------------------------------
#include <SD.h>
Sd2Card card;
SdVolume volume;
SdFile root;
#define SDCPIN 48 // номер пина, к которому подсоединен модуль SD
// подключение SD карты - закончилось -------------------------------------------------------------------
// подключение DTH --------------------------------------------------------------------------------------
#include "DHT.h"
#define DHTPIN 46 // номер пина, к которому подсоединен датчик
// Инициируем датчик
DHT dht(DHTPIN, DHT22);
// подключение DTH - закончилось -----------------------------------------------------------------------
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  переменные
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
unsigned long count1 = 0, SDcounter1 = 0;
long id = 1;                //Use this to store the id # of our reading. для SD карты номер значения
float refresh_rate = 0.0;  //Dataloger Refresh Rate. для SD карты задержка записи
char filename[] = "log01.csv"; // Первоначальное название файла

float ssTempArray[12], mmTempArray[60], HHTempArray[24], sumTemp1 = 0; // переменные для записи на флешку
bool flagmm = false, flagHH = false; // переменные для записи на флешку
int i = 0, j = 0, k = 0; // переменные для записи на флешку
String dataString, DATA_DIR, filename1, testData; // переменные для записи на флешку
int HH, mm, ss, YYYY, MM, dd, dow; // переменные для часов
float h, t; // переменные для влажности и температуры

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  readSDCardType(); // вывод функции SD карты. единократный
  dht.begin();
  rtcSetup();
}

void loop() {
  if (millis() - count1 > 1000) {
    count1 = millis();
    digitalClockDisplay();
    createData();
  }
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  объявление функций для setup
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void readSDCardType() {
  Serial.print("\nInitializing SD card...");
  if (!card.init(SPI_HALF_SPEED, SDCPIN)) {
    // неверное подключение или карта неисправна
    Serial.println("initialization failed");
    return;
  } else {
    // всё ок!
    Serial.println("Wiring is correct and a card is present.");
  }

  // считываем тип карты и выводим его в COM-порт
  Serial.print("\nCard type: ");
  switch (card.type()) {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Unknown");
  }

  // инициализация файловой системы
  if (!volume.init(card)) {
    // неверная файловая система
    Serial.println("Could not find FAT16/FAT32 partition.");
    return;
  }

  // считываем тип и вычисляем размер первого раздела
  uint32_t volumesize;
  Serial.print("\nVolume type is FAT");
  Serial.println(volume.fatType(), DEC);
  Serial.println();

  volumesize = volume.blocksPerCluster(); // блоков на кластер
  volumesize *= volume.clusterCount(); // кластеров
  volumesize *= 512; // 512 байтов в блоке, итого байт..
  Serial.print("Volume size (bytes): ");
  Serial.println(volumesize);
  Serial.print("Volume size (Kbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Mbytes): ");
  volumesize /= 1024;
  Serial.println(volumesize);

  Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  root.openRoot(volume);
  // выводим список файлов
  root.ls(LS_R | LS_DATE | LS_SIZE);
  // ---------------------------------------------------------------------------------------------------------------
  //Initialize Card
  if (!SD.begin(SDCPIN))
  {
    Serial.println("Card Failure - CANT START");
    return;
  }
  Serial.println("Card Ready - START");
  //SD.remove(filename); // удаляет фаил с заданным именем
  File logFile = SD.open(filename, FILE_WRITE);
  if (logFile)
  {
    logFile.println("reload");
    logFile.println(", , "); //Just a leading blank line, incase there was previous data
    String header = "ID, Data, Time, Temp, Humidity";
    logFile.println(header);
    logFile.close();
    //            Serial.println(header);
  }
  else
  {
    Serial.print("Couldn't open ");
    Serial.print(filename);
    Serial.println(" file");
  }
  //    }
}

void rtcSetup() {
  // часы ----------------------------------------------------------------------------
  Wire.begin();
  rtc.begin();
  now = rtc.now();
  //  rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); //установка времени с компа, при перепрошивке. чем отличается без "F" не знаю. раскомментировать при первичной установки времени. потом закоментировать обратно
  // часы закончились ----------------------------------------------------------------
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//  объявление функций для loop
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void createData() {
  //Считываем влажность
  h = dht.readHumidity();
  // Считываем температуру
  t = dht.readTemperature();

  //Create Data string for storing to SD card
  //We will use CSV Format
  //  String dataString = ( String(id) + ", " + String(dd) + "." + String(MM)+ "." + String(YYYY)+ ", " + String(HH) + ":" + String(mm) + ":00, "  + String(t) + ", " + String(h) );
  dataString = ( String(id) + ", " + String(dd) + "." + String(MM) + "." + String(YYYY) + ", " + String(HH) + ":" + String(mm) + ", "  + String(t) + ", " + String(h) );

  DATA_DIR = ( String(YYYY) + "-" + String(MM) + "-" + String(dd) );
  /**/ // попытка собрать значения и разбить на 3 файла: минуты, часы, дни
  if ( i <= 11 ) {
    if ( millis() - SDcounter1 >= 5 * 1000 ) {
      SDcounter1 = millis();
      ssTempArray[i] = t; // в массив секунд вносим считанное значение температуры с датчика
      i++;
    }
  }
  else {
    for (i = 0; i <= 11; i++) {
      sumTemp1 += ssTempArray[i];
    }
    sumTemp1 /= i; // получили среднеарифметическое число температуры за минуту из 12ти значений. как теперь его записать в массив минут?
    i = 0;
    flagmm = true;
  }

  if ( flagmm ) {
    if ( j <= 59 ) {
      mmTempArray[j] = sumTemp1;
      filename1 = "minutes.csv";
      testData = ( String ( mmTempArray[j] ) );

      File logFile = SD.open( DATA_DIR / filename1, FILE_WRITE );
      if (logFile)
      {
        logFile.println(testData);
        logFile.close();
        //    Serial.println(dataString);
      }
      else
      {
        Serial.print( "something wrong: " );
        Serial.println( filename1 );
        //    Serial.println(" file");
      }
      sumTemp1 = 0;
      j++;
      flagmm = false;
    }
    else {
      sumTemp1 = 0;
      for (j = 0; j <= 59; j++) {
        sumTemp1 += mmTempArray[j];
      }
      sumTemp1 /= j; // получили среднеарифметическое число температуры за час из 60ти значений.
      j = 0;
      flagmm = false;
      flagHH = true;
    }
  }
  if ( flagHH ) {
    if ( k <= 23 ) {
      HHTempArray[k] = sumTemp1;
      sumTemp1 = 0;
      k++;
      flagHH = false;
    }
    else {
      sumTemp1 = 0;
      for (k = 0; k <= 23; k++) {
        sumTemp1 += HHTempArray[k];
      }
      sumTemp1 /= k; // получили среднеарифметическое число температуры за час из 60ти значений.
      k = 0;
      flagHH = false;
    }
  }
  //Open a file to write to
  //Only one file can be open at a time
  File logFile = SD.open(filename, FILE_WRITE);
  if (logFile)
  {
    logFile.println(dataString);
    logFile.close();
    //    Serial.println(dataString);
  }
  else
  {
    Serial.print("Couldn't open ");
    Serial.print(filename);
    Serial.println(" file");
  }
  //Increment ID number
  id++;
}
// ----------------------------------------------------------------------------------
// функция вывода часов  -----------------------------------------------------------
void digitalClockDisplay() {
  DateTime now = rtc.now();
  HH = now.hour(); // печатает часы
  mm = now.minute(); // печатает минуты
  YYYY = now.year(); //год
  MM = now.month(); //месяц
  dd = now.day(); //день
}
// функция вывода часов - закончилась -----------------------------------------------

 

b707
Онлайн
Зарегистрирован: 26.05.2017

Про строку 186 Вам уже писали в #3. В этой строке у вас написана бредятина. С точки зрения компилятора С++, конструкция

DATA_DIR / filename1

означает поделить значение переменной DATA_DIR  на значение переменной filename1. Компилятор не в курсе,  как выполнять деление для строк  - о чем вам и сообщает ошибкой

А готовый код новичкам тут давать не принято. Либо додумайте сами по наводящим вопросам, либо ищите счастья где-то еще.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вот, спрашивается, какой смысл отвечать на вопросы, если ТС все равно не читает ответы?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

AndyPanda пишет:

и попросил кусок рабочего кода

На данном форуме эта просьба считается бестактной. Единственный раздел, где это допустимо - "Ищу исполнителя".

AndyPanda
Offline
Зарегистрирован: 20.02.2021

andriano пишет:

Вот, спрашивается, какой смысл отвечать на вопросы, если ТС все равно не читает ответы?

ТС читает ответы. и понимает, что вопрос о бестактности закапывается легко вот этим сообщением http://arduino.ru/forum/programmirovanie/2-datchika-dht22-i-odna-funktsi...

так же, ТС изучил вот этот коммент http://arduino.ru/forum/programmirovanie/ne-smog-naiti-opisaniemanual-po...

и не нашел там функции: "зайти в папку и проводить все операции находясь в ней".

в общим по итогу, вывод напрашивается следующий: отвечающие не понимают что ответить, но показать свою маститость (на олдскульность и знания увы не тянете) пальцы чешутся.

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А зачем именно в "ру сегменте", если есть среди стандартных примеров к стандартной библиотеке SD?

Тут как бы обсуждать нечего, поэтому и примеров нет.

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

Реально наркоман какой-то! ;))
Родное сердце! Ты разницу между а/в и "а/в" понимаешь??? Кавычек вокруг "папка/файл" у тебя нет!
Мля, ты реально тупой? Или на препаратах?

b707
Онлайн
Зарегистрирован: 26.05.2017

AndyPanda пишет:

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

ну закрывать так закрывать, ты думаешь мы тебя уговаривать будем? :)

AndyPanda
Offline
Зарегистрирован: 20.02.2021

wdrakula пишет:
Реально наркоман какой-то! ;)) Родное сердце! Ты разницу между а/в и "а/в" понимаешь??? Кавычек вокруг "папка/файл" у тебя нет! Мля, ты реально тупой? Или на препаратах?

 

как жаль, что я это давно попробовал и это не работает.

кстати, там кто-то говорил, про компилятор. так вот, конструкция в кавычках - это строка (или набор символов, я то в этом не силен в отличии от маститых ).

соответственно, если директория записывается в переменную и имя файла записывается в переменную, то (барабанная дробь...) это не заработает.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

AndyPanda пишет:

...то (барабанная дробь...) это не заработает.

Что именно это?

Вы имеете хоть малейшее представление о языке, на котором пытаетесь писать?

Или наивно полагаете, что если немного беспорядочно постучать пальцами по клавиатуре, то (барабанная дробь!) выйдет именно то, что Вам нужно?

AndyPanda
Offline
Зарегистрирован: 20.02.2021

b707 пишет:

AndyPanda пишет:

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

ну закрывать так закрывать, ты думаешь мы тебя уговаривать будем? :)

 

меня уговаривать не надо. я сделаю попроще. или посмотрю, как это реализовано при компиляции FLProg.

а вы так и останетесь тут с осознанием собственной важности, но без знаний и примеров.

AndyPanda
Offline
Зарегистрирован: 20.02.2021

andriano пишет:

AndyPanda пишет:

...то (барабанная дробь...) это не заработает.

Что именно это?

Вы имеете хоть малейшее представление о языке, на котором пытаетесь писать?

Или наивно полагаете, что если немного беспорядочно постучать пальцами по клавиатуре, то (барабанная дробь!) выйдет именно то, что Вам нужно?

превратили во флуд, так превратили.

File logFile = SD.open( DATA_DIR / filename1 , FILE_WRITE );

DATA_DIR, filename1 - строковые переменные

File logFile = SD.open( " DATA_DIR / filename1 " , FILE_WRITE ); - кавычки здесь (сдеся, тута как вам понятнее) превращают две переменные в набор символов и данная конструкция не заработает.

Но это пажалуй для пояснение маститому wdrakula

b707
Онлайн
Зарегистрирован: 26.05.2017

AndyPanda пишет:

File logFile = SD.open( " DATA_DIR / filename1 " , FILE_WRITE ); - кавычки здесь (сдеся, тута как вам понятнее) превращают две переменные в набор символов и данная конструкция не заработает.

реально тупой :)

Сколько платишь, чтоб я тебе прям в этой строчке расставил кавычки правильно?

AndyPanda
Offline
Зарегистрирован: 20.02.2021

andriano пишет:

А зачем именно в "ру сегменте", если есть среди стандартных примеров к стандартной библиотеке SD?

Тут как бы обсуждать нечего, поэтому и примеров нет.

 

ну так, ради проформы, где здесь пример записи файлов внутри папки?

Examples

 

  • Card Info: Get info about your SD card.
  • Datalogger: Log data from three analog sensors to an SD card.
  • Dump File: Read a file from the SD card.
  • Files: Create and destroy an SD card file.
  • List Files: Print out the files in a directory on a SD card.
  • Read Write: Read and write data to and from an SD card.

на ListFiles пожалуйста указывать там работа только с чтением

 

b707
Онлайн
Зарегистрирован: 26.05.2017

AndyPanda пишет:

ну так, ради проформы, где здесь пример записи файлов внутри папки?

а зачем он нужен?

Там в описании есть строчка

"The file names passed to the SD library functions can include paths separated by forward-slashes, /, e.g. "directory/filename.txt"."

- которой более чем достаточно, чтоб понять, как писать файлы не текущую, а во вложенные директории

 

andriano пишет:

Тут как бы обсуждать нечего, поэтому и примеров нет.

b707
Онлайн
Зарегистрирован: 26.05.2017

AndyPanda - очевидно, что причина всего этого цирка с конями - вы не знаете элементарнейших операций на Си, таких как сложение, умножение, деление... Потому и помощь вам не в кассу и примеры не помогают.

Примеры в описании библиотеки не рассччитаны на уровень детского сада. Если где-то обьяснено, что функция принимает, например, число 2 - никто не станет давать отдельных примеров на число 3 или 44 :)))

За то время, что вы тут канючите и обижаетесь - нормальный человек давно бы уже нашел и прочитал операции со строками.

Адьос

 

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

если у тебя строки в переменных, то вот так Var1+Var2 они не складываюся, внезапно. 

AndyPanda
Offline
Зарегистрирован: 20.02.2021

b707 пишет:

AndyPanda пишет:

File logFile = SD.open( " DATA_DIR / filename1 " , FILE_WRITE ); - кавычки здесь (сдеся, тута как вам понятнее) превращают две переменные в набор символов и данная конструкция не заработает.

реально тупой :)

Сколько платишь, чтоб я тебе прям в этой строчке расставил кавычки правильно?

 

рублей 200. если это заработает с переменными

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

AndyPanda пишет:

на ListFiles пожалуйста указывать там работа только с чтением

А что, есть какая-то принципиальная разница между чтением и записью?

AndyPanda
Offline
Зарегистрирован: 20.02.2021

DetSimen пишет:

если у тебя строки в переменных, то вот так Var1+Var2 они не складываюся, внезапно. 

 

мимо. я не пытаюсь делать математические операции со строковыми переменными

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А что Вы пытаетесь?

AndyPanda
Offline
Зарегистрирован: 20.02.2021

andriano пишет:

AndyPanda пишет:

на ListFiles пожалуйста указывать там работа только с чтением

А что, есть какая-то принципиальная разница между чтением и записью?

 

если нечего сказать, то докопайся до грамАтности.

если из примеров ничего не подходит, но надо хоть как-то защитить свои слова: "если есть среди стандартных примеров к стандартной библиотеке SD" - переходи да близкие темы(итераций может быть много), может там оппонент не разбирается. надежда умирает последней не так ли?

AndyPanda
Offline
Зарегистрирован: 20.02.2021

andriano пишет:

А что Вы пытаетесь?

 

вон там, повыше, ушедший с гордо поднятой головой b707 кидал цитату "The file names passed to the SD library functions can include paths separated by forward-slashes, /, e.g. "directory/filename.txt""
 

так же по ссылке https://www.arduino.cc/en/Reference/SDopen
есть схожая надпись "
Syntax
SD.open(filepath)
SD.open(filepath, mode)
Parameters
filename: the name the file to open, which can include directories (delimited by forward slashes, /) - char *

"

но с примерами что плохо, возможно и я там чего-то не вижу, собственно поэтому и написал сюда.

ладно, налайкивайте тут друг другу и дальше, маститые. Про то как я тут канючил и обижался почаще себе повторяйте.

b707
Онлайн
Зарегистрирован: 26.05.2017

AndyPanda - вы реально таки думаете, что хоть кто-то из разговаривающих с вами не знает ответа? :)))

ну так что, платите за решение? Или болтовня одна?

Иначе, я вижу, эта тема будет вечной. Поскольку сами вы ни на что не способны.

 

Еще что забавно - пример как сделать путь к каталогу - у вас ДАЖЕ ЕСТЬ В ВАШЕМ СКЕТЧЕ!!! А раз вы все равно тупите - похоже этот код вы списали от первойдо последней буквы и понимаете в нем не больше, чем неграмотный в японских иероглифах

Rumata
Rumata аватар
Онлайн
Зарегистрирован: 29.03.2019

AndyPanda пишет:

если нечего сказать, то докопайся до грамАтности.

Зашел ты не очень 

Тебе грамотные (реально!) люди указывают на конкретные твои ошибки в базовых операциях со встроенными типами. Все остальные проблемы вторичны. Идея "кодирования" микроконтроллеров путем сбора кусочков чужого говнокода примеров изначально обречена на провал, если ты не в состоянии ПОНЯТЬ, что ты используешь. 

Это твой путь, но без усвоения букваря ты Набокова обратно на английский не переведешь

b707
Онлайн
Зарегистрирован: 26.05.2017

DetSimen пишет:

Да ты, батенька, верно, феерический кретин, я угадал? 

никаких сомнений. Ему не просто подсказали - его считай подвели к решению. Стоит, смотрит в упор, спрашивает "Где?"

С такого даже стыдно денег брать.

Деда, ты кстати не прав про сложение. Там как раз оно. В описании написано про char*. а по факту - посмотри в код ТС - у него все каталоги и имена файлов - стринги :) Либа переваривает и то и то.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Если там String, то таки да, я не прав, '+' там работает. А '/' - нет.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Rumata пишет:

Тебе грамотные (реально!) люди указывают на конкретные твои ошибки...

Нет, ну здесь мы имеем типичный случай воинствующего невежества: человек искренне считает, что если лично он чего-то не знает, то и никто этого знать не может. Т.к. если бы знал, непременно сказал. Хотя бы просто из хвастовства (вот, смотрите, я это знаю!). И ему невдомек, что речь идет о совершенно элементарных познаниях начального уровня, а потому сообщать "я это знаю!" просто даже неудобно.

Ну и, как обычно, воинствующее невежество сочетается с альтернативной одаренностью: 707-й уже писал, что подходящий пример имеется даже в коде, который разместил сам ТС, только ему (ТС) об этом невдомек.

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

AndyPanda пишет:

andriano пишет:

AndyPanda пишет:

...то (барабанная дробь...) это не заработает.

Что именно это?

Вы имеете хоть малейшее представление о языке, на котором пытаетесь писать?

Или наивно полагаете, что если немного беспорядочно постучать пальцами по клавиатуре, то (барабанная дробь!) выйдет именно то, что Вам нужно?

превратили во флуд, так превратили.

File logFile = SD.open( DATA_DIR / filename1 , FILE_WRITE );

DATA_DIR, filename1 - строковые переменные

File logFile = SD.open( " DATA_DIR / filename1 " , FILE_WRITE ); - кавычки здесь (сдеся, тута как вам понятнее) превращают две переменные в набор символов и данная конструкция не заработает.

Но это пажалуй для пояснение маститому wdrakula

Реально совсем тупой. ;))

" DATA_DIR / filename1 " - ЭТО ЧТО????? ;)))))

 

Logik
Онлайн
Зарегистрирован: 05.08.2014

Дробь. Неправильная. В числителе каталог, в знаменателе файл. Чего пристали к челу?! Просто String - зло. AndyPanda, перениши все без String и будет счастье.

AndyPanda
Offline
Зарегистрирован: 20.02.2021

Logik пишет:

Дробь. Неправильная. В числителе каталог, в знаменателе файл. Чего пристали к челу?! Просто String - зло. AndyPanda, перениши все без String и будет счастье.

спасибо. но не помогло. не работает не так

void testCreateSD() {

  char* logname[] = {"LOG.CSV", "TESTDIR"};

  String testdata = ( String(id) );
  id++;

  //logname[1] = "test";
  SD.mkdir( logname[1] );
  //SD.rmdir( logname[1] );
  //SD.remove( "TESTDIR" );

  File logFile = SD.open( 'logname[1]\logname[0]' , FILE_WRITE );
  if (logFile)
  {
    logFile.println(testdata);
    logFile.close();
    Serial.print("testdata: ");
    Serial.println(testdata);
  }
  else
  {
    Serial.print( "something wrong: " );
    Serial.println( logname[0] );
    //    Serial.println(" file");
  }
}

ни так

void testCreateSD() {

  char* logname[] = {"LOG.CSV", "TESTDIR"};

  String testdata = ( String(id) );
  id++;

  //logname[1] = "test";
  SD.mkdir( logname[1] );
  //SD.rmdir( logname[1] );
  //SD.remove( "TESTDIR" );

  File logFile = SD.open( 'logname[1]/logname[0]' , FILE_WRITE );
  if (logFile)
  {
    logFile.println(testdata);
    logFile.close();
    Serial.print("testdata: ");
    Serial.println(testdata);
  }
  else
  {
    Serial.print( "something wrong: " );
    Serial.println( logname[0] );
    //    Serial.println(" file");
  }
}

Logik пишет:

В числителе каталог, в знаменателе файл.

вроде и так у меня и есть "каталог / имя файла"

без одинарных кавычек "\" на такой слеш ругается

b707
Онлайн
Зарегистрирован: 26.05.2017

Панда, про дробь был глум :)

нельзя быть таким идиотом...

вот, держи, и не благодари

String filename1 = "minutes.csv";
String DATA_DIR = "test_dir";  

File logFile = SD.open( DATA_DIR + "/" +  filename1, FILE_WRITE );

 

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

Б707! Ночь добрых дел! ;)) Ну и нафига? Это как вылечить пациента, который кормил второе поколение врачей! ;)) Над этим можно было ещё глумиться и глумиться.

b707
Онлайн
Зарегистрирован: 26.05.2017

не терплю клинических дебилов... бесят они меня :)

Пусть забирает свою строчку и проваливает.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А мне кажется, что это - жирный тролль. Ну не может человек быть настолько тупым.

 

Так что теперь делаем ставки: получит ли b707 200 рублей.

AndyPanda
Offline
Зарегистрирован: 20.02.2021

andriano пишет:

А мне кажется, что это - жирный тролль. Ну не может человек быть настолько тупым.

 

Так что теперь делаем ставки: получит ли b707 200 рублей.

на сбер могу кинуть. в принципе доковылял сам, но формально верный ответ был на час (или около того) раньше чем я справился сам.

а на счет тупых.... насколько же всё должно быть серо в ИРЛ, чтобы радоваться чужому незнанию.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

AndyPanda пишет:

в принципе доковылял сам,

Не, ну, понятное дело...

Почему-то все (если не совсем все, то подавляющее большинство) пишут, что "доковыляли сами". Причем после нескольких десятков постов, в которых с разных сторон и с разной степенью подробности указывается, что нужно сделать.

Цитата:

но формально верный ответ был на час (или около того) раньше чем я справился сам.

Совсем около того - 3 дня.

Цитата:

а на счет тупых.... насколько же всё должно быть серо в ИРЛ, чтобы радоваться чужому незнанию.

Тупой и незнающий - это совершенно разные вещи. Незнающий - не имеющий информации, а тупой - не умеющий работать с имеющейся информацией.