Datenlogger auf SD Karte

Hiho, ich sitz hier seit tagen und lern mich in die welt des arduino ein…
Setting:
Mega 2560
Ethernet Shield
8GB micro SD karte

habe diesen code verwändet/ Zusammengeflickt:

was mach ich falsch?

Vorher hat er wunderbar per seriell auf den pc alles ausgegeben…
nur die sd card war 0byte groß und leer… ich weiß nicht mehr weiter…

und seit paar studnen meckert er bei:

if (dataFile) {

GesamtCode:

/*
  SD card datalogger
 
 This example shows how to log data from three analog sensors 
 to an SD card using the SD library.
 	
 The circuit:
 * analog sensors on analog ins 0, 1, and 2
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4
 
 created  24 Nov 2010
 modified 9 Apr 2012
 by Tom Igoe
 
 This example code is in the public domain.
 	 
 */

#include <SD.h>

               // On the Ethernet Shield, CS is pin 4. Note that even if it's not
               // used as the CS pin, the hardware CS pin (10 on most Arduino boards,
               // 53 on the Mega) must be left as an output or the SD library
               // functions will not work.
const int chipSelect = 4;

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


  Serial.print("Initializing SD card...");
                 // make sure that the default chip select pin is set to
                 // output, even if you don't use it:
  pinMode(4, OUTPUT);  
                 // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
                   // don't do anything more:
    return;
  }
  Serial.println("card initialized.");
}

void loop()
{  
                 //***************************************************
                 // Liest den Analog Eingang auf Pin.
  int Spannung1 = analogRead(A0);
  int Spannung2 = analogRead(A1);
  int Spannung3 = analogRead(A2);
  int Spannung4 = analogRead(A3);
  
                   // Konvertiert das Signal (geht von 0 - 1023) zu einer Spannung (0 - 5V):
  float Volt1 = Spannung1 * (33.9 / 1023.0);
  float Volt2 = Spannung2 * (33.9 / 1023.0);
  float Volt3 = Spannung3 * (33.9 / 1023.0);
  float Volt4 = Spannung3 * (33.9 / 1023.0);
  
               //***************************************************
               // make a string for assembling the data to log:
  String dataString = "";

               // read three sensors and append to the string:
  
               //  for (int analogPin = 8; analogPin < 11; analogPin++) {
               //    int sensor = analogRead(analogPin);
               //    dataString += String(sensor);
               //    if (analogPin < 2) {
      dataString += ","; 
                //   }
  }
                 // open the file. note that only one file can be open at a time,
                 // so you have to close this one before opening another.
  File dataFile = SD.open("datalog.txt", FILE_WRITE);

                 // if the file is available, write to it:
  if (dataFile) {
    dataFile.print(Volt1);
    dataFile.println(" Volt");
                   //dataFile.println(Volt2);
                   //dataFile.println(" Volt");
                   //dataFile.println(Volt3);
                   //dataFile.println(" Volt");
                   //dataFile.println(Volt4);
                   //dataFile.println(" Volt");
    
    dataFile.close();
                   // print to the serial port too:
    Serial.print(Volt1);
    Serial.println(" Volt");
                   //Serial.print(Volt2);
                   //Serial.println(" Volt");
                   //Serial.print(Volt3);
                   //Serial.println(" Volt");
                   //Serial.print(Volt4);
                   //Serial.println(" Volt");    
    delay (1000); 
  }  
                 // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");
  } 
}

und seit paar studnen meckert er bei:

Verratest Du uns auch noch, was er meckert?

Ein paar grundsätzliche Dinge:

  int Spannung1 = analogRead(A0);
  int Spannung2 = analogRead(A1);
  int Spannung3 = analogRead(A2);
  int Spannung4 = analogRead(A3);
  
                   // Konvertiert das Signal (geht von 0 - 1023) zu einer Spannung (0 - 5V):
  float Volt1 = Spannung1 * (33.9 / 1023.0);
  float Volt2 = Spannung2 * (33.9 / 1023.0);
  float Volt3 = Spannung3 * (33.9 / 1023.0);
  float Volt4 = Spannung3 * (33.9 / 1023.0);

wäre ein Fall für Arrays:

float Volt[4];
uint8_t i;
for (i = 0; i < 4; i++) {
  Volt[i] = analogRead(A0 + i) * (33.9 / 1023.0);
}
String dataString = "";

Die String-Klasse solltest Du möglichst nicht verwenden, sie zerstückelt Dir Deinen Speicher und im Handumdrehen kann der Prozessor keinen mehr allozieren, obwohl eigentlich genügend vorhanden wäre, aber eben nirgends genügend an einem Stück. Zudem führt die aktuelle Implementation zu Memory Leaks, was aber hoffentlich in einer der nächsten Versionen der IDE behoben wird.

Danke für die antwort...

Woher bekomme ich ein deutsches "wörterbuch" wo ich nachschlagen kann was welcher code bewirkt... In die richtung: deutsch -> arduino / arduino -> deutsch?

Wo zb. Dein steht was arrays machen, ich versteh den code von dir nicht wirklich, klahr kann ich ihn copy und pasten aber wills ja verstehn...

