работа с SD картой

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

Недавно начал разбираться с СД

в общем столкнулся с проблемкой - используя штатную библиотеку SD.h

не могу создать новый файл

// создание файла "iarduino.txt":
   myFile = SD.open("iarduino.txt", FILE_WRITE);  // если файла с именем "iarduino.txt" - нет, то он будет создан.

при этом если вручную его создать - то в него нормально пишется всё...

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

 

arduino328
Offline
Зарегистрирован: 01.09.2016

ЕлиТе уже целый лес тем с вопросами создали (про SD уже была тема). Неужели всё в одной теме обсудить нельзя?

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

взял SdFat.h - всно норм теперь

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

Илита, и правда - на тему СД это уже, как минимум, третья ваша тема.

По сути вопроса - поищите тему на Амперке, там недавно кто-то спрашивал именно про создание файла. На первых порах, помню - выяснилось, что человек в форуме спрашивает о создании файла "text.txt", а на самом деле пытается создавать файл с названием "text12345.txt". забывая об ограничениях на длину имени файла в FAT16. После этой у него еще какие-то проблемы всплыли, может и свой ответ найдете.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ELITE пишет:

не могу 

(Ср, 14/02/2018 - 13:49)

ELITE пишет:

 всно норм теперь

(Ср, 14/02/2018 - 14:02 )

Между вопросом и собственным решением прошло 13 минут!

Вы никогда не пробовали сначала 15 минут самому поработать, а потом уже вопрос постить, а не наоборот?

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

да както так выходит, что 1-2-3 суток не получается, но стоит создать вопрос - как всё решается само)

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

хотя чтобы не создавать тем - тут спрошу

у меня заканчиваются аппаратные ресурсы платы

при подключении библиотек для СД - они зажирают почти 50%... что очень много

//что SD.h что SdFat.h - обе очень жирные

может подскажете простую и более легкую библиотеку

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А что у Вас за плата и что за задача?

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

плата nano v3 (328p)

задача

1) - принимать ЖПС

2) - писать на СД карту трек (NMEA) 

3) - выводить на 7 сигментный экран координаты, скорость и путь 

//что выводить переклбчается кнопкой по кругу

но даже самый простейший вариант просто читать жпс и писать на карту (логер) занимает  

Скетч использует 21488 байт (69%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 1476 байт (72%) динамической памяти, оставляя 572 байт для локальных переменных. Максимум: 2048 байт.
 
#include <SD.h> //Load SD card library
#include<SPI.h> //Load SPI Library
 
#include <Adafruit_GPS.h>    //Install the adafruit GPS library
#include <SoftwareSerial.h> //Load the Software Serial library
SoftwareSerial mySerial(A2,A7); //Initialize the Software Serial port
Adafruit_GPS GPS(&mySerial); //Create the GPS Object
 
String NMEA1; //Variable for first NMEA sentence
String NMEA2; //Variable for second NMEA sentence
char c; //to read characters coming from the GPS
 
int chipSelect = A4; //chipSelect pin for the SD card Reader
File mySensorData; //Data object you will write your sesnor data to
 
 
void setup() {
  
  Serial.begin(9600); //Turn on serial monitor
  GPS.begin(9600); //Turn on GPS at 9600 baud
  GPS.sendCommand("$PGCMD,33,0*6D");  //Turn off antenna update nuisance data
  GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA); //Request RMC and GGA Sentences only
  GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); //Set update rate to 1 hz
  delay(1000); 
  
  pinMode(10, OUTPUT); //Must declare 10 an output and reserve it to keep SD card happy
  SD.begin(chipSelect); //Initialize the SD card reader
  
  if (SD.exists("NMEA.txt")) { //Delete old data files to start fresh
    SD.remove("NMEA.txt");
  }
  if (SD.exists("GPSData.txt")) { //Delete old data files to start fresh
    SD.remove("GPSData.txt");
  }
 
}
 
void loop() {
  
  readGPS();
 
  if(GPS.fix==1) { //Only save data if we have a fix
  mySensorData = SD.open("NMEA.txt", FILE_WRITE); //Open file on SD card for writing
  mySensorData.println(NMEA1); //Write first NMEA to SD card
  mySensorData.println(NMEA2); //Write Second NMEA to SD card
  mySensorData.close();  //Close the file
  mySensorData = SD.open("GPSData.txt", FILE_WRITE);
  mySensorData.print(GPS.latitude,4); //Write measured latitude to file
  mySensorData.print(GPS.lat); //Which hemisphere N or S
  mySensorData.print(",");
  mySensorData.print(GPS.longitude,4); //Write measured longitude to file
  mySensorData.print(GPS.lon); //Which Hemisphere E or W
  mySensorData.print(",");
  mySensorData.println(GPS.altitude);
  mySensorData.close();
  }
  
}
 
void readGPS() {
  
  clearGPS();
  while(!GPS.newNMEAreceived()) { //Loop until you have a good NMEA sentence
    c=GPS.read();
  }
  GPS.parse(GPS.lastNMEA()); //Parse that last good NMEA sentence
  NMEA1=GPS.lastNMEA();
  
   while(!GPS.newNMEAreceived()) { //Loop until you have a good NMEA sentence
    c=GPS.read();
  }
  GPS.parse(GPS.lastNMEA()); //Parse that last good NMEA sentence
  NMEA2=GPS.lastNMEA();
  
  Serial.println(NMEA1);
  Serial.println(NMEA2);
  Serial.println("");
  
}
 
