I am logging S0 impulses -
The impulses are count and written to to card every ten minutes.
At 23:59 last entry will be written to the card and an new file will be created for the next day ( e.g. 20141116.CSV)
Problem is that the logger shield stops writing without any reasons during the day. (see attached files)
I have formatted the SD Card with sdformatter 4.0 as you told in the instructions and tried with different cards.
Hope you can help, even the program is written in german
Regards
DJ
Code: Select all
/*
Strom Impulese Logger Version 11.0 Final
S0 Log über 24 Stunden alle 10 Minuten
Letzte Änderung am 12.10.2014
DJ Scharff
Programm zu Erfassung Impulsen eines S0 Stromzählers
Der Impulsausgang vom Stromzähler muss an + 5 V Arduino PIN 2 und GND angeschlossen werden.
Benutzung auf eigene Gefahr !!! USE AT YOUR OWN RISK !!!
Zähler = saia burgess ALD1D5F10 1000 Impulse = 1 kHh
*/
#include <Time.h>
#include <Wire.h>
#include <DS1307RTC.h> // a basic DS1307 library that returns time as a time_t
#include <SD.h>
File myFile;
static boolean RunAction = true; // für einmal zählen
const int S0B = 2; // Pin 2 für S0 Eingang
long Impulse = 0; // Zähler für Impuls
long Imps = 0; // Impulse summiert
int Jahr = 1000;
int Monat = 12;
int Tag = 10;
int Stunde = 10;
int Minute = 10;
int Sekunde = 10;
static boolean pw = true; // Prüfwert Tag
char filename[8];
int x = 0;
long Wartezeit = 0;
long Warten = 0;
long Karte = 0;
// Setup Teil des Programms
void setup() {
pinMode(1, OUTPUT); // Grüne LED
pinMode(4, OUTPUT); // Rote LED
pinMode(5, OUTPUT); // Gelbe LED
pinMode(S0B, INPUT); //Pin 2 für den S0 Anschluß
setSyncProvider(RTC.get); // the function to get the time from the RTC
pinMode(10, OUTPUT); // Dieser Block ist wichtig hier wird geöffnet , geschrieben, geschlossen
if (!SD.begin(10)) {
digitalWrite(1, HIGH); // Grüne LED an
digitalWrite(4, HIGH); // Rote Led an
digitalWrite(5, HIGH); // Gelbe LED an
return;
}
digitalWrite(1, LOW); // Grüne LED aus
digitalWrite(4, LOW); // Rote LED aus
digitalWrite(5, LOW); // Gelbe LED aus
// Warten bis 0 10 20 30 40 50 Minuten erreicht sind dann das Programm starten
digitalWrite(5, HIGH); // Gelbe LED dauerhaft an
while (minute() != 0 && minute() != 10 && minute() != 20 && minute() != 30 && minute() != 40 && minute() != 50 ){
}
digitalWrite(5, LOW); // Gelbe LED aus
digitalWrite(1, HIGH); // Grüne LED an
}
// ********************Hauptschleife*************************
void loop(){
Warten = minute();
Warten = Warten + 10; // + Dauer des Zählzyklus in Minuten (10)
Karte = Warten -1;
if (Warten >= 60)
Warten = Warten-60;
if (Karte >= 60)
Karte = Karte-60;
do { // Zählschleife
if (digitalRead(S0B) == HIGH) {
digitalWrite(5, HIGH); // Gelbe LED an wenn Impuls vom Zähler
if(RunAction) { // 1 Impuls einmal zählen
Impulse = (Impulse + 1);
Imps = (Imps + 1);
RunAction = false;
}
}
else {
digitalWrite(5, LOW); // Gelbe LED aus
RunAction = true;
}
if (Karte == minute())
digitalWrite(4, HIGH); // Eine Minute vor dem Schreiben rote LED an
if (hour() == 23 && minute() == 59 && second() >= 59 && pw == true) {
pw = false;
druck(); // Funktion Druck aufrufen
Imps = 0;
Warten = 10; // Testweise erfolgt dieser Eintrag um den nächsten Eintrag um 00:10 zu generieren
Karte = 9; // Testweise erfolgt dieser Eintrag um den nächsten Eintrag um 00:10 zu generieren
}
}
while (Warten != minute()); // Ende der Zählschleife
// Daten auf SD Karte schreiben
pw = true;
druck(); // Funktion Daten auf SD Karte schreiben aufrufen
} // Hier Ende des Hauptschleife - Zurück auf Anfang
// Funktion Druck
// Daten werden auf SD Karte geschrieben
void druck()
{
Jahr = year();
Monat = month();
Tag = day();
Stunde = hour();
Minute = minute();
Sekunde = second();
sprintf(filename, "%04d%02d%02d.csv", Jahr, Monat, Tag);
myFile = SD.open(filename , FILE_WRITE);
myFile.print(Jahr);
myFile.print("-");
if (Monat < 10)
myFile.print('0');
myFile.print(Monat);
myFile.print("-");
if (Tag < 10)
myFile.print('0');
myFile.print(Tag);
myFile.print(";");
if (Stunde < 10)
myFile.print('0');
myFile.print(Stunde);
myFile.print(":");
if (Minute < 10)
myFile.print('0');
myFile.print(Minute);
myFile.print(":");
if (Sekunde < 10)
myFile.print('0');
myFile.print(Sekunde);
myFile.print(";");
myFile.print(Impulse);
myFile.print(";");
myFile.print(Imps);
myFile.println();
myFile.close();
Impulse = 0;
digitalWrite(4, LOW); // Rote LED aus
}