Hi,
ich habe auf meinem Uno R3 einen Adafruit Data Logging Shield verbaut, welcher eine PCF8523 Uhr hat.
Die Uhr funktioniert an sich, aber beim Wechsel von 11:59:59 auf eigentlich 12:00:00 wird die Uhrzeit "32:00:00" ausgegeben.
Außerdem wird statt 0 Uhr 12 Uhr angezeigt.
Bisher konnte ich rein gar nix dazu finden. Es betrifft sowohl serial.print als auch das Schreiben in eine Datei auf der SD Karte.
Bibliotheken:
/* TOC Daten-Logger programmiert von Jan Schröder, RMH KM-TE */
//Bibliotheken einbinden
#include <Wire.h>
#include "RTClib.h"
//#include <SD.h>
#include <SdFat.h> //SdFat.h wird verwendet, da längere Dateinamen und Zeitstempel möglich sind, bei SD.h nicht
SdFat SD; //Umwandeln von alten SD.h Befehle für SdFat.h
#include <SPI.h>
#include <string.h>
#include <avr/pgmspace.h>
#define SYNC_INTERVAL 1000 //Synchronisierungsintervall für SD-Karte auf 1000ms
Uhr-Typ:
//Uhr-Typ festlegen
RTC_PCF8523 RTC;
//uint32_t syncTime = 0;
//SD-Karten CS Pin festlegen
const int chipSelect = 10;
//Länge des Dateinamen festlegen
char filename[30];
//Datei-Variable festlegen
File logfile;
Setup (Teil):
void setup() {
Serial.begin(57600);
Wire.begin();
RTC.begin();
// Überprüfe, ob RTC die Zeit beibehält
if (! RTC.initialized()) {
Serial.println("RTC läuft nicht!");
}
RTC.adjust(DateTime(F(__DATE__), F(__TIME__))); //Stelle Uhrzeit nach Systemzeit, als der Sketch kompilliert wurde
Zeitstempel für Dateien:
void dateTime(uint16_t* date, uint16_t* time) { //Zeitstempel für Dateien definieren
DateTime now = RTC.now();
*date = FAT_DATE(now.year(), now.month(), now.day());
*time = FAT_TIME(now.hour(), now.minute(), now.day());
}
Der Loop, inkl. Serial.print und logfile.print - beides vom Problem betroffen:
void loop() {
//Interpretiere Eingänge 'bits' als Array mit Werten wie 'wert'
byte index = 0;
static byte alt_index = 0;
static byte alt_index2 = 0;
for (byte i = 0; i < 8; i++) {
//@Forum: DELAY HABE ICH HIER EINGEFÜGT - delay(100);
/*digitalWrite(led[i], */digitalRead(bits[i]); //'digitalWrite(led[i],' bei Bedarf aktivieren, wenn LEDs benötigt werden, siehe Pinbelegung oben
if (!digitalRead(bits[i])) {
index += wert[i];
}
}
if ((alt_index != alt_index2)&&(index == alt_index)) {
DateTime now = RTC.now(); //Setze now Variable
SdFile::dateTimeCallback(dateTime); //Zeitstempel für Dateien setzen
sprintf(filename, "TOC-Log %02d-%02d-%02d.txt", now.year(), now.month(), now.day()); //Setze 'filename' Variable - TOC-Log JJJJ-MM-TT.txt
logfile = SD.open(filename, FILE_WRITE); //Öffne Datei mit variable 'filenname' als Name
strcpy_P(buffer, (char*)pgm_read_word(&(meldung[index]))); //Lege Variable 'buffer' fest, Ausgabe für 'buffer' besteht aus Variable 'meldung' + 'wert'-index
//Serielle Ausgabe ab hier - kann auskommentiert werden
Serial.print(F("\nEs wird in Datei geschrieben: "));
Serial.println(filename);
/* if(now.day()<10) //Wenn Tag kleiner als 10 ist, schreibe eine 0 vorweg
Serial.print('0'); */
Serial.print(now.day(), DEC);
Serial.print('.');
/* if(now.month()<10) //Wenn Monat kleiner als 10 ist, schreibe eine 0 vorweg
Serial.print('0'); */
Serial.print(now.month(), DEC);
Serial.print('.');
Serial.print(now.year(), DEC);
Serial.print(' ');
Serial.print('-');
Serial.print(' ');
/* if(now.hour()<10) //Wenn Stunde kleiner als 10 ist, schreibe eine 0 vorweg
Serial.print('0'); */
Serial.print(now.hour(), DEC);
Serial.print(':');
/* if(now.minute()<10) //Wenn Minute kleiner als 10 ist, schreibe eine 0 vorweg
Serial.print('0'); */
Serial.print(now.minute(), DEC);
Serial.print(':');
/* if(now.second()<10) //Wenn Sekunde kleiner als 10 ist, schreibe eine 0 vorweg
Serial.print('0'); */
Serial.print(now.second(), DEC);
Serial.print(' ');
Serial.print("(UTC)");
Serial.print("\r\n ");
Serial.print(buffer); //Meldung Nr. [index] ausgeben
Serial.print("\r\n\r\n");
//Serielle Ausgabe Ende
//Schreiben in Logdatei
/* if(now.day()<10) //Wenn Tag kleiner als 10 ist, schreibe eine 0 vorweg
Serial.print('0'); */
logfile.print(now.day(), DEC);
logfile.print('.');
/* if(now.month()<10) //Wenn Monat kleiner als 10 ist, schreibe eine 0 vorweg
logfile.print('0'); */
logfile.print(now.month(), DEC);
logfile.print('.');
logfile.print(now.year(), DEC);
logfile.print(' ');
logfile.print('-');
logfile.print(' ');
/* if(now.hour()<10) //Wenn Stunde kleiner als 10 ist, schreibe eine 0 vorweg
logfile.print('0');*/
logfile.print(now.hour(), DEC);
logfile.print(':');
/* if(now.minute()<10) //Wenn Minute kleiner als 10 ist, schreibe eine 0 vorweg
logfile.print('0');*/
logfile.print(now.minute(), DEC);
logfile.print(':');
/* if(now.second()<10) //Wenn Sekunde kleiner als 10 ist, schreibe eine 0 vorweg
logfile.print('0');*/
logfile.print(now.second(), DEC);
logfile.print(' ');
logfile.print("(UTC)");
logfile.print("\r\n ");
logfile.print(buffer);
logfile.print("-------------------------------------------");
logfile.print("\r\n\r\n"); //Absätze
logfile.close(); //Schließe die Datei
//Schreiben Ende
}
delay(5);
alt_index2 = alt_index;
alt_index = index;
}
Hat jemand eine Idee, wie ich das beheben kann?
Gruß,
Jannomag