Datenlogger Temperatur auf Sd Karte

Hi,

ich habe jetzt angefangen mit einem Arduino Uno. Also nicht wirklich Ahnung davon.
Mein Ziel ist es, einen Datenlogger zu konstruieren, der die Temperatur mit Luftfeuchte und Uhrzeit auf eine SD Karte schreibt.
Dach da fangen meine Probleme an. Auf dem LCD geht alles.
Aber wie binde ich die Temperatur bzw. Feuchte richtig ein?
Und wo liegt noch mein Fehler beim Zusammenstellen für das auf SD Karte schreiben?
Vielen Dank für die Hilfe!

Robert

dateloggertest.ino (4.98 KB)

Welche Fehlermeldungen bekommst Du?
Grüße Uwe

robert0204:
Und wo liegt noch mein Fehler beim Zusammenstellen für das auf SD Karte schreiben?

Ein Arduino UNO hat keinen SD-Kartenschacht auf dem Board.

Welche Hardware hast Du bei Deinem UNO als "SD-Karte" angeschlossen?

Aufgrund deiner doch sehr wagen Fehlerbeschreibung erstmal ein Schuß ins Blaue:

die Befehle in der Form "dataString += (now.hour());"
funktionieren denke ich nicht. Ich bin kein String-Experte, ich versuche Strings zu vermeiden wo es geht, aber hier versuchst du einem String einen Wert zuzuweisen.

Ich denke du müßtest entweder den Wert vorher wandeln
"dataString += String(now.hour());"

oder das gleich Formatiert in die Datei schreiben:
"dataFile.print(now.hour());"

Ansonsten wäre eine genaue Beschreibung dessen, was nicht geht, sehr hilfreich für die Analyse.

Entschuldigt bitte, dass ich Elementare Dinge vergessen habe.
Ich habe ein Adafruit Assembled Data Logging shield for Arduino.
Zu meinen Fehlern:
in der Zeile: datastring += (t); oder auch bei: dataString += (h);
kommt beim Überprüfen: amibiguous overload for 'Operator += ' in Datastring += h'
An dieser Stelle sollen sollte meiner Meinung nach, der Temperatur bzw. Feuchte Wert des DHT 22 in den dataString gebracht werden.
Wenn ich diese Zeilen deaktiviere erhalte ich noch bei:
dataFile.printIN(dataString);
folgenden Fehler:
expected constructor, or type conversion before '.' token

amibiguous overload for ...

ist ein Fehler, der mit den Datentypen zusammenhängt
D.h. genauso wichtig wie die Zeile mit dem " += " sind die Zeilen, wo die betreffenden Variablen definiert werden.

Und:
Dass String Objekte einen Vorteil gegenüber normalen char arrays hätten, ist ein Irrtum.
Sie sind zwar neuerdings nicht mehr so schlecht wie sie hier gemacht werden, aber der übliche Tip ist:
nimm lieber sowas wie

int t = 200; int h = 50;
char Zeile[80];
sprintf( Zeile, "Temp: %d \t Feuchte: %d\n", t, h );
datafile.write(Zeile);

Und wenn es unbedingt float sein müssen, google mal dtostrf()

Hallo,

ich bin nun ein kleines Stück weiter. Ich weiss nun, dass der Fehler beim basteln meiner Datenzusammenstellung liegt.
Nun habe ich einmal den Orginal Text:
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);
Doch wie bekomme ich nun diesen dataString mit meinen Werten gebaut?
Mit dem char bin ich irgendwie nicht zurecht gekommen.
Ich habe als Werte now.minute, now.hour, h und t . Diese funktionieren jedenfalls auf dem LCD entsprechend.

PS die float Werte habe ich durch int ersetzt.

Strings zusammenbasteln geht wie gesagt am einfachsten mit s(n)printf():
http://www.cplusplus.com/reference/cstdio/snprintf/
http://www.cplusplus.com/reference/cstdio/sprintf
http://www.cplusplus.com/reference/cstdio/printf/ (für die Formattierungsoptionen)

Vorher ein entsprechend großes char Array definieren, dann den korrekten Format String nehmen (der Teil ist am kompliziertesten).

Das ist auf dem AVR nicht für Float implementiert, aber für alle anderen Datentyp geht es.

In deinem Fall liest du am besten erst mal die Werte in ein int Array ein. Das kannst du dann (Index für Index) an sprintf() übergeben.

Vielen Dank für Eure Hilfe!
Ich habe es jetzt nach einem ganz einfachen Format hin bekommen.
(dataFile.print(...):wink:
Ihr werdet zwar die Hände über den Kopf zusammen schlagen. Aber den Rest lerne ich noch mit der Zeit.