Hallo,
folgendes Problem.
Wenn ich mit dem Uno auf mein SD Karten Modul in eine Excel Tabelle schreibe, ändert er die Formatierung bei Temperaturen <10°C im Format auf ein Datum um. Ist die Temperatur >10°C wird der Wert korrekt mit einem Punkt und zwei Dezimalstellen abgespeichert.
Hat jemand eine Idee?
Hier mal ein Ausschnit aus meinem Code. Das Setup und eine die Funktion zum Messen der Temperatur habe ich mal für die Übersichtlichkeit weggelassen.
Im Serial Monitor sind die Temperaturen übrigens richtig dargestellt. Die Ausgabe des String Line ist auch korrekt.
line = "28.01.2020;16:42:00;23.50;3.25"
//RTC DS1307
#include "RTClib.h"
//TempSensor DS18B20
#include <OneWire.h>
#include <DallasTemperature.h>
//SD SPI Modul
#include <SD.h>
//OLED
#include <SPI.h>
#include <Wire.h>
#include "SSD1306Ascii.h"
#include "SSD1306AsciiAvrI2c.h"
// 0X3C+SA0 - 0x3C or 0x3D
#define I2C_ADDRESS 0x3C
// Define proper RST_PIN if required.
#define RST_PIN -1
SSD1306AsciiAvrI2c oled;
RTC_DS1307 rtc;
const int chipSelect = 10;
#define ONE_WIRE_BUS 3
#define DS18B20_Aufloesung 11
DeviceAddress DS18B20_Adressen;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature myDS18B20(&oneWire);
#define Anzahl_Sensoren_DS18B20 2 // Anzahl der angeschlossenen Sensoren - Mögliche Werte: '0','1','2'
const float No_Val = 999.99;
float Temperatur[2] = {No_Val,No_Val};
char rtctime[20];
char rtcdate[20];
unsigned long WRITE_INTERVAL = 0; // 5 Minuten
unsigned long lastWrite = WRITE_INTERVAL;
unsigned long lastWritesec = 9; //10 Sekunden
void saveToSD(String line) {
oled.setRow(3);
oled.set1X();
oled.println("write to SD");
File dataFile = SD.open("datalog.csv", FILE_WRITE);
//Schreibe Datum / Temp - Werte auf die SD Karte wenn Datei offen
if (dataFile) {
Serial.println(line);
dataFile.println(line);
dataFile.close();
Serial.println("SD beschrieben");
oled.setRow(3);
oled.set1X();
oled.println(" ");
}
else {
Serial.println("error opening TempDataLog.csv");
oled.setRow(3);
oled.set1X();
oled.println("Error TempDataLog.csv");
}
}
void loop() {
//RTC abrufen
DateTime now = rtc.now();
//String aus RTC Daten basteln
sprintf( rtcdate, "%02hhu.%02hhu.%04hhu", now.day(), now.month(), now.year() );
sprintf( rtctime, "%02hhu:%02hhu:%02hhu", now.hour(), now.minute(), now.second() );
// Ausgabe Uhrzeit auf OLED
oled.setRow(0);
oled.set1X();
oled.print(rtcdate);
oled.print(" ");
oled.println(rtctime);
// Aller 10sec die Temperatur messen
if (now.second() - lastWritesec > 9) {
lastWritesec = now.second();
measureTemp();
}
// Aller 5 Minuten die Daten auf die SD Karte schreiben
if (now.minute() - lastWrite > WRITE_INTERVAL) {
String line = String(rtcdate) + ";" + String(rtctime) + ";" + String(Temperatur[0]) + ";" + String(Temperatur[1]);
Serial.println(String(Temperatur[0]));
Serial.println(String(Temperatur[1]));
Serial.println(line);
saveToSD(line);
lastWrite = now.minute();
}
}