Arduino Uno + NEO - 6M + SD Card = Logger problem

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
ODPOWIEDZ
element
Młodszy majsterkowicz
Posty: 3
Rejestracja: 9 wrz 2018, 20:31

Arduino Uno + NEO - 6M + SD Card = Logger problem

Post autor: element » 9 wrz 2018, 20:39

Dzień dobry

Mam pewien problem, chcę stworzyć prosty tracker trasy GPS z zapisywaniem na kartę. Oto mój kod:

Kod: Zaznacz cały

#include <SoftwareSerial.h>
#include <TinyGPS.h>
#include <SPI.h>
#include <SD.h>

#define SD_CS 4
#define FILE_BASE_NAME "Trac"

TinyGPS gps;
SoftwareSerial serial(10, 11);

File myFile;

const uint8_t BASE_NAME_SIZE = sizeof(FILE_BASE_NAME) - 1;
char fileName[] = FILE_BASE_NAME "00.csv";

void setup(){
  Serial.begin(9600);
  serial.begin(9600);

  Serial.println("SD card initialization...");
  if(!SD.begin(SD_CS))
  {
    Serial.println("Failed! Check card");
    //while(1);
  }
  Serial.println("Initialization done");
  
  while (SD.exists(fileName)){
    if (fileName[BASE_NAME_SIZE + 1] != '9') 
    {
      fileName[BASE_NAME_SIZE + 1]++;
    } 
    else if (fileName[BASE_NAME_SIZE] != '9') 
    {
      fileName[BASE_NAME_SIZE + 1] = '0';
      fileName[BASE_NAME_SIZE]++;
    } 
    else{
      Serial.println("Can't create file name");
      //return;
    }
  }
  
  myFile = SD.open(fileName, FILE_WRITE);
  if (!myFile) {
    Serial.println("open failed");
    //return;
  }
  Serial.print("opened: ");
  Serial.println(fileName);
}

void loop(){
  while (serial.available())
  {
    bool c = serial.read();
    Serial.println(c);
    if (gps.encode(c))
    {
      long lat, lon;
      unsigned long fix_age;
      gps.get_position(&lat, &lon, &fix_age);
      Serial.print("Latitude:");Serial.println(lat);
      Serial.print("Longitude:");Serial.println(lon);
      myFile = SD.open(fileName, FILE_WRITE);  
      myFile.print(lat);
      myFile.print(", ");
      myFile.print(lon);
      myFile.println("");
      myFile.close();
    }
  }
}
Problem jaki występuje w tym kodzie, to w funkcji "loop", program zatrzymuje się na pętli while nawet do niej nie wchodzi. Jednak nie potrafię zrozumieć dlaczego?

Dodam też, że prostszy kod, bez zapisu na kartę SD taki jak np. ten:

Kod: Zaznacz cały

#include <SoftwareSerial.h>
#include <TinyGPS.h>
 
TinyGPS gps;
SoftwareSerial nss(10, 11);
void setup(){
  nss.begin(9600);
  Serial.begin(9600);
}
void loop()
{
  while (nss.available())
  {
    int c = nss.read();
    if (gps.encode(c))
    {
      long lat, lon;
      unsigned long fix_age;
      gps.get_position(&lat, &lon, &fix_age);
 
      Serial.print("Lat:");Serial.println(lat);
      Serial.print("Lon:");Serial.println(lon);
 
    }
  }
}
Działa, wyrzucając odpowiednią szerokość i długość, czyli wchodzimy do pętli while.

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


wchpikus
Młodszy majsterkowicz
Posty: 33
Rejestracja: 7 lut 2015, 20:59

Re: Arduino Uno + NEO - 6M + SD Card = Logger problem

Post autor: wchpikus » 9 wrz 2018, 23:30

Widocznie serial.available() zwraca 0?

Wysłane z mojego SM-G950F przy użyciu Tapatalka

element
Młodszy majsterkowicz
Posty: 3
Rejestracja: 9 wrz 2018, 20:31

Re: Arduino Uno + NEO - 6M + SD Card = Logger problem

Post autor: element » 9 wrz 2018, 23:41

Prawdopodobnie, ale dlaczego w drugim kodzie bez zapisu wszystko jest w porządku?
Gdzie jest błąd przy zapisie na kartę?

EDIT:
Można zamknąć problem rozwiązany
Bob2462
Majsterkowicz
Posty: 79
Rejestracja: 13 mar 2016, 00:11

Re: Arduino Uno + NEO - 6M + SD Card = Logger problem

Post autor: Bob2462 » 10 wrz 2018, 19:03

Jesteś pewien, że program w ogóle wchodzi do void loop() ?

Moim zdaniem zawiesza się w while (SD.exists(fileName))

Pętla ta będzie się wykonywała dopuki plik fileName będzie istniał.
Czy o takie zachowanie programu ci chodziło?
wchpikus
Młodszy majsterkowicz
Posty: 33
Rejestracja: 7 lut 2015, 20:59

Re: Arduino Uno + NEO - 6M + SD Card = Logger problem

Post autor: wchpikus » 10 wrz 2018, 19:19

Ogolnie jakoś dziwnie to piszesz;)
Rozbij funkcje po kolei co ma robic i w loop tylko je wywołuj.
Teraz to cieżko powiedzieć co ma robić;)

Wysłane z mojego SM-G950F przy użyciu Tapatalka

element
Młodszy majsterkowicz
Posty: 3
Rejestracja: 9 wrz 2018, 20:31

Re: Arduino Uno + NEO - 6M + SD Card = Logger problem

Post autor: element » 10 wrz 2018, 23:11

Bob2462 pisze:
10 wrz 2018, 19:03
Jesteś pewien, że program w ogóle wchodzi do void loop() ?

Moim zdaniem zawiesza się w while (SD.exists(fileName))

Pętla ta będzie się wykonywała dopuki plik fileName będzie istniał.
Czy o takie zachowanie programu ci chodziło?
Wchodzi, bo sprawdzałem. Dlaczego miałby się zawieszać? :) Pętla pracuje odpowiednio, wertując kartę SD i sprawdzając który plik już istnieje, kiedy już pojawi się nazwa tego nie istniejącego to go właśnie tworzy. Chodziło o prostą inkrementacje i to działa.
wchpikus pisze:
10 wrz 2018, 19:19
Ogolnie jakoś dziwnie to piszesz;)
Rozbij funkcje po kolei co ma robic i w loop tylko je wywołuj.
Teraz to cieżko powiedzieć co ma robić;)

Wysłane z mojego SM-G950F przy użyciu Tapatalka
Kod miał tylko posłużyć do tego, aby to w końcu ze sobą ruszyło, teraz dopiero mogę rozbić to sobie na funkcje co oczywiście zrobię dla przejrzystości...


A teraz, bo nie wiem czy doczytaliście, ale problem jest rozwiązany. A błąd był moją pomyłką i głupotą, że nie zobaczyłem prędzej.
Po prostu karta SD używa magistrali SPI, która na arduino ma wyprowadzenia na pinach 10-13, a ja mądrze bardzo ustawiłe SerialSoftware na piny 9,10. Wystarczyło zmienić piny na 5,6 i wszystko chodzi jak powinno.
ODPOWIEDZ

Strony partnerskie: