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");
}
}
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.
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?
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.
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?
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
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");
}
}