библиотеки SD и SDfat

Stoun
Offline
Зарегистрирован: 28.06.2017

Доброго времени суток, уважаемые форумчане!

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

Написал скетч с использованием библиотеки 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();
    }
}

Заранее благодарен!

Stoun
Offline
Зарегистрирован: 28.06.2017

"Отрицательный результат, тоже реузльтат" (с)

Свои не помогли, пойдем к буржуям.

sadman41
Offline
Зарегистрирован: 19.10.2016

Потом расскажите что у них и как. А то, может, действительно мы тут как сволочи последние сидим...

Stoun
Offline
Зарегистрирован: 28.06.2017

sadman41 пишет:

Потом расскажите что у них и как. А то, может, действительно мы тут как сволочи последние сидим...

Я ни кого не оскорблял. Извините, если что то не так.

sadman41
Offline
Зарегистрирован: 19.10.2016

Так про оскорбления тут ни слова. Просто интересно - будут ли буржуи переписывать чужой скетч.

Stoun
Offline
Зарегистрирован: 28.06.2017

А местным гуру лень или не интересно? Хотя бы подтолкнуть в нужном направлении.

Третий день гугл облазил, толкового ничего не нашел(((

sadman41
Offline
Зарегистрирован: 19.10.2016

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

b707
Offline
Зарегистрирован: 26.05.2017

Stoun пишет:

А местным гуру лень или не интересно? Хотя бы подтолкнуть в нужном направлении.

Третий день гугл облазил, толкового ничего не нашел(((

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

Тут надо просто открыть файлы и примеры к двум библиотекам и сравнить имена функций и параметры вызова. Я мельком глянут SD  и SDfat - они очень похожи, синтаксис иннициализации - одинаковый. открытие файла. чтение из него - все , как мне кажется, совпадает чуть ли не до байта. Реально, чтобы запустить ваш скетч на либе SDfat, походе, надо поправить пару-тройку строк...

Stoun
Offline
Зарегистрирован: 28.06.2017

b707 пишет:

Тут надо просто открыть файлы и примеры к двум библиотекам и сравнить имена функций и параметры вызова. Я мельком глянут 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 все замечательно(((

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

ну, вот, один шаг уже сделан. Смотрите внимательнее и делайте второй. Так и научитесь.

sadman41
Offline
Зарегистрирован: 19.10.2016

Евгений намекает на то, чтобы вы писали массив float как массив byte (через указатели, к примеру). А читали в обратном порядке.

Stoun
Offline
Зарегистрирован: 28.06.2017

sadman41 пишет:

Евгений намекает на то, чтобы вы писали массив float как массив byte (через указатели, к примеру). А читали в обратном порядке.

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