Er kompiliert bis: datafile () { Da bleibt er stehn...

Thx 4 time

Ps bringt n syntaxbuch in c / c++ was? Oder ist da zu viel nicht arduino code drin?

Ratschlag: Kauf Dir ein Buch über Arduino oder lies Dir ein Tutorial durch. Damit arbeitest Du Dich in Arduino ein und lernst die ersten Schritte in C. Ein C/C++ Kurs ist dann der nächste Schritt. Leider kann ich Dir auf die schnelle keine deutschprachigen Tutorials nennen. Grüße Uwe

Ps bringt n syntaxbuch in c / c++ was? Oder ist da zu viel nicht arduino code drin?

Arduino-Code ist C++-Code, wobei einige Funktionen und Objekte bereits vordefiniert sind. Ein C/C++-Buch ist also eine gute Syntax-Referenz für die Arduino-Programmierung.

Er kompiliert bis: datafile () { Da bleibt er stehn...

Da bleibt er stehen und gibt keine Fehlermeldung aus? Dann ist Dein Rechner defekt, virenverseucht oder sonstwie nicht funktionstüchtig. Normalerweise gibt die IDE nämlich immer eine Fehlermeldung aus, wenn sie etwas nicht zu Ende bringen kann. Du sagtest ja schon, dass die IDE meckert, aber was sie meckert, das hast Du uns bis jetzt nicht verraten. War es wirklich ein sehr stilles Gemeckere?

hi,

wenn Du arrays nicht verstehst, solltest Du ein buch kaufen, das wirklich bei den basics anfängt. da kann ich Dir "die elektronische welt mit arduino entdecken" von erik bartmann nur empfehlen. leicht und amüsant geschrieben. http://erik-bartmann.de/

gruß stefan

Die gemessene Eingangsspannung von 0 bis 5 Volt wird ja in int Werten von 0 bis 1023 gemessen. Das sind 1024 steps. Muss es dann nicht in Code Zeile 63 bis 66 " ... /1024.0" heißen? Oder denke ich gerade einfach falsch?

Bin erst jetzt heim und konnte noch mal kompilieren So hier der/ die ausgegebenen Fehler:

markuman: Die gemessene Eingangsspannung von 0 bis 5 Volt wird ja in int Werten von 0 bis 1023 gemessen. Das sind 1024 steps. Muss es dann nicht in Code Zeile 63 bis 66 " ... /1024.0" heißen? Oder denke ich gerade einfach falsch?

Diese Rechnung wird von 66 - 70 doch gemacht... das komische is ja das er es über seriell richtig ausgibt, nur bei der sd karte schreibt er nichts.... und der neue fehler das er nicht kompiliert

markuman: Die gemessene Eingangsspannung von 0 bis 5 Volt wird ja in int Werten von 0 bis 1023 gemessen. Das sind 1024 steps. Muss es dann nicht in Code Zeile 63 bis 66 " ... /1024.0" heißen? Oder denke ich gerade einfach falsch?

1023 ist richtig, nicht 1024. "Vollausschlag" (maximalwert) ist 1023 darum damit Du 5V bei 5V Eingangspannung bekommst mußt Du durch 1023 teilen und mal den Umrechnungsfaktor (in diesem Fall 33,9; weiß nicht wieso) multiplizieren. 1023,0 (mit Kommastelle) weil so der Compiler eine float-Zahl nimmt und nicht mit einer INT Zahl. Grüße Uwe

DraycD:
Bin erst jetzt heim und konnte noch mal kompilieren
So hier der/ die ausgegebenen Fehler:

Weil in Zeile 80 eine geschwungene Klammer zu viel ist oder anderswo eine zu wenig.
nach

dataString += ","; 
                //   }

Es ist eine zuviel da, weil Du in Zeile 74 eine auskommentiert hast:

             //  for (int analogPin = 8; analogPin < 11; analogPin++) {

Grüße Uwe

DAAAANNKKKEEEEE ! :wink:

nun

wie kann ich dort noch eine fortlaufende nummerierung einbauen?

count +1 ← in dieser weise?

müsste das skript erst den vorwert aus der karte lesen und ihn dann +1 schreiben oder?!

Nun der funktionierende Code ohne Counter: (für die es auch haben wollen…)

#include <SD.h>

// On the Ethernet Shield, CS is pin 4. Note that even if it's not
// used as the CS pin, the hardware CS pin (10 on most Arduino boards,
// 53 on the Mega) must be left as an output or the SD library
// functions will not work.
const int chipSelect = 4;

void setup()
{
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) 


  Serial.print("Initializing SD card...");
  // make sure that the default chip select pin is set to
  // output, even if you don't use it:
  pinMode(4, OUTPUT);
  
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("Karte Eingelegt");
}

void loop()
{
  
  
  
  //***************************************************
    // Liest den Analog Eingang auf Pin.
  int Spannung1 = analogRead(A0);
  int Spannung2 = analogRead(A1);
  int Spannung3 = analogRead(A2);
  int Spannung4 = analogRead(A3);
  
    // Konvertiert das Signal (geht von 0 - 1023) zu einer Spannung (0 - 20V):
  float Volt1 = Spannung1 * (33.9 / 1023.0);
  float Volt2 = Spannung2 * (33.9 / 1023.0);
  float Volt3 = Spannung3 * (33.9 / 1023.0);
  float Volt4 = Spannung3 * (33.9 / 1023.0);
  
//***************************************************

  // make a string for assembling the data to log:
  String dataString = "";

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  File dataFile = SD.open("datalog.txt", FILE_WRITE);

  // if the file is available, write to it:
  if (dataFile) {
    dataFile.print(Volt1);
    dataFile.println(" Volt");
    //dataFile.println(Volt2);
    //dataFile.println(" Volt");
    //dataFile.println(Volt3);
    //dataFile.println(" Volt");
    //dataFile.println(Volt4);
    //dataFile.println(" Volt");
    
    dataFile.close();
    // print to the serial port too:
    Serial.print(Volt1);
    Serial.println(" Volt");
    //Serial.print(Volt2);
    //Serial.println(" Volt");
    //Serial.print(Volt3);
    //Serial.println(" Volt");
    //Serial.print(Volt4);
    //Serial.println(" Volt");
    
    
    delay (1000);
 
  }  
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");
  } 
}

DAAANNKKEEE