Hallo!
Ich versuche im Moment einen Datenlogger mit einem Arduino Nano Clone zu bauen.
Er soll die Daten alle 15 Minuten (zum Testen erstmal alle 15 Sek.) vom Sensor auslesen, und zusammen mit einem Zeitstempel vom DS3231 RTC Modul auf eine Micro-SD Karte schreiben.
Die Hardware funktioniert in einzelnen Teilen (Temp. Sensor, RTC, SD Karte beschreiben), der komplette Code von mir aber nicht.
Hier mein bisheriger Code:
/*
Datalogger mit DS18B20 an D5,
-Timestamp von DS3231 RTC
-Speichern auf SD an I2C
Version vom 18.01.2017 (Funktioniert ne)
*/
#include <Wire.h>
#include <DS3231.h>
#include <SD.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 8
DS3231 clock;
RTCDateTime dt;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
const int chipSelect = 10;
String w; //minute
int w1;
String dataString = "";
float t; //für temp.
float z;
float t2;
void setup(){
pinMode(chipSelect, OUTPUT);
Serial.begin(9600);
sensors.begin();
Serial.print("Initializing SD card... ");
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
return;
}
Serial.println("done");
Serial.print("Initialize DS3231... ");
clock.begin();
Serial.println("done");
// Set sketch compiling time
// clock.setDateTime(__DATE__, __TIME__);
// Set from UNIX timestamp
// clock.setDateTime(1397408400);
// Manual (YYYY, MM, DD, HH, II, SS
// clock.setDateTime(2014, 4, 13, 19, 21, 00);
}
void loop(){
dt = clock.getDateTime();
w=(clock.dateFormat("s", dt));
w1=w.toInt();
if (w1 == 0 or w1 == 15 or w1 == 30 or w1 == 45) {
String dataString = "";
//get temp and round:
sensors.requestTemperatures();
t = (sensors.getTempCByIndex(0));
z = round(t*10);
t2 = z/10;
//Write to String:
dataString += String(t2);
//Write to SD:
File dataFile = SD.open("datalog.txt", FILE_WRITE);
// if the file is available, write to it:
if (dataFile) {
dataFile.print(dataString);
dataFile.print(" ");
dataFile.println(clock.dateFormat("d-m-Y H:i:s", dt));
dataFile.flush();
//dataFile.close();
// print to the serial port too:
Serial.print(dataString);
Serial.print(" at: ");
Serial.println(clock.dateFormat("d-m-Y H:i:s", dt));
}
// if the file isn't open, pop up an error:
else {
Serial.println("error opening datalog.txt");
}
delay(1000);
}
}
Die Temperatur wird vom Sensor richtig ausgelesen, Die Uhrzeit vom RTC auch.
Die seriellen Ausgaben vom Programm sind auch so wie ich sie haben will.
Allerdings bekomme ich nach spätestens 8 Ausgaben nur noch die Meldung "error opening datalog.txt".
Wenn ich den Controller resette, passiert nach spätestens 8 Durchläufen wieder exakt das gleiche.
Auf der SD Karte sind dann so 2-3 Ausgaben richtig geschrieben (Temperatur, Uhrzeit, Datum).
Warum stürzt das Programm immer ab? Und warum wird nicht alles auf die SD geschrieben?
Wenn ich den gleichen Code verwende, aber die Zeile
"dataFile.flush();"
durch
"dataFile.close();"
ersetze, Stürzt das Programm nicht ab, allerdings ist die Datalog.txt auf der SD komplett leer.
Ich habe auch schon probiert die abfrage der minute zu entfernen und einfach nen delay gesetzt, dann wurde die SD beschrieben, manchmal fehlte aber einfach der Zeitstempel, oder wurde durch sinnlose Sonderzeichen ersetzt.
Dieser Beispielcode (nur mit Uhr/Zeitstempel hinzugefügt) hier funktioniert übrigens ohne Probleme:
/*
Abfrage A0-2, serielle Ausgabe, speichern auf SD
- Timestamp RTC
Version vom 14.12.16
*/
#include <Wire.h>
#include <DS3231.h>
#include <SD.h>
const int chipSelect = 10;
DS3231 clock;
RTCDateTime dt;
void setup(){
pinMode (10, OUTPUT);
Serial.begin(9600);
Serial.print("Initializing SD card... ");
if (!SD.begin(chipSelect)) {
Serial.println("Card failed, or not present");
return;
}
Serial.println("done");
// Initialize DS3231
Serial.print("Initialize DS3231... ");
clock.begin();
// Set sketch compiling time
// clock.setDateTime(__DATE__, __TIME__);
Serial.println("done");
// Set from UNIX timestamp
// clock.setDateTime(1397408400);
// Manual (YYYY, MM, DD, HH, II, SS
// clock.setDateTime(2014, 4, 13, 19, 21, 00);
}
void loop(){
String dataString = "";
dt = clock.getDateTime();
// 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 += " ";
}
}
File dataFile = SD.open("datalog.txt", FILE_WRITE);
// if the file is available, write to it:
if (dataFile) {
dataFile.print(dataString);
dataFile.print(" ");
dataFile.println(clock.dateFormat("d-m-Y H:i:s", dt));
dataFile.close();
// print to the serial port too:
Serial.print(dataString);
Serial.print(" at: ");
Serial.println(clock.dateFormat("d-m-Y H:i:s", dt));
}
// if the file isn't open, pop up an error:
else {
Serial.println("error opening datalog.txt");
}
delay(15000);
}
Das ganze ergibt in meinen Augen einfach keinen Sinn, ich bitte um Hilfe!
Edit:
Das ganze funktioniert mittlerweile, hab den Code unten noch mal geposted!