библиотеки 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.
для param2, param3, у которых массивы типа float, результат отображается не верный, функции преобразования в float (хххх.хххх) в массив и обратно работают некорректно, хотя с библиотекой SD все замечательно(((
ну, вот, один шаг уже сделан. Смотрите внимательнее и делайте второй. Так и научитесь.
Евгений намекает на то, чтобы вы писали массив float как массив byte (через указатели, к примеру). А читали в обратном порядке.
Евгений намекает на то, чтобы вы писали массив float как массив byte (через указатели, к примеру). А читали в обратном порядке.
ок попробую, хотя никогда не связывался.