Добрый день. Возникла проблема с SD картой. Использую стандартную библиотеку SD, практически все примеры из нее работают, кроме примера ReadWrite, в котором сначала что-то пишется в файл, потом файл закрывается и должен отрываться для чтения, вот тут то и проблема - открываться отказывается Т.е. вот это в коде не работает // re-open the file for reading: myFile = SD.open("test.txt"); if (myFile) { Serial.println("test.txt:"); Пробовал разные карты. Сам файл test.txt создается, проверял. Может кто сталкивался с этим? Код (Text): myFile = SD.open("test.txt", FILE_WRITE); // if the file opened okay, write to it: if (myFile) { Serial.print("Writing to test.txt..."); myFile.println("testing 1, 2, 3."); // close the file: myFile.close(); Serial.println("done."); } else { // if the file didn't open, print an error: Serial.println("error opening test.txt"); } // re-open the file for reading: myFile = SD.open("test.txt"); if (myFile) { Serial.println("test.txt:"); // read from the file until there's nothing else in it: while (myFile.available()) { Serial.write(myFile.read()); } // close the file: myFile.close(); } else { // if the file didn't open, print an error: Serial.println("error opening test.txt"); }
Да я уже все статьи перечитал, у всех все работает, а у меня никак... Файл создает, пишет в него, а затем не может открыть для чтения, вот в чем проблема.
По какой то причине, данные в файл не добавляются, а затирают предыдущую строку. Записывается только 1 последняя строчка. Использую код из примера. Код (C++): #include <SPI.h> #include <SD.h> const int chipSelect = 10; void setup() { // Open serial communications and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } Serial.print("Initializing SD card..."); // see if the card is present and can be initialized: if (!SD.begin(chipSelect)) { Serial.println("Card failed, or not present"); // don't do anything more: return; } Serial.println("card initialized."); } void loop() { // make a string for assembling the data to log: String dataString = ""; // read three sensors and append to the string: for (int analogPin = 0; analogPin < 3; analogPin++) { int sensor = analogRead(analogPin); dataString += String(sensor); if (analogPin < 2) { dataString += ","; } } // open the file. note that only one file can be open at a time, // so you have to close this one before opening another. File dataFile = SD.open("datalog.txt", FILE_WRITE); // if the file is available, write to it: if (dataFile) { dataFile.println(dataString); dataFile.close(); // print to the serial port too: Serial.println(dataString); } // if the file isn't open, pop up an error: else { Serial.println("error opening datalog.txt"); } }
Это нынче так модно - каждый проход loop открывать/закрывать файл? Что мешает открыть его в setup, а в loop просто писать туда до посинения? Да и не уверен, что это хорошая идея - каждый проход loop писать в файл показания датчиков - вы уверены, что вам каждые несколько миллисекунд (если не меньше) надо в файл писать?
Да ну? Не видел такого примера в поставке IDE. Чтобы в setup читалось - видел, такой дичи - нет. А скиньте плз название примера - мож, я чего пропустил и такая дичь реально в поставке?
SD -> Datalogger Код (C++): /* SD card datalogger This example shows how to log data from three analog sensors to an SD card using the SD library. The circuit: analog sensors on analog ins 0, 1, and 2 SD card attached to SPI bus as follows: ** MOSI - pin 11 ** MISO - pin 12 ** CLK - pin 13 ** CS - pin 4 (for MKRZero SD: SDCARD_SS_PIN) created 24 Nov 2010 modified 9 Apr 2012 by Tom Igoe This example code is in the public domain. */
Мля, в натуре дичь такая есть в примерах. Не следуйте этому примеру, он не просто плохой - он ОЧЕНЬ плохой, от слова "совсем". За такое надо по рукам бить автору примера, потому что по голове ему уже били, видимо, и просто уже жалко калеку.
Может быть и дичь, но месяца два назад она работала - добавляла данные в файл, а сейчас просто затирает.
Попробую вечером так сделать. Код (C++): #include <SPI.h> #include <SD.h> const int chipSelect = 10; File dataFile; #define LOGFILE "datalog.txt" void setup() { Serial.begin(9600); Serial.print("Initializing SD card..."); if (!SD.begin(chipSelect)) { Serial.println("Card failed, or not present"); return; } Serial.println("card initialized."); Serial.println("Opening logfile for write."); dataFile = SD.open(LOGFILE, FILE_WRITE); if (! dataFile) { Serial.println("error opening log file"); while (1) ; } } void loop() { String dataString = ""; for (int analogPin = 0; analogPin < 3; analogPin++) { int sensor = analogRead(analogPin); dataString += String(sensor); if (analogPin < 2) { dataString += ","; } } dataFile.println(dataString); dataFile.flush(); Serial.println(dataString); delay(3000); }
Опять же у Амперки в "Системе регистрации данных" (Набор IoT (Интернет вещей)) - сделано точно так же как и в Datalogger Код (C++): #include <SPI.h> #include <SD.h> #include <math.h> #define LIGHT_PIN A3 #define TEMP_PIN A2 #define CS 8 void setup() { Serial.begin(9600); if (!SD.begin(CS)) { Serial.println("initialization failed!"); return; } } void loop() { float r_light = 10.0 / (1023.0 / analogRead(LIGHT_PIN) - 1.0); float light = 10.0 * pow(14.0 / r_light, 1.6); float v_temp = 1023.0 / analogRead(TEMP_PIN) - 1.0; float temp = 1.0 / ( -log(v_temp) / 3977.0 + 1.0 / 295.0 ) - 273.0; String data = String(millis() / 1000) + ";" + String(light) + ";" + String(temp); data.replace(".", ","); Serial.println(data); File logFile = SD.open("log.csv", FILE_WRITE); logFile.println(data); logFile.close(); delay(1000); }
Вот и я о чём: так насиловать SD - хорошо ещё, что хоть как-то проработала. Не верите - ваше право, мне пофик, делайте по этому кривому примеру. Но ещё раз: так - не делается.
Нет, не точно также, там как минимум - задержка в секунду стоит. Хотя тоже кривой пример. Вот - нормально переписанный пример амперки: Код (C++): #include <SPI.h> #include <SD.h> #include <math.h> #define LIGHT_PIN A3 #define TEMP_PIN A2 #define CS 8 File logFile; void setup() { Serial.begin(9600); if (!SD.begin(CS)) { Serial.println("initialization failed!"); return; } logFile = SD.open("log.csv", FILE_WRITE); } void loop() { float r_light = 10.0 / (1023.0 / analogRead(LIGHT_PIN) - 1.0); float light = 10.0 * pow(14.0 / r_light, 1.6); float v_temp = 1023.0 / analogRead(TEMP_PIN) - 1.0; float temp = 1.0 / ( -log(v_temp) / 3977.0 + 1.0 / 295.0 ) - 273.0; String data = String(millis() / 1000) + ";" + String(light) + ";" + String(temp); data.replace(".", ","); Serial.println(data); if(logFile) { logFile.println(data); } delay(1000); } Разницу видите?
Так у меня вообще задержка более 10 минут стоит. Это сюда я выложил пример из среды чтоб быть уверенным что не я где то в коде накосячил. А почему в вашем примере нет команды на закрытие файла? В #12 посте я правильно код написал?
Так и надо - указывать СВОЙ код, а не вводить людей в заблуждение. А в том примере закрывать файл не надо - в него пишется постоянно, пока дунька крутит loop. Навскидку криминала не видно. Попробуйте просто другую SD-карточку, всегда существует вероятность, что текущую вы уже угробили.
А-а-а!!! Я её победил! Нашел в чем была причина.Никакие программные манипуляции не помогли. Оказалось что при обновлении библиотеки SD старая так и осталась в "Program Files", а вот новая прописалась в "Мои документы". Как так получилось и как они друг другу мешали - не понятно. Удалил одну из "Мои документы", перезагрузил скетч и все заработало!