библиотеки SD и SDfat
- Войдите на сайт для отправки комментариев
Доброго времени суток, уважаемые форумчане!
Возникла такая проблемка у новичка, прошу меня не пинать, а немножко помочь или подтолкнуть в нужную сторону)))
Написал скетч с использованием библиотеки SD, идея взята с форума. Но не учел, что основной скетч у меня заточен под библиотеку SDfat, там же подключена библиотека UTFT_SdRaw (для загрузки картинок интерфейса в формате *.raw с карты памяти), соответственно поменять на библиотеку SD не могу.
SD и SDfat между собой не дружат.
Пытался скетч переделать под библиотеку SDfat но не осилил(((
Идея такова, параметры заданы в массивах, их надо записать на карту памяти в файлы конфигурации (при изменении в интрефейсе будут перзаписываться), при включении ардуинки будут считываться с карты.
Как подружить пример-скетч с SDfat?
#include <SPI.h>
#include <SD.h>
#include <UTFT.h>
// создаём объект класса UTFT
// и передаём идентификатор модели дисплея и номера управляющих пинов
UTFT myGLCD(17, 38, 39, 40, 41);
// объявления встроенного шрифта
extern uint8_t BigFont[];
#define PARAMS1_NUMBER 8 //Количество параметров подменю 1
#define PARAMS2_NUMBER 3 //Количество параметров подменю 2
#define PARAMS3_NUMBER 14 //Количество параметров подменю 3
byte param1[PARAMS1_NUMBER]={0,0,0,0,20,1,5,10};
double param2[PARAMS2_NUMBER]={0,22.5,34.9};
double param3[PARAMS3_NUMBER]={0,36.6,0,0,0,0,0,0,0,0,0,0,0,0};
File MyFile;
void setup() {
// инициализируем дисплей
myGLCD.InitLCD();
// очищаем экран
myGLCD.clrScr();
// выбираем тип шрифта
myGLCD.setFont(BigFont);
Serial.begin(9600);
while (!Serial);
if (!SD.begin(53)) {
Serial.println("initialization failed!");
return;
}
SaveConfig();
LoadConfig();
}
void loop() {
}
//преобразует float (хххх.хххх) в массив из 9 байт, где последний байт 1, если число отрицательное
//и записывает его в открытый для ззаписи переданный файл
void writeFloat2File(File File2Write, float Value) {
byte j;
byte Data[9];
float div=1000;
float tmp;
Data[8]=0;
if (Value<0) {
Data[8]=1;
Value*=-1.0;
}
for (j=0;j<4;j++) {
tmp=Value/div;
Data[j]=0;
if (tmp>1) {
Data[j]=(byte)(tmp);
Value-=(int)tmp*div;
}
div/=10;
}
Value*=10000;
div=1000;
for (j=4;j<8;j++) {
tmp=Value/div;
Data[j]=0;
if (tmp>1) {
Data[j]=(byte)(tmp);
Value-=(int)tmp*div;
}
div/=10;
}
File2Write.write(Data,9);
}
//читаем массив байт из файла и делает обратное преобразование следующего действия
//преобразует float (хххх.хххх) в массив из 9 байт, где последний байт 1, если число отрицательное
float readFloat4mFile(File File2Read) {
byte j;
byte tmp;
float div=1000.0;
float Ret=0;
for (j=0;j<8;j++) {
tmp=File2Read.read();
Ret+=tmp*div;
div/=10;
}
tmp=File2Read.read();
if (tmp==1) Ret*=-1;
return Ret;
}
void SaveConfig() {
// int tmp=1;
byte j;
if (SD.exists("param1.ini")) {
SD.remove("param1.ini");
}
MyFile = SD.open("param1.ini", FILE_WRITE);
if (MyFile) {
for (j=0;j<8;j++) {
writeFloat2File(MyFile, param1[j]);
}
MyFile.close();
}
if (SD.exists("param2.ini")) {
SD.remove("param2.ini");
}
MyFile = SD.open("param2.ini", FILE_WRITE);
if (MyFile) {
for (j=0;j<3;j++) {
writeFloat2File(MyFile, param2[j]);
}
MyFile.close();
}
if (SD.exists("param3.ini")) {
SD.remove("param3.ini");
}
MyFile = SD.open("param3.ini", FILE_WRITE);
if (MyFile) {
for (j=0;j<14;j++) {
writeFloat2File(MyFile, param3[j]);
}
MyFile.close();
}
}
void LoadConfig() {
byte j;
if (SD.exists("param1.ini")) {
MyFile = SD.open("param1.ini", FILE_READ);
for (j=0;j<8;j++) {
param1[j]=readFloat4mFile(MyFile);
Serial.print(param1[j]);
Serial.print("\t");
myGLCD.print(String(param1[j]), LEFT, 0+(j*20));
}
MyFile.close();
}
if (SD.exists("param2.ini")) {
MyFile = SD.open("param2.ini", FILE_READ);
for (j=0;j<3;j++) {
param2[j]=readFloat4mFile(MyFile);
Serial.print(param2[j]);
Serial.print("\t");
myGLCD.print(String(param2[j]), CENTER, 0+(j*20));
}
MyFile.close();
}
if (SD.exists("param3.ini")) {
MyFile = SD.open("param3.ini", FILE_READ);
for (j=0;j<14;j++) {
param3[j]=readFloat4mFile(MyFile);
Serial.print(param3[j]);
Serial.print("\t");
myGLCD.print(String(param3[j]), RIGHT, 0+(j*20));
}
MyFile.close();
}
}
Заранее благодарен!
"Отрицательный результат, тоже реузльтат" (с)
Свои не помогли, пойдем к буржуям.
Потом расскажите что у них и как. А то, может, действительно мы тут как сволочи последние сидим...
Потом расскажите что у них и как. А то, может, действительно мы тут как сволочи последние сидим...
Я ни кого не оскорблял. Извините, если что то не так.
Так про оскорбления тут ни слова. Просто интересно - будут ли буржуи переписывать чужой скетч.
А местным гуру лень или не интересно? Хотя бы подтолкнуть в нужном направлении.
Третий день гугл облазил, толкового ничего не нашел(((
Местные гуру картоху сажают и огуречные фермы автоматизируют, так что невовремя вы их спрашивать пришли.
А местным гуру лень или не интересно? Хотя бы подтолкнуть в нужном направлении.
Третий день гугл облазил, толкового ничего не нашел(((
В этом случае не гугль рыть надо -вы там ничего не найдете, ибо не так часто люди переписывают программу с одной похожей либы на другую, а еще меньше отчитываются об этом в инетах.
Тут надо просто открыть файлы и примеры к двум библиотекам и сравнить имена функций и параметры вызова. Я мельком глянут SD и SDfat - они очень похожи, синтаксис иннициализации - одинаковый. открытие файла. чтение из него - все , как мне кажется, совпадает чуть ли не до байта. Реально, чтобы запустить ваш скетч на либе SDfat, походе, надо поправить пару-тройку строк...
Тут надо просто открыть файлы и примеры к двум библиотекам и сравнить имена функций и параметры вызова. Я мельком глянут SD и SDfat - они очень похожи, синтаксис иннициализации - одинаковый. открытие файла. чтение из него - все , как мне кажется, совпадает чуть ли не до байта. Реально, чтобы запустить ваш скетч на либе SDfat, походе, надо поправить пару-тройку строк...
Сравнил библиотеки, подправил, на экране дисплея вывелся верный результат для param1 котороый у меня
является массивом типа byte.
void SaveConfig() { byte j; if (SD.exists("param1.ini")) { SD.remove("param1.ini"); } myFile = SD.open("param1.ini", FILE_WRITE); if (myFile) { for (j=0;j<8;j++) { //writeFloat2File(myFile, param1[j]); myFile.write(param1[j]); } myFile.close(); }для param2, param3, у которых массивы типа float, результат отображается не верный, функции преобразования в float (хххх.хххх) в массив и обратно работают некорректно, хотя с библиотекой SD все замечательно(((
ну, вот, один шаг уже сделан. Смотрите внимательнее и делайте второй. Так и научитесь.
Евгений намекает на то, чтобы вы писали массив float как массив byte (через указатели, к примеру). А читали в обратном порядке.
Евгений намекает на то, чтобы вы писали массив float как массив byte (через указатели, к примеру). А читали в обратном порядке.
ок попробую, хотя никогда не связывался.