INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino Nano und SD Card
07.09.2016, 21:07
Beitrag #1
Arduino Nano und SD Card
Moin Moin,

ich baue an einem GPS-Locker und bekomme nur noch graue Haare. Seit Tagen versuche ich Daten auf die SD Karte zu schreiben. Es wird lediglich die Datei angelegt, aber keinerlei Daten rein geschrieben.

Mein Konstrukt:
- Arduino Nano
- SD Card (so ein Model)
- sd card hat 2GB Part. mit Fat16
- Verkabelung SDcard <-> Arduino Nano V3:
- CS -> D5
- SCK -> D13
- MOSI -> D11
- MISO -> D12
- VCC -> 5V
- GND -> GND

Alles ist verlötet und wenn ich die Standardbeispiele vom Arduino nutze, können Daten in die Datei der SD-Karte geschrieben werden. Sobald ich es in meinem Sketch probiere klappt es einfach nicht.

1. Wenn zum Beispiel die Verkabelung nicht korrekt wäre, dürfte doch auch keine Datei angelegt werden?

2. Kann es eventuell sein, dass die SD Karte eine gewisse Wartezeit benötigt?
...hatte in einem Thread gelesen dass die SDI Library dafür anfällig sein kann.

3. Pinmode
Auf einigen wenigen Seiten wurde noch der CS Port über pinmode auf OUTPUT gesetzt. st das tatsächlich notwendig oder noch ein Relikt aus frühen Zeiten?

4. Inkompatibel?
Kann es eventuell sein dass sich die sd-card-Bibliothek mir einer weiteren Biblio. beißt? Hatte zwischenzeitig schon die restlichen Bibil. deaktiviert was keine Unterschied brachte.

Hier erst mal mein verbastelter Sketch Angel:
Code:
#include <TinyGPS++.h>
#include <SoftwareSerial.h>

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

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

#include <string.h>

const int  buttonPin = 2;
const int debugmode=1;    //set debugmode 1= output to serial

// Variables will change:
int buttonPushCounter = 0;
int buttonState = 0;
int lastButtonState = 0;
int display_page=0;
int display_maxpages=3;

File myFile;

// gps
int gps_rx_pin = 4, gps_tx_pin = 3;

String dataString;
String gps_time;
int gps_hour;

// The TinyGPS++ object
TinyGPSPlus gps;
SoftwareSerial ss(gps_rx_pin, gps_tx_pin);// The serial connection to the GPS device

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

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

  // setup - ButtonInit
  pinMode(buttonPin, INPUT); // initialize the button pin as a input:
  
  // setup - Display
  lcd.begin(16,2);   // initialize the lcd for 16 chars 2 lines, turn on backlight
  lcd.backlight(); // finish with backlight on
  lcd.clear();
  
  SD.begin(5);
  myFile = SD.open("track22.txt", FILE_WRITE);
  myFile.println("#");
  myFile.println("#date;time;lat;lng;kmph;knots;course;course_deg;satellites");
  myFile.close();
  delay(1000);
}