void clearGPS() {  //Clear old and corrupt data from serial port 
  while(!GPS.newNMEAreceived()) { //Loop until you have a good NMEA sentence
    c=GPS.read();
  }
  GPS.parse(GPS.lastNMEA()); //Parse that last good NMEA sentence
  
  while(!GPS.newNMEAreceived()) { //Loop until you have a good NMEA sentence
    c=GPS.read();
  }
  GPS.parse(GPS.lastNMEA()); //Parse that last good NMEA sentence
   while(!GPS.newNMEAreceived()) { //Loop until you have a good NMEA sentence
    c=GPS.read();
  }
  GPS.parse(GPS.lastNMEA()); //Parse that last good NMEA sentence
  
}

 

при этом 80% от этого занимает писалка на СД.... :( 
 
если добавляю сюда экран LedControl.h и простейший код из десятка строк для кнопки 
то выхожу уже на:
Скетч использует 25884 байт (84%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 1761 байт (85%) динамической памяти, оставляя 287 байт для локальных переменных. Максимум: 2048 байт.
Недостаточно памяти, программа может работать нестабильно.
 
и при работе через 1-2 минуты ардуина виснет

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ELITE пишет:

плата nano v3 (328p)

задача

1) - принимать ЖПС

2) - писать на СД карту трек (NMEA) 

3) - выводить на 7 сигментный экран координаты, скорость и путь 

//что выводить переклбчается кнопкой по кругу

но даже самый простейший вариант просто читать жпс и писать на карту (логер) занимает  

Мда...

Вы знаете. я как-то для своего внука готовил картинку. там правда не "Нано", а "Мега" и задача - аквариумами управлять, но Вы просто мысленно подставьте туда ТТХ "Наны" и свою задачу. Хуже картинка от этого не станет.

Надеюсь, Вам поможет. Парню моему реально помогло. Я прям заметил, как он стал серьёзнее и перестал говорить, что ему ресурсов не хватает:

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

я прекрасно понимаю это, но это АРДУИНО - система для "домохозяек"

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

Я не прошу впихнуть невпихуемое, а всего навсего от профи по ардуине совета что и как можно сделать, дабы не использовать жирную и перегруженную функционалом стандартную библиотеку для СД карты 

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

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Учимся пользоваться гуглом: https://www.google.ru/search?q=arduino+tiny+sd+library&rlz=1C1GGRV_enRU753RU753&oq=arduino+tiny+sd&aqs=chrome.1.69i57j0l5.7493j0j7&sourceid=chrome&ie=UTF-8

Вторая ссылка в выдаче: https://github.com/greiman/Fat16

Третья ссылка в выдаче: http://www.rinkydinkelectronics.com/library.php?id=37

Дальше за вас поискать, или таки сделаете над собой усилие?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ELITE пишет:

профи на ассемблере.....

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

ELITE пишет:

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

Боюсь, что нет. Библиотеки я использую для первого включения устройства и запуска на нём "Hello World" и не более того. Для этого ресурсов всегда хватает. В "мало-мальские разработки" я стараюсь никаких библиотек не пихать, а пишу руками на, как Вы изволили выразиться, "стандартном ардуиновском компиляторе".

Так что никаких особых библиотек я не знаю, к сожалению. Мож кто другой чего посоветует.

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

ELITE. правильно ли я понял - что у вас семисегментник и еще ЛЕД-дисплей? А одним экраном обойтись нельзя?

Вообще семисегментные индикаторы - крайне хлопотная периферия. Как ни подключи - все варианты "так себе". Либо динамическая индикация, которая нагружает процессор, либо куча ног занята, либо сдвиговые регистры...

 

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

b707 пишет:

ELITE. правильно ли я понял - что у вас семисегментник и еще ЛЕД-дисплей? А одним экраном обойтись нельзя?

Вообще семисегментные индикаторы - крайне хлопотная периферия. Как ни подключи - все варианты "так себе". Либо динамическая индикация, которая нагружает процессор, либо куча ног занята, либо сдвиговые регистры...

 

пока только 7ми сигментный на регистре 7221 - проблем вообще не вызывает, работает стабильно и ничего не тормозит и ресурсов не жрет - библиотека легкая и простая. да их 2 стоит, но будет 3

также хочуОЛЕД дисплей еще поставить для вывода прочей информации, не требующей больших и ярких цифр - но на него ресурсов совсем не останется, хотя он по коду и нагрузке тоже весьма экономичен

динамичность вывода данных не высокая - 5к/с меня устраивает - по таймеру вывожу всё разом

----------

по СД пл ночи гуглил и пробовал - из десятка библиотек только PetitFS легкая, все остальные требует 50-70% ресурсов только на себя.... :(

но с PetitFS никак не видит флешку....

ELITE
ELITE аватар
Offline
Зарегистрирован: 11.01.2018

нашел вроде что надо но оно под визуал студио сделано

https://github.com/alemorf/VinxFS

вроде как должно очень мало весить и иметь нужный функционал

кто может помочь адаптировать под ардуино (елси не струдно - то с примером работы)

пол дня никак не получается ничего :(