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
  Welcher Quarz ist auf dem Arduino Nano/Mini etc BennIY 9 498 30.01.2017 21:59
Letzter Beitrag: hotsystems
  Gemeinsame Spannungsversorgung für Arduino Nano und WS2812b and1 11 625 09.12.2016 17:38
Letzter Beitrag: georg01
  Ardunio Nano 3,3V Mathias 5 448 24.11.2016 22:38
Letzter Beitrag: Tommy56
  Arduino NANO mit zwei 1.8 SPI-tfts Thandor 2 289 15.11.2016 23:18
Letzter Beitrag: Thandor
  Arduino Nano - VIN Mathias 16 1.331 22.09.2016 21:39
Letzter Beitrag: ardu_arne
  SD Card und Stromversorgung/USB Anschluss ARTUSWINGUS 20 1.381 10.07.2016 10:43
Letzter Beitrag: ARTUSWINGUS
  Arduino Nano. Externe Stromversorgung reimundko 1 1.263 26.06.2016 13:44
Letzter Beitrag: hotsystems
  Arduino Nano - RGB LED Controller MasT3r-A 13 1.194 29.04.2016 11:43
Letzter Beitrag: hotsystems
Photo 2 RC-Kanäle am Arduino Nano Clone do1xxy 1 586 04.04.2016 21:10
Letzter Beitrag: hotsystems
  Arduino Nano + Funkmodul nRF24L01+ luxusl 1 1.390 26.02.2016 17:05
Letzter Beitrag: arduinopeter

Gehe zu:


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