void loop() {

  // output to serial
  if(debugmode==1){
    printInt(gps.satellites.value(), gps.satellites.isValid(), 5);
    printFloat(gps.location.lat(), gps.location.isValid(), 11, 6);
    printFloat(gps.location.lng(), gps.location.isValid(), 12, 6);
    printDateTime(gps.date, gps.time);
    printFloat(gps.course.deg(), gps.course.isValid(), 7, 2);
    printFloat(gps.speed.kmph(), gps.speed.isValid(), 6, 2);
    printInt(gps.charsProcessed(), true, 6);
    Serial.println();
  }

  //sdcard
  
   if(myFile){
       Serial.println("sdcard open");
     }else{
       Serial.println("sdcard not open");    
     }
    myFile.println("lolol");
    /*myFile.print(gps.date.value());
    myFile.print(";");
    myFile.print(gps.time.value());
    myFile.print(";");
    myFile.print(gps.location.lat());
    myFile.print(";");
    myFile.print(gps.location.lng());
    myFile.print(";");
    myFile.println(gps.satellites.value());*/
    myFile.close();

  /////
  buttonState = digitalRead(buttonPin);// read the pushbutton input pin:

  if (buttonState != lastButtonState) {
    
    if (buttonState == HIGH) {
      
      if(display_page<display_maxpages){
        buttonPushCounter++;
        display_page++;
      }else{
        display_page=0;
      }
    }
  }  
  
   switch (display_page) {
      case 1:
        // page 1 gps speed
      
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("knots: ");
        lcd.setCursor(8,0);
        lcd.print(gps.speed.knots());
        lcd.setCursor(0,1);
        lcd.print("km/h: ");
        lcd.setCursor(8,1);
        lcd.print(gps.speed.kmph());    
        
        break;
      case 2:
        // page 2 gps time
        
        gps_hour=gps.time.hour();
        gps_time="gps_hour"+gps.time.minute()+gps.time.second();
        
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("utc-time:");
        lcd.setCursor(0,1);
        lcd.print(gps.time.value());

        break;
        
        case 3:
        // page 4 position
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("lat: ");
        lcd.setCursor(6,0);
        lcd.print(gps.location.lat());
        lcd.setCursor(0,1);
        lcd.print("lng: ");
        lcd.setCursor(6,1);
        lcd.print(gps.location.lng());

        break;
      default:
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("satellites:");
        lcd.setCursor(11,0);
        lcd.print(gps.satellites.value());
        
        if (gps.satellites.value() < 1){
            lcd.setCursor(0,1);
            lcd.print("waiting for gps...");
            if(debugmode==1){ Serial.println("- waiting for gps");}
            
        }else{
            lcd.setCursor(0,1);
            lcd.print("gps OK");
        }

      break;
    }  
    
  
  
  lastButtonState = buttonState;// save the current state as the last state,
  
  if(debugmode==1){
    Serial.print("display_page: ");
    Serial.println(display_page);
  }
  
  delay(2000); // Delay a little bit to avoid bouncing  
}

////
static void smartDelay(unsigned long ms)
{
  unsigned long start = millis();
  do
  {
    while (ss.available())
      gps.encode(ss.read());
  } while (millis() - start < ms);
}

static void printFloat(float val, bool valid, int len, int prec)
{
  if (!valid)
  {
    while (len-- > 1)
      Serial.print('*');
    Serial.print(' ');
  }
  else
  {
    Serial.print(val, prec);
    int vi = abs((int)val);
    int flen = prec + (val < 0.0 ? 2 : 1); // . and -
    flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
    for (int i=flen; i<len; ++i)
      Serial.print(' ');
  }
  smartDelay(0);
}

static void printInt(unsigned long val, bool valid, int len)
{
  char sz[32] = "*****************";
  if (valid)
    sprintf(sz, "%ld", val);
  sz[len] = 0;
  for (int i=strlen(sz); i<len; ++i)
    sz[i] = ' ';
  if (len > 0)
    sz[len-1] = ' ';
  Serial.print(sz);
  smartDelay(0);
}

static void printDateTime(TinyGPSDate &d, TinyGPSTime &t)
{
  if (!d.isValid())
  {
    Serial.print(F("********** "));
  }
  else
  {
    char sz[32];
    sprintf(sz, "%02d/%02d/%02d ", d.day(), d.month(), d.year());
    Serial.print(sz);
  }
  
  if (!t.isValid())
  {
    Serial.print(F("******** "));
  }
  else
  {
    char sz[32];
    sprintf(sz, "%02d:%02d:%02d ", t.hour(), t.minute(), t.second());
    Serial.print(sz);
  }

  printInt(d.age(), d.isValid(), 5);
  smartDelay(0);
}

Vielleicht könnt ihr mir helfen. HILFE!

Gruß Mathias
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.09.2016, 23:44 (Dieser Beitrag wurde zuletzt bearbeitet: 07.09.2016 23:54 von SkobyMobil.)
Beitrag #2
RE: Arduino Nano und SD Card
Hallo,
wenn mich nicht alles täuscht, dann wird hier das File geschlossen.

myFile.close();

Wo öffnest Du es denn wieder? z.B. so:

SdDatLog = SD.open("DatLog.txt", FILE_WRITE);
if (SdDatLog)
{
Daten schreiben
}

CS mußt Du als Output deklarieren.
Gruß und Spaß
Andreas
P.S.
und dann werfe mal den ganzen Müll aus dem Sketch, z.B. delay()
Dann- mußt DU entscheiden, wann Daten auf SD geschrieben werden sollen!
NICHT- der Durchlauf Loop.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.09.2016, 19:59 (Dieser Beitrag wurde zuletzt bearbeitet: 08.09.2016 20:52 von emjott.)
Beitrag #3
RE: Arduino Nano und SD Card
Hallo Andreas,

