ich bin erst vor kurzem auf den Arduino gestoßen, und habe eine vermutlich ziemlich einfache Anfängerfrage zur Erzeugung eines Datenstrings.
Zu meiner Problemstellung:
Ich möchte die Sensorwerte eines ADXL345 auf einer SD-Karte loggen.
Das Auslesen der Werte und das Speichern von Daten auf eine SD habe ich mit den Beispielprogrammen schon hinbekommen, nur die Zusammenführung der beiden Programme bereitet mir Kopfschmerzen.
Wenn ich es richtig verstanden habe wird zum abspeichern eines Datensatzes ein String erzeugt, dann die Datei auf der Karte geöffnet, der Satz in die Datei geschrieben und diese dann wieder geschlossen.
Beim Auslesen des ADXL345 werden die 3 Werte für X-, Y- und Z-Achse jeweils einzeln ausgegeben.
Wie kann ich diese Werte nun in einen string zusammenfassen?
Ich muss wohl einen String aus den Einzelwerten definieren, wie gehe ich hier richtig vor?
Muss ich zuerst die Variablen für den String definieren und diese dann in einer Funktion hintereinandersetzen oder gibt es da eine fertige Funktion?
In welchem Datenformat müssen die Variablen sein, oder ist das egal?
Im Forum habe ich (zu) viele verschiedene Ansatzpunkte gefunden und bin reichlich verwirrt..
Ich habe dieses Beispielprojekt zur Datenspeicherung auf der SD-Karte verwendet:
#include <SPI.h>
#include <SD.h>
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 native USB port only
}
Serial.print("Initializing SD card...");
// 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()
{
delay(500);
// make a string for assembling the data to log:
String dataString = "";
// read three sensors and append to the string:
for (int analogPin = 0; analogPin < 3; 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.println(dataString);
dataFile.close();
// print to the serial port too:
Serial.println(dataString);
}
// if the file isn't open, pop up an error:
else {
Serial.println("error opening datalog.txt");
}
}
Da werden die drei Analogwerte ausgelesen und in den "dataString" gepackt. Kann man das auf drei Variablen umbauen, die dann anstatt des Strings gespeichert werden, oder ist das zu umständlich?
CSV-Dateien? (Sorry, bin Anfänger , habe aber gerade einen neuen Suchbegriff fürs Forum gefunden )
Wenn man Strings nicht auf eine konstante Breite formatieren muss besteht überhaupt keinen Grund das in einen einzigen String zu packen. Du kannst einfach sowas machen:
Vielen Dank erstmal für eure Antworten, sobald Kinder, Frau und Job es zulassen werde ich mich an die IDE hängen und eure Tipps ausprobieren, vermutlich were ich euch schon bald wieder mit meinen Anfängerfragen nerven...
Ja geilo, mit eurer Hilfe liest der Sensor jetzt die Daten aus und schreibt sie auf die SD.
Danke, Danke, Danke!!! ;D ;D ;D
Hier mal mein Sketch (Schreib- und Tippfehler gehören zum künstlerischen Gesamtkonzept)
#include <SPI.h> //SPI einbinden
#include <SD.h> //SD einbinden
#include <Wire.h> //Wire für I2C einbinden
#include <ADXL345.h> //ADXL345 einbinden
ADXL345 acc;
const int chipSelect = 4; //Pin Definition für CS an SD-Modul, hier an 4
void setup() {
// Messung starten, SerialMonitor mit 9600bps starten, später deaktivieren
acc.begin();
Serial.begin(9600);
while (!Serial) {
;
}
Serial.print("Suche SD Karte..."); //während der Initialisierung
// wenn Karte fehlt schreibe Fehlermeldung, später in LED-Ausgang wandeln, ansonsten schreibe Erfolgsmeldung
if (!SD.begin(chipSelect)) {
Serial.println("Karte kaputt, oder keine Karte gesteckt");
return;
}
Serial.println("Karte gefunden und OK");
}
void loop()
{
delay(500); //der Übersicht halber nur alle 500mS einen Durchlauf
double Xg, Yg, Zg; // Xg, Yg und Zg als double definieren
acc.read(&Xg, &Yg, &Zg); // Sensorwerte auslesen
// Datei datalog.txt öffnen
File dataFile = SD.open("datalog.txt", FILE_WRITE);
// wenn die Datei geöffnet ist Daten schreiben und Datei wieder schließen
if (dataFile) {
dataFile.print(Xg);
dataFile.print(';');
dataFile.print(Yg);
dataFile.print(';');
dataFile.println(Zg);
dataFile.print(';');
dataFile.close();
// Daten auf SerialMonitor ausgeben, später deaktivieren
Serial.print(Xg);
Serial.print(" - ");
Serial.print(Yg);
Serial.print(" - ");
Serial.print(Zg);
Serial.println(" - ");
}
// wenn die Datei nicht vorhanden ist Fehlermeldung ausgeben, später in LED-Ausgang wandeln
else {
Serial.println("Datei nicht vorhanden oder kann nicht geöffnet werden");
}
}
Gibt es da noch Verbesserungsmöglichkeiten?
Vermutlich muss ich nach dem Schreibvorgang noch ein delay einbauen da meine Datei wohl nicht alle Werte mitschreibt?
Chris779:
Gibt es da noch Verbesserungsmöglichkeiten?
Bestimmt. Kein Sketch ist perfekt. So mancher genial, aber keiner wo es eben gar nichts mehr zu verbessern gibt.
z.B. das delay im loop. Stört zwar noch nicht, aber sobald du noch was anderes auf den Arduino packst, z.B. eine Alarm LED, die schnell blinken soll, merkst du es.
Das Delay habe ich ja nur drin um die Übersicht nicht so schnell zu verlieren, steht so auch im Kommentar.
Das fliegt dann noch raus wenn ich an diesem Projekt weiterbaue.