Hallo zusammen!
Ich hab folgendes Problem:
Ich betreibe einen Datenlogger und dieser speichert die Werte auf der SD karte, ABER es werden dann fünft Zeilen mit den selben Daten erstellt. Habe schon einiges ausprobiert, aber leider ohne erfolg. Ich hoffe jemand kann mir da weiterhelfen.
#include <OneWire.h> // OneWire-Bibliothek einbinden
#include <DallasTemperature.h> // DS18B20-Bibliothek einbinden
#include <SD.h>
#include <SPI.h>
#include <Wire.h>
#include "RTClib.h"
// Konstanten
const int owPin = 2; // Pin für OneWire Bus definieren
const int intervall = 1000; // Intervall wie oft die Temperatur abgefragt wird (millisekunden)
int SELECTED_CHIP = 10;
int pushButton = 3;
float Messwert;
float Spannung;
// Variablen
unsigned long letzteMillis = 0; // Speichert die letzte Zeit (millis) der Temperaturabfrage
OneWire oneWire(owPin); // OneWire Referenz setzen
DallasTemperature sensors(&oneWire); // DS18B20 initialisieren
RTC_DS1307 rtc;
byte sensor1[8] = {0x28, 0xFF, 0x64, 0x1E, 0x84, 0x08, 0x13, 0x9E};
byte sensor2[8] = {0x28, 0xFF, 0x64, 0x1E, 0x84, 0x01, 0x11, 0x90};
byte sensor3[8] = {0x28, 0xFF, 0x64, 0x1E, 0x84, 0x05, 0x22, 0xF7};
byte sensor4[8] = {0x28, 0xFF, 0x64, 0x1E, 0x84, 0x03, 0x10, 0x5F};
byte sensor5[8] = {0x28, 0xFF, 0x64, 0x1E, 0x84, 0x0F, 0x27, 0x2F};
void setup()
{
Serial.begin(9600); // Baudrate für die Ausgabe am Serial Monitor
Wire.begin();
rtc.begin();
sensors.begin(); // DS18B20 starten
//Anzahl der angeschlossenen Sensoren ausgeben
Serial.print("Anzahl der Sensoren: ");
Serial.println(sensors.getDeviceCount());
if (SD.begin(SELECTED_CHIP)) {
Serial.println("SD-Karte ist vorhanden");
} else {
Serial.println("SD-Karte fehlerhaft oder nicht vorhanden!");
while (1)
; // Warte bis die serielle Schnittstelle verbunden ist. Nur für den nativen USB-Anschluss erforderlich
if (! rtc.isrunning()) {
Serial.println("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
rtc.adjust(DateTime(__DATE__, __TIME__));
pinMode(pushButton, INPUT);
}
}
}
void loop()
{
DateTime now = rtc.now();
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(' ');
Serial.print(now.day(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.year(), DEC);
delay(1000);
Serial.println();
// Erfasst die aktuelle Zeit für den Abfrageinterval
unsigned long aktuelleMillis = millis();
// Löst bei erreichen der Intervalzeit die Temperaturerfassung aus
if (aktuelleMillis - letzteMillis >= intervall)
{
letzteMillis = aktuelleMillis; // speichert die Zeit der letzten Abfrage
sensors.requestTemperatures(); // Temperatursensoren auslesen
// Temperaturen der Sensoren auslesen
for (int i = 0; i < sensors.getDeviceCount(); i++)
{
show_temperature(i + 1, sensors.getTempCByIndex(i));
}
}
Messwert = analogRead(1); //Spannungswert am analogen Eingang 1 auslesen
Spannung = map(Messwert, 0, 1023, 0, 250); //Umwandeln des Sensorwertes mit Hilfe des "map" Befehls. Da der Map-Befehl keine Kommastellen ausgibt, wird hier vorerst mit größeren Zahlen gearbeitet.
Spannung = Spannung / 10; // Das Ergebnis wird nun durch 10 geteilt, um die Anzeige als korrekten Wert mit einer Nachkommastelle ausgeben zu können.
Serial.print(Spannung, 2); //Endgültigen Spannungswert im seriellen Monitor anzeigen. Die Zahl "2" in der Klammer sorgt dafür, dass das Ergebnis mit zwei Nachkommastellen angezeigt wird. Eine "1" würde hier für eine Nachkommastellen sorgen etc.
Serial.println("V");
int buttonState = digitalRead(pushButton);
// print out the state of the button:
Serial.println(buttonState);
delay(3000);
}
//Temperatur am Seriellen Monitor ausgeben
void show_temperature(byte num, float temp)
{
DateTime now = rtc.now();
Serial.print("Sensor ");
Serial.print(num);
Serial.print(": ");
Serial.print(temp);
Serial.print(" ");
Serial.println("C");
float tempC1 = sensors.getTempC(sensor1);
float tempC2 = sensors.getTempC(sensor2);
float tempC3 = sensors.getTempC(sensor3);
float tempC4 = sensors.getTempC(sensor4);
float tempC5 = sensors.getTempC(sensor5);
//Speichervorgang
File dataFile = SD.open("TEMP.csv", FILE_WRITE);
if (dataFile) {
dataFile.print(now.hour(), DEC); dataFile.print(':'); dataFile.print(now.minute(), DEC); dataFile.print(";"); dataFile.print(now.day(), DEC); dataFile.print('.'); dataFile.print(now.month(), DEC); dataFile.print('.'); dataFile.print(now.year(), DEC); dataFile.print(";");
dataFile.print(tempC1); dataFile.print(";");
dataFile.print(tempC2); dataFile.print(";");
dataFile.print(tempC3); dataFile.print(";");
dataFile.print(tempC4); dataFile.print(";");
dataFile.print(tempC5); dataFile.print(";"); dataFile.print(Spannung); dataFile.print(";"); dataFile.print(digitalRead(pushButton)); dataFile.print(";");
dataFile.println();
dataFile.close(); // Datei schließen und speichern
//Fehlermeldung
} else {
Serial.println("Fehler beim Speichern der Datei!");
}
}