vielen Dank für die schnelle Antwort.

Zu deiner Frage. Die SD-Karte wird einmal im Setupbereich erstellt und beschrieben. Dort wird auch " myFile = SD.open("track22.txt", FILE_WRITE);" definiert. Zwischenzeitig hatte ich das auch noch zusätzlich in der Loop definiert was nix brachte.

Code:
void setup() {

  ...
  
  SD.begin(5);
  myFile = SD.open("track22.txt", FILE_WRITE);
  myFile.println("#");
  myFile.println("#date;time;lat;lng;kmph;knots;course;course_deg;satellites");
  myFile.close();
...
}

OK, ich setze mal kurz deine Empfehlungen um ;-) und poste dann das Ergebnis.

Gruß Mathias

Hallo Andreas,

so das Problem ist dank dir gelöst. DANKE!
Den Loop mit dem Delay zu unterbrechen ist mist und führte dazu, dass die Karte nicht beschrieben wurde. Nun mache ich das mit Modulus nach jedem 10ten Durchlauf.
Es funktioniert.
DANKE!!

Hier noch der Code für jeden der sich mit dem Kram quält ;-)
Bzgl. "pinMode(5, OUTPUT);" scheint die Doku zu den Bibliotheken nicht sehr vollständig zu sein... Naja... ein bisschen Fummelei hat noch niemandem geschadet.

Übrigens muss die smartDelay Funktion auch aufgerufen werden, weil ansonsten das GPS-Signal nicht ausgelesen wird.

Code:
#include <TinyGPS++.h>
#include <SoftwareSerial.h>

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

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

#include <string.h>

const int buttonPin = 2;
const int debugmode=1;    //set debugmode 1= output to serial

// Variables will change:
int buttonPushCounter = 0;
int buttonState = 0;
int lastButtonState = 0;
int display_page=0;
int display_maxpages=3;
int loopcounter=0;
int modresult=0;

File myFile;

int gps_rx_pin = 4, gps_tx_pin = 3;

String dataString;
String gps_time;
int gps_hour;

TinyGPSPlus gps;
SoftwareSerial ss(gps_rx_pin, gps_tx_pin);// The serial connection to the GPS device

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Set the LCD I2C address

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

  pinMode(buttonPin, INPUT);

  lcd.begin(16,2);
  lcd.backlight();
  lcd.clear();
  
  pinMode(5, OUTPUT);
  SD.begin(5);
  myFile = SD.open("gpstrack.txt", FILE_WRITE);
  myFile.println("#");
  myFile.println("#date;time;lat;lng;kmph;knots;course;course_deg;satellites");
  myFile.close();
}

