• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Odczyt danych CSV z pliku na karcie SD
#1
Bug 
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:

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.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości