SD_h как записать фаил в создаваемую папку
- Войдите на сайт для отправки комментариев
Здравствуйте! Возникла идея вести логи полученных с датчиков значений и упорядочивать из в папках средствами ардуино. идея в следующем: 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
чтобы люди не играли в Настрадамусов и Ванг вот код.
-----------------------
З.Ы. да, я понимаю что это быдлокод и всё там через подвыподверт, но пока так. причесывать буду потом и разносить по разным вкладкам. З.Ы.Ы как оформить код раскрывающимся катом - не знаю. и да, я надёргал куски кода из примеров и создавал под них отдельные функции. Поэтому такая каша.
И Вам не хворать.
Научитесь правильно вставлять.... хотя-бы программу. Очень сложно говорить о строках, когда у них нет нумера.
да, не сразу разобрался, как это делать. строка 411
исправил. спасибо. в первом сообщении внести исправления не могу.
по существу вопроса есть что нибудь?
http://arduino.ru/forum/programmirovanie/ne-smog-naiti-opisaniemanual-po-biblioteke-sd-pomogite#comment-300168
сообщение 4) В примерах создают файл в корне карты. А как создать файл в подкаталоге?
сообщение 8) в мануале написано так: "directory/filename.txt"
предпологаестя создать директорию и в ней фаил и в него записать значения.
AndyPanda - начните с того, что выкиньте из кода все, что не относится к Sdкарте - OLED дисплей, RTC, датчики температуры. Оставьте коротенький код, в котором все, что вы будете делать - создавать каталоги на карточке и писать туда файлы.
80% за то, что на таком коротком коде вы сами найдете ошибку. А не найдете - приносите этот код сюда, посмотрим все вместе
Если что - это вовсе не глум, свои программы отлаживаю именно так.
AndyPanda - начните с того, что выкиньте из кода все, что не относится к Sdкарте
Слона надо кушать по частям.
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(); //день } // функция вывода часов - закончилась -----------------------------------------------Про строку 186 Вам уже писали в #3. В этой строке у вас написана бредятина. С точки зрения компилятора С++, конструкция
DATA_DIR / filename1
означает поделить значение переменной DATA_DIR на значение переменной filename1. Компилятор не в курсе, как выполнять деление для строк - о чем вам и сообщает ошибкой
А готовый код новичкам тут давать не принято. Либо додумайте сами по наводящим вопросам, либо ищите счастья где-то еще.
Вот, спрашивается, какой смысл отвечать на вопросы, если ТС все равно не читает ответы?
и попросил кусок рабочего кода
Вот, спрашивается, какой смысл отвечать на вопросы, если ТС все равно не читает ответы?
ТС читает ответы. и понимает, что вопрос о бестактности закапывается легко вот этим сообщением http://arduino.ru/forum/programmirovanie/2-datchika-dht22-i-odna-funktsi...
так же, ТС изучил вот этот коммент http://arduino.ru/forum/programmirovanie/ne-smog-naiti-opisaniemanual-po...
и не нашел там функции: "зайти в папку и проводить все операции находясь в ней".
в общим по итогу, вывод напрашивается следующий: отвечающие не понимают что ответить, но показать свою маститость (на олдскульность и знания увы не тянете) пальцы чешутся.
вопрос можно закрывать. в ру сегменте подобных примеров нет. модератор, сноси тему нечего засорять маститый форум.
А зачем именно в "ру сегменте", если есть среди стандартных примеров к стандартной библиотеке SD?
Тут как бы обсуждать нечего, поэтому и примеров нет.
Реально наркоман какой-то! ;))
Родное сердце! Ты разницу между а/в и "а/в" понимаешь??? Кавычек вокруг "папка/файл" у тебя нет!
Мля, ты реально тупой? Или на препаратах?
вопрос можно закрывать. в ру сегменте подобных примеров нет. модератор, сноси тему нечего засорять маститый форум.
ну закрывать так закрывать, ты думаешь мы тебя уговаривать будем? :)
как жаль, что я это давно попробовал и это не работает.
кстати, там кто-то говорил, про компилятор. так вот, конструкция в кавычках - это строка (или набор символов, я то в этом не силен в отличии от маститых ).
соответственно, если директория записывается в переменную и имя файла записывается в переменную, то (барабанная дробь...) это не заработает.
...то (барабанная дробь...) это не заработает.
Вы имеете хоть малейшее представление о языке, на котором пытаетесь писать?
Или наивно полагаете, что если немного беспорядочно постучать пальцами по клавиатуре, то (барабанная дробь!) выйдет именно то, что Вам нужно?
вопрос можно закрывать. в ру сегменте подобных примеров нет. модератор, сноси тему нечего засорять маститый форум.
ну закрывать так закрывать, ты думаешь мы тебя уговаривать будем? :)
меня уговаривать не надо. я сделаю попроще. или посмотрю, как это реализовано при компиляции FLProg.
а вы так и останетесь тут с осознанием собственной важности, но без знаний и примеров.
...то (барабанная дробь...) это не заработает.
Вы имеете хоть малейшее представление о языке, на котором пытаетесь писать?
Или наивно полагаете, что если немного беспорядочно постучать пальцами по клавиатуре, то (барабанная дробь!) выйдет именно то, что Вам нужно?
превратили во флуд, так превратили.
File logFile = SD.open( DATA_DIR / filename1 , FILE_WRITE );
DATA_DIR, filename1 - строковые переменные
File logFile = SD.open( " DATA_DIR / filename1 " , FILE_WRITE ); - кавычки здесь (сдеся, тута как вам понятнее) превращают две переменные в набор символов и данная конструкция не заработает.
Но это пажалуй для пояснение маститому wdrakula
File logFile = SD.open( " DATA_DIR / filename1 " , FILE_WRITE ); - кавычки здесь (сдеся, тута как вам понятнее) превращают две переменные в набор символов и данная конструкция не заработает.
реально тупой :)
Сколько платишь, чтоб я тебе прям в этой строчке расставил кавычки правильно?
А зачем именно в "ру сегменте", если есть среди стандартных примеров к стандартной библиотеке SD?
Тут как бы обсуждать нечего, поэтому и примеров нет.
ну так, ради проформы, где здесь пример записи файлов внутри папки?
Examples
на ListFiles пожалуйста указывать там работа только с чтением
ну так, ради проформы, где здесь пример записи файлов внутри папки?
а зачем он нужен?
Там в описании есть строчка
"The file names passed to the SD library functions can include paths separated by forward-slashes, /, e.g. "directory/filename.txt"."
- которой более чем достаточно, чтоб понять, как писать файлы не текущую, а во вложенные директории
Тут как бы обсуждать нечего, поэтому и примеров нет.
AndyPanda - очевидно, что причина всего этого цирка с конями - вы не знаете элементарнейших операций на Си, таких как сложение, умножение, деление... Потому и помощь вам не в кассу и примеры не помогают.
Примеры в описании библиотеки не рассччитаны на уровень детского сада. Если где-то обьяснено, что функция принимает, например, число 2 - никто не станет давать отдельных примеров на число 3 или 44 :)))
За то время, что вы тут канючите и обижаетесь - нормальный человек давно бы уже нашел и прочитал операции со строками.
Адьос
если у тебя строки в переменных, то вот так Var1+Var2 они не складываюся, внезапно.
File logFile = SD.open( " DATA_DIR / filename1 " , FILE_WRITE ); - кавычки здесь (сдеся, тута как вам понятнее) превращают две переменные в набор символов и данная конструкция не заработает.
реально тупой :)
Сколько платишь, чтоб я тебе прям в этой строчке расставил кавычки правильно?
рублей 200. если это заработает с переменными
на ListFiles пожалуйста указывать там работа только с чтением
если у тебя строки в переменных, то вот так Var1+Var2 они не складываюся, внезапно.
мимо. я не пытаюсь делать математические операции со строковыми переменными
А что Вы пытаетесь?
на ListFiles пожалуйста указывать там работа только с чтением
если нечего сказать, то докопайся до грамАтности.
если из примеров ничего не подходит, но надо хоть как-то защитить свои слова: "если есть среди стандартных примеров к стандартной библиотеке SD" - переходи да близкие темы(итераций может быть много), может там оппонент не разбирается. надежда умирает последней не так ли?
А что Вы пытаетесь?
вон там, повыше, ушедший с гордо поднятой головой 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 *
"
но с примерами что плохо, возможно и я там чего-то не вижу, собственно поэтому и написал сюда.
ладно, налайкивайте тут друг другу и дальше, маститые. Про то как я тут канючил и обижался почаще себе повторяйте.
AndyPanda - вы реально таки думаете, что хоть кто-то из разговаривающих с вами не знает ответа? :)))
ну так что, платите за решение? Или болтовня одна?
Иначе, я вижу, эта тема будет вечной. Поскольку сами вы ни на что не способны.
Еще что забавно - пример как сделать путь к каталогу - у вас ДАЖЕ ЕСТЬ В ВАШЕМ СКЕТЧЕ!!! А раз вы все равно тупите - похоже этот код вы списали от первойдо последней буквы и понимаете в нем не больше, чем неграмотный в японских иероглифах
если нечего сказать, то докопайся до грамАтности.
Зашел ты не очень
Тебе грамотные (реально!) люди указывают на конкретные твои ошибки в базовых операциях со встроенными типами. Все остальные проблемы вторичны. Идея "кодирования" микроконтроллеров путем сбора кусочков чужого говнокода примеров изначально обречена на провал, если ты не в состоянии ПОНЯТЬ, что ты используешь.
Это твой путь, но без усвоения букваря ты Набокова обратно на английский не переведешь
Да ты, батенька, верно, феерический кретин, я угадал?
никаких сомнений. Ему не просто подсказали - его считай подвели к решению. Стоит, смотрит в упор, спрашивает "Где?"
С такого даже стыдно денег брать.
Деда, ты кстати не прав про сложение. Там как раз оно. В описании написано про char*. а по факту - посмотри в код ТС - у него все каталоги и имена файлов - стринги :) Либа переваривает и то и то.
Если там String, то таки да, я не прав, '+' там работает. А '/' - нет.
Тебе грамотные (реально!) люди указывают на конкретные твои ошибки...
Ну и, как обычно, воинствующее невежество сочетается с альтернативной одаренностью: 707-й уже писал, что подходящий пример имеется даже в коде, который разместил сам ТС, только ему (ТС) об этом невдомек.
...то (барабанная дробь...) это не заработает.
Вы имеете хоть малейшее представление о языке, на котором пытаетесь писать?
Или наивно полагаете, что если немного беспорядочно постучать пальцами по клавиатуре, то (барабанная дробь!) выйдет именно то, что Вам нужно?
превратили во флуд, так превратили.
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 " - ЭТО ЧТО????? ;)))))
Дробь. Неправильная. В числителе каталог, в знаменателе файл. Чего пристали к челу?! Просто String - зло. AndyPanda, перениши все без String и будет счастье.
Дробь. Неправильная. В числителе каталог, в знаменателе файл. Чего пристали к челу?! Просто 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"); } }В числителе каталог, в знаменателе файл.
вроде и так у меня и есть "каталог / имя файла"
без одинарных кавычек "\" на такой слеш ругается
Панда, про дробь был глум :)
нельзя быть таким идиотом...
вот, держи, и не благодари
Б707! Ночь добрых дел! ;)) Ну и нафига? Это как вылечить пациента, который кормил второе поколение врачей! ;)) Над этим можно было ещё глумиться и глумиться.
не терплю клинических дебилов... бесят они меня :)
Пусть забирает свою строчку и проваливает.
А мне кажется, что это - жирный тролль. Ну не может человек быть настолько тупым.
Так что теперь делаем ставки: получит ли b707 200 рублей.
А мне кажется, что это - жирный тролль. Ну не может человек быть настолько тупым.
Так что теперь делаем ставки: получит ли b707 200 рублей.
на сбер могу кинуть. в принципе доковылял сам, но формально верный ответ был на час (или около того) раньше чем я справился сам.
а на счет тупых.... насколько же всё должно быть серо в ИРЛ, чтобы радоваться чужому незнанию.
в принципе доковылял сам,
Не, ну, понятное дело...
Почему-то все (если не совсем все, то подавляющее большинство) пишут, что "доковыляли сами". Причем после нескольких десятков постов, в которых с разных сторон и с разной степенью подробности указывается, что нужно сделать.
но формально верный ответ был на час (или около того) раньше чем я справился сам.
Совсем около того - 3 дня.
а на счет тупых.... насколько же всё должно быть серо в ИРЛ, чтобы радоваться чужому незнанию.
Тупой и незнающий - это совершенно разные вещи. Незнающий - не имеющий информации, а тупой - не умеющий работать с имеющейся информацией.