void loop() {

  // output to serial
  if(debugmode==1){
    Serial.println();
    Serial.print("  time=");
    Serial.print(gps.time.value());
    Serial.print("  lat=");
    Serial.print(gps.location.lat());
    Serial.print("  lng=");
    Serial.print(gps.location.lng());
    Serial.println();
    
    /*printInt(gps.satellites.value(), gps.satellites.isValid(), 5);
    printFloat(gps.location.lat(), gps.location.isValid(), 11, 6);
    printFloat(gps.location.lng(), gps.location.isValid(), 12, 6);
    printDateTime(gps.date, gps.time);
    printFloat(gps.course.deg(), gps.course.isValid(), 7, 2);
    printFloat(gps.speed.kmph(), gps.speed.isValid(), 6, 2);
    printInt(gps.charsProcessed(), true, 6);
    Serial.println();*/
  }
  
  //sdcard
  modresult=loopcounter%10;
  if(modresult==0){
    if(debugmode==1){ Serial.println("write to sdcard");}
    myFile = SD.open("gpstrack.txt", FILE_WRITE);
    myFile.print(gps.date.value());
    myFile.print(";");
    myFile.print(gps.time.value());
    myFile.print(";");
    myFile.print(gps.location.lat());
    myFile.print(";");
    myFile.print(gps.location.lng());
    myFile.print(";");
    myFile.print(gps.speed.kmph());
    myFile.print(";");
    myFile.print(gps.speed.knots());
    myFile.print(";");
    myFile.print(gps.course.value());
    myFile.print(";");
    myFile.print(gps.course.deg());
    myFile.print(";");
    myFile.println(gps.satellites.value());
    myFile.close();
  }

  /////
  buttonState = digitalRead(buttonPin);// read the pushbutton input pin:

  if (buttonState != lastButtonState) {
    lcd.clear();
    
    if (buttonState == HIGH) {
      
      if(display_page<display_maxpages){
        buttonPushCounter++;
        display_page++;
      }else{
        display_page=0;
      }
    }
  }  
  
   switch (display_page) {
      case 1:
        // page 1 gps speed
      
        //lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("knots: ");
        lcd.setCursor(8,0);
        lcd.print(gps.speed.knots());
        lcd.setCursor(0,1);
        lcd.print("km/h: ");
        lcd.setCursor(8,1);
        lcd.print(gps.speed.kmph());    
        
        break;
      case 2:
        // page 2 gps time
        
        gps_hour=gps.time.hour();
        gps_time="gps_hour"+gps.time.minute()+gps.time.second();
        Serial.println(gps_time);
        //lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("utc-time:");
        lcd.setCursor(0,1);
        lcd.print(gps.time.value());

        break;
        
        case 3:
        // page 4 position
        //lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("lat: ");
        lcd.setCursor(6,0);
        lcd.print(gps.location.lat());
        lcd.setCursor(0,1);
        lcd.print("lng: ");
        lcd.setCursor(6,1);
        lcd.print(gps.location.lng());

        break;
      default:
        lcd.clear();
        lcd.setCursor(0,0);
        lcd.print("satellites:");
        lcd.setCursor(11,0);
        lcd.print(gps.satellites.value());
        
        if (gps.satellites.value() < 1){
            lcd.setCursor(0,1);
            lcd.print("waiting for gps...");
            
        }else{
            lcd.setCursor(0,1);
            lcd.print("gps OK");
        }

      break;
    }  
  
  lastButtonState = buttonState;
  
  loopcounter++;
  
  smartDelay(0);
}

////
static void smartDelay(unsigned long ms)
{
  unsigned long start = millis();
  do
  {
    while (ss.available())
      gps.encode(ss.read());
  } while (millis() - start < ms);
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.09.2016, 12:15
Beitrag #4
RE: Arduino Nano und SD Card
Hallo,
ich hatte das Problem auch mal...seitdem handle ich das CS Signal von Hand und zwar so:
Code:
//################# Chip-Select ansteuern ###################################
void selETH() {     // waehlt den Ethernetcontroller aus
  
digitalWrite(SDselect, HIGH);
digitalWrite(ETHselect, LOW);

}
//####################################
void selSD() {      // waehlt die SD-Karte aus
  
digitalWrite(ETHselect, HIGH);
digitalWrite(SDselect, LOW);

}

//#################################
void selCLK() {      // waehlt die RTC aus bzw. sperrt Ethernet und SD-Karte
  
digitalWrite(SDselect, HIGH);
digitalWrite(ETHselect, HIGH);

}

lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Ardunio Nano als Lichtsteuerung im RC Truck RC Bastler 14 680 01.04.2018 16:39
Letzter Beitrag: RC Bastler
  welche Komponenten / Schnittstellen passen zum Arduino Nano Thorsten_S 8 573 04.03.2018 18:02
Letzter Beitrag: Tommy56
  Nano vs Micro... carsten9189 19 1.010 01.03.2018 11:22
Letzter Beitrag: carsten9189
  Arudino Nano Pegelwandler fighterii 2 302 16.02.2018 14:28
Letzter Beitrag: fighterii
  UNO und NANO: Unterschiedliches Verhalten manfred474 13 698 15.02.2018 18:25
Letzter Beitrag: georg01
  Mini-PAC mit Arduino NANO koppeln Harry 11 868 22.12.2017 12:13
Letzter Beitrag: Harry
  Box cases für arduino nano UNO etc mit ethernet buchse sepp01 8 930 22.11.2017 14:55
Letzter Beitrag: sepp01
  nano, micro oder? für LAN Shield sepp01 10 1.104 12.11.2017 11:30
Letzter Beitrag: sepp01
  Steckertyp von SD Card Shield V4.0? alpenpower 7 891 10.11.2017 10:04
Letzter Beitrag: SkobyMobil
  USB-zu-DMX-Durchleitung mit Arduino Nano AndiUno 15 1.324 29.09.2017 21:51
Letzter Beitrag: fraju

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste