Go Down

Topic: Messdaten auf SD speichern (Read 238 times) previous topic - next topic

Hanswurst123

Hallo allerseits,

ich befasse mich mit dem Abspeichern von Messwerten auf eine SD-Karte. Der Aufbau sollte soweit passen.
Ein Testprogramm hat bereits funktioniert.
Nun müsste ich aber noch wissen, in welche Teile des Bsp. Codes ich meine eigenen Bausteine einfügen muss, damit alles soweit klappt, wie ich es möchte.

Hier der genutzte Code
Code: [Select]
    /////////////////////////////////////////////////////////////////
   //              Arduino SD Card Tutorial     v1.00             //
  //       Get the latest version of the code here:              //
 //         http://educ8s.tv/arduino-sd-card-tutorial           //
/////////////////////////////////////////////////////////////////
#include <SD.h>
#include <SPI.h>

int CS_PIN = 10;

File file;

void setup()
{

  Serial.begin(9600);

  initializeSD();
  createFile("test.txt");
  writeToFile("This is sample text!");
  closeFile();

  openFile("prefs.txt");
  Serial.println(readLine());
  Serial.println(readLine());
  closeFile();
}

void loop()
{
}

void initializeSD()
{
  Serial.println("Initializing SD card...");
  pinMode(CS_PIN, OUTPUT);

  if (SD.begin())
  {
    Serial.println("SD card is ready to use.");
  } else
  {
    Serial.println("SD card initialization failed");
    return;
  }
}

int createFile(char filename[])
{
  file = SD.open(filename, FILE_WRITE);

  if (file)
  {
    Serial.println("File created successfully.");
    return 1;
  } else
  {
    Serial.println("Error while creating file.");
    return 0;
  }
}

int writeToFile(char text[])
{
  if (file)
  {
    file.println(text);
    Serial.println("Writing to file: ");
    Serial.println(text);
    return 1;
  } else
  {
    Serial.println("Couldn't write to file");
    return 0;
  }
}

void closeFile()
{
  if (file)
  {
    file.close();
    Serial.println("File closed");
  }
}

int openFile(char filename[])
{
  file = SD.open(filename);
  if (file)
  {
    Serial.println("File opened with success!");
    return 1;
  } else
  {
    Serial.println("Error opening file...");
    return 0;
  }
}

String readLine()
{
  String received = "";
  char ch;
  while (file.available())
  {
    ch = file.read();
    if (ch == '\n')
    {
      return String(received);
    }
    else
    {
      received += ch;
    }
  }
  return "";
}



Bisher kenne ich void setup und void loop
Nun würde ich gerne sobald der Arduino läuft eine Temperaturmessung starten lassen.
Anfangs soll danngleichzeitig das Schreiben in die Text-Datei erfolgen. Erstmal für ein paar Sekunden. Später dann über einen Taster-Befehl.

Nun scheint es aber in diesem Code so zu sein, dass noch im Setup auf die Karte geschrieben wird. (This is a sample text).

In die loop funktion scheinen die Zeilen aber auch nicht zu gehören, da zumindest das Schreiben ja auch wieder aufhören soll.

Und was ab void initializeSD passiert ist mir auch noch gar nicht klar.

Soll ich in meinem Fall einen loop Befehl unter void Setup packen?

HotSystems

Das was im Testsketch im Setup funktioniert, wird auch, zwar abgewandelt, in der loop funktionieren.
Du darfst da natürlich nur einmalig, bzw. dann wenn du es brauchst, auslösen.
Z.B. über einen Taster.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Hanswurst123

Nochmal ne Frage:
Das Abspeichern klappt mittlerweile ganz gut.
Allerdings nur auf meinem Uno. Eigentlich war die Nutzung eines Nanos angedacht. Ich fürchte, dass das SD-Modul die 5V Eingangsspannung braucht. Die habe ich aber versuchsweise auch über ein Powermodul zugeführt und nur die Datenpins an den Nano angeschlossen. Hätte erwartet, dass das klappt.

Oder unterscheidet sich der Code für Uno und Nano? (Mal abgesehen davon, was ich in der IDE als Board auswähle...)

Das gleiche Problem habe ich nämlich auch noch mit meinem Temperatursensor =( Am Uno perfekt, am Nano passiert nichts.

Tommy56

Hast Du evtl. vergessen GND zu verbinden?
Ansonsten haben UNO und Nano den gleichen Prozessor.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

HotSystems

Wenn du mal Schaltbilder posten würdest, hätten wir einen Anhaltspunkt, wie du es verdrahtet hast.
Da könnten wir gezielt drauf antworten.

Du lässt uns aber immer raten.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

combie

Quote
Allerdings nur auf meinem Uno. Eigentlich war die Nutzung eines Nanos angedacht. Ich fürchte, dass das SD-Modul die 5V Eingangsspannung braucht.
Auch der Nano arbeitet mit 5V!

Tipp:
Bei 3,3V benötigst du keinen komplizierten Adapter

Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

postmaster-ino

Hi

Da UNO und NANO der gleiche Chip sind und NUR anders aussehen (ok, der Nano hat A6 und A7, Die beim Uno nicht rausgeführt sind), ist jeder Sketch unter Uno und Nano tauschbar (sofern A6/A7 nicht im Boot sind).

Wenn man mehrere Spannungen benutzt, werden Deren GND miteinander verbunden.
Ein Plus-Pol einer Batterie alleine ist ohne den zugehörigen Minus 'Nichts' - und genau Das sieht der Nano/Uno dann auch davon - Nichts.

MfG

PS: Die GND werden normal sternförmig miteinander verbunden, damit keine Schleifen entstehen, wo sich Ausgleichsströme tummeln - in der Musik unter dem Begriff 'Brummschleife' bekannt - und dort extrem unerwünscht.

Rentner

Hallo,

der T0 wird inzwischen ein neues Problem haben , und sich gleich wieder mit einem neuen Post melden, da bin ich mir ziemlich sicher.

Heinz

Hanswurst123

@Tommy56: So etwas simples sollte es nicht sein, damit hatte ich bisher keine Probleme.

Ich war nicht ganz genau. Ich habe hier keinen Nano, sondern einen Nano 33 BLE in Verwendung.
Zu diesem habe ich gerade den Abschnitt zu 3,3 und 5 V gelesen.
Daher nun nochmal die Frage: Sind die üblichen SDModule sowohl mit 5V als auch mit 3,3 Volt zu betreiben?

@Hot Systems: Fritzing kennt den Nano 33 BLE leider nicht. Wenn ich hier noch länger rumprobieren, wird auch mal ein Schaltbild gezeichnet.

Um den Fehler hier aber doch auszuschließen:
SD -> Nano 33 BLE

GND - GND (wahlweise auf Nano 33 BLE als auch auf externem Power Modul mit 5 V)
VCC - 3,3 V (wahlweise auf Nano 33 BLE als auch auf externem Power Modul mit 5 V)
MISO - D12
MOSI - D11
SCK - D13
CS - 4 (wo es mit dem Code auf dem UNO läuft, 10 wurde auch mal probiert)

Dann noch der Code

Code: [Select]
#include <SPI.h>
#include <SD.h>


int tempPin = 0;
int buttonApin = 9;
int ledPin = 7;
bool status;

int Messzeit = 11;
//Messzeit in Sekunden

File myFile;

void setup()
{

 // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  pinMode(ledPin, OUTPUT);
  pinMode(buttonApin, INPUT_PULLUP); 
  status = false;

  Serial.print("Initializing SD card...");

  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("initialization done.");

  if (SD.exists("example.txt")) {
    Serial.println("example.txt exists.");
  } else {
    Serial.println("example.txt doesn't exist.");
  }

  Serial.println("Creating example.txt...");
 
}
void loop()
{

  if (digitalRead(buttonApin) == LOW) {
    digitalWrite(ledPin, HIGH);
    status = true;
  }
  if (status == true) {
  myFile = SD.open("example.txt", FILE_WRITE);
  myFile.println("Hier beginnt eine neue Messung:");
  myFile.println("Zeit [s], Temperaturen T1, T2 [°C]");
 
  for (int i=0; i <= Messzeit; i++) {
   
  int tempReading = analogRead(tempPin);
  // This is OK
  double tempK = log(10000.0 * ((1024.0 / tempReading - 1)));
  tempK = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * tempK * tempK )) * tempK );       //  Temp Kelvin
  float tempC = tempK - 273.15;            // Convert Kelvin to Celcius

  Serial.println(i);
  myFile.print(i);
  myFile.print(" , ");
  myFile.print(tempC);
  Serial.println(tempC);
  delay(1000);
  }
  myFile.println("Ende der Messung");
  myFile.close();
  digitalWrite(ledPin, LOW);
  status = false;
  }
}


@Rentner: Wahrscheinlich ja, vllt auch nicht. Am UNO klappt alles ganz wunderbar. Heute habe ich die Sensorkabel gelötet und einen 24h Testlauf im Zimmer gestartet. Mit diesem Arduino könnte es am Mo losgehen =)

combie

Quote
Daher nun nochmal die Frage: Sind die üblichen SDModule sowohl mit 5V als auch mit 3,3 Volt zu betreiben?
Überlesen?
Quote
Tipp:
Bei 3,3V benötigst du keinen komplizierten Adapter

Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

Tommy56

#10
Feb 14, 2020, 11:23 pm Last Edit: Feb 15, 2020, 03:16 pm by Tommy56
Dabei nicht vergessen: Beide GND-Anschlüsse müssen verdrahtet werden!

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

HotSystems

Daher nun nochmal die Frage: Sind die üblichen SDModule sowohl mit 5V als auch mit 3,3 Volt zu betreiben?
Ist das dein Ernst ?
Was verstehst du unter üblich ?

Was meinst du, wie viel SD-Cardreader es gibt ?
Mit und ohne Spannungsregler. Also für 3,3 oder 5Volt.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Hanswurst123

@combie: Hm, von solch einer Bastelei zum Beschreiben der SD-Karte wurde mir abgeraten...

@Tommy56: Was meinst du mit dem verdrahten beider Ground-Anschlüsse? Jeweils ein Jumperkabel zu -Leiste am Board? Würde nicht ein Anschluss ausreichen? Was macht das für einen Unterschied?

@HotSystems: Unter üblich habe ich die ersten 3 Treffer gemeint, die man bei Amazon und ebay erhält, wenn man Arduino SD-Module eingibt. Aber deiner Antwort entnehme ich, dass es welche für 3,3 V, 5V oder 3,3-5 V gibt.

Wir haben dann wohl eines mit 5 V Eingangsspannung erwischt. Bei AZdelivery war leider kein Datenblatt zum Runterladen dabei.

Seitdem ich aber den 5V Pin beim Arduino Nano 33 BLE gebrückt habe, kann ich die SD-Karte nutzen. (Was allerdings komisch ist, da ich genau das vorher mit der externen Spannungszuführung im Prinzip schon gemacht habe. Zu dem Zeitpunkt muss es wohl noch einen Fehler an anderer Stelle gegeben haben.)

Aber es läuft soweit.

combie

Quote
@combie: Hm, von solch einer Bastelei zum Beschreiben der SD-Karte wurde mir abgeraten...
Ja?

Warum?
Was kann dann falsch laufen?

Aber wenn du meinst...
Wer seine Meinung nie zurückzieht, liebt sich selbst mehr als die Wahrheit.

Quelle: Joseph Joubert

HotSystems

@HotSystems: Unter üblich habe ich die ersten 3 Treffer gemeint, die man bei Amazon und ebay erhält, wenn man Arduino SD-Module eingibt.
Ach ja....und das sollen wir so wissen ?
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Go Up