Kombinuje z oprogramowaniem do odczytu danych z plku CSV na karcie SD i zapisaniem ich w tablicy do dalszego uzycia i mam problem bowiem nie udalo mi sie uzyskac tablicy wartosci odczytanych z pliku na karcie tylko pierwsza liczbe z listy.
Kod wyglada nastepujaco:
W kodzie wystepuja opisane funkcje ktore maja za zadanie:
-policzyc dlugosc rekordu w pliku na karcie
-policzyc ilosc przecinkow oddzielajacych poszczegolne wartosci liczbowe (+1)
-odczytac i przetworzyc na liczby wartosci liczbowe z pliku CSV i zapisac do tablicy freq[]
-przekazac wartosci liczbowe do modulu generatora do wygenerowania i wyswietlic informacje dla uzytkownika na LCD 16x2
Jedyna nie dzialajaca poprawnie funkcja jest ta ktora ma odczytac i przetworzyc dane z pliku i zapisac je do tablicy w RAM skad beda pobierane przez nastepna funkcje do wygenerowania czestotliwosci z listy.
Jest tam blad ktorego nie jestem w stanie zlokalizowac (jestem za slaby w pisaniu programow), ktory powoduje ze funkcja "wykonaj" odczytuje poprawnie tylko pierwsza liczbe a dalej same zera.
Prosze o pomoc czy ktos moglby mi pomoc znalezc i poprawic blad?
Wykomentowane linie to moje nieudane proby modyfikacji kodu aby uzyskac oczekiwany wynik.
Kod wyglada nastepujaco:
Kod:
#include <DDS.h>
// Instantiate the DDS...
DDS dds(5, 4, 3, 2);
//include LCD library
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
// include the SD library:
#include <SPI.h>
#include <SD.h>
// set up variables using the SD utility library functions:
Sd2Card card;
//SdVolume volume;
//SdFile root;
const int chipSelect = 10;
unsigned long freq[100];
//inicjalizacja wyswietlacza
LiquidCrystal_I2C lcd(0x3F,16,2);
int ledpin = 13;
int ile;
int index;
//------
// funkcja okreslajaca dlugosc rekordu
size_t readField(File* file, char* str, size_t size, char* delim) {
char ch;
size_t n = 0;
while ((n + 1) < size && file->read(&ch, 1) == 1) {
// Delete CR.
if (ch == '\r') {
continue;
}
str[n++] = ch;
if (strchr(delim, ch)) {
break;
}
}
str[n] = '\0';
return n;
}
//---------
//funkcja odczytu liczby czestotliwosci w pliku z karty SD
int ilefreq(char Name[10])
{
int n=0;
card.init(SPI_HALF_SPEED, 10);
File Preset;
SD.begin(10);
Preset = SD.open(Name,FILE_READ);
while (Preset.available()) //wykonuj pętlę dopókiwszystkie dane
{ //nie zostaną zczytane
if (Preset.read() == ',')
{
n += 1;
}
}
Preset.close();
return n + 1;
}
//----------------------------------------------
//funkcja odczytu pliku z karty SD
unsigned long odczytpliku(char Name[10])
{
// long array = [ile]{};
card.init(SPI_HALF_SPEED, 10);
SD.begin(10);
File Preset;
Preset = SD.open(Name,FILE_READ);
// Serial.println(Name); // dla kontroli
lcd.print(Name);
// replacement instead of printing
//unsigned long freq[43];
int index = 0;
char str[10];
char *delims = ",";
// size_t len = readField(Name, str, fileSize, delims);
size_t len = readField(&Preset, str, sizeof(str), ",\n");
if(len > 0)
{
freq[index++] = strtoul(str, NULL, 10);
}
// while (Preset.available())
// {
//lcd.write(Preset.read()); //wypisz zawartość pliku
// delay(500);
// freq = long(Preset.read());
// Serial.print(freq);
//delay(500);
//lcd.write(freq);
//delay(1000);
//lcd.clear();
// unsigned long freq[Preset.read()];
//freq = parseInt(Preset.read()[10]);
// }
Preset.close();
return freq[ile];
}
/* while (Preset.available()) //wykonuj pętlę dopókiwszystkie dane
{ //nie zostaną zczytane
lcd.write(Preset.read()); //wypisz zawartość pliku
delay(500);
}
while (Preset.available()) //wykonuj pętlę dopókiwszystkie dane
{ //nie zostaną zczytane
unsigned long freq[Preset.read()];
}
*/
// Preset.close();
//}
//-------------------------------------------
//funkcja generowania presetow
void wykonaj(char Name[10], int ile, unsigned long freq[])
{
for (int i=0; i<ile; i++)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(Name);
lcd.print(" ");
lcd.print(ile-i);
digitalWrite(ledpin, HIGH);
dds.setFrequency(freq[i]);
lcd.setCursor(0, 1);
lcd.print(freq[i]);
lcd.print(" Hz");
delay(180000);
if (i == ile);
{
digitalWrite(ledpin, LOW);
dds.init();
lcd.clear();
lcd.print("Koniec");
}
}
}
//-------
void setup()
{
//inicjalizacja wyswietlacza LCD
LiquidCrystal_I2C lcd(0x3F,16,2);
Wire.begin();
lcd.begin();
lcd.backlight();
//Serial.begin(9600);
// Open serial communications and wait for port to open:
/*
*/
ile = ilefreq("Tinitus");
// delay(5000);
lcd.clear();
lcd.print(ile);
delay(5000);
lcd.clear();
freq[ile] = {odczytpliku("Tinitus")};
lcd.clear();
lcd.write(freq[1]);
delay(5000);
wykonaj("Tinitus", ile, freq);
}
void loop(void) {
}
W kodzie wystepuja opisane funkcje ktore maja za zadanie:
-policzyc dlugosc rekordu w pliku na karcie
-policzyc ilosc przecinkow oddzielajacych poszczegolne wartosci liczbowe (+1)
-odczytac i przetworzyc na liczby wartosci liczbowe z pliku CSV i zapisac do tablicy freq[]
-przekazac wartosci liczbowe do modulu generatora do wygenerowania i wyswietlic informacje dla uzytkownika na LCD 16x2
Jedyna nie dzialajaca poprawnie funkcja jest ta ktora ma odczytac i przetworzyc dane z pliku i zapisac je do tablicy w RAM skad beda pobierane przez nastepna funkcje do wygenerowania czestotliwosci z listy.
Jest tam blad ktorego nie jestem w stanie zlokalizowac (jestem za slaby w pisaniu programow), ktory powoduje ze funkcja "wykonaj" odczytuje poprawnie tylko pierwsza liczbe a dalej same zera.
Prosze o pomoc czy ktos moglby mi pomoc znalezc i poprawic blad?
Wykomentowane linie to moje nieudane proby modyfikacji kodu aby uzyskac oczekiwany wynik.
Poczatki zawsze sa trudne :-)
Arduino Mega256, Nano, Pro Mini.
Arduino Mega256, Nano, Pro Mini.