Go Down

Topic: Datenlogger bauen, aber wie? (Read 5 times) previous topic - next topic

sambuka06

So, habe mir aus einer Lochrasterplatine und ein paar Bauteilen eine Art aufsteckbaren Prototyp gebastelt.
Diesen immer wieder um eine Funktion erweitert, bis jetzt fast alles funktioniert. Eine gute Hilfe war der
Pap-Designer, um mir eine Programmstruktur vorzubereiten.

Leider verzweifle ich an zwei Problemen:

1.

Habe eine RTC mit Batterie verbaut, doch wenn man den Arduino vom Netzteil nimmt und wieder ansteckt,
fängt er wieder von der Uhrzeit und Datum der Programm-Übertragung an zu zählen.

Ich habe gedacht, wenn ich die RTC mit

Code: [Select]
    RTC.begin(DateTime(__DATE__, __TIME__));

stelle, läuft die Uhr über die Batterie weiter!?, auch wenn ich den Arduino vom Netzteil trenne und später wieder
anstöpsel.

2.

Mein Zweites Problem ist die Log-Schleife. Ich möchte ja im Fehlerfall ein Log auf die SD schreiben. Leider funktioniert
das nur beim ersten Durchlauf.

Ich benutze folgrnden Code in der void loop():

Code: [Select]

   if (!SD.begin(chipSelect))
   {
    Serial.println("Card failed, or not present");
    return;
   }
    Serial.println("card initialized.");

    File dataFile = SD.open("datalog.txt", FILE_WRITE);

    if (dataFile)
   {
      DateTime now = RTC.now();
      dataFile.println("");
      dataFile.print("*Ein* - ");
      dataFile.print(now.year(), DEC);
      dataFile.print('/');
      dataFile.print(now.month(), DEC);
      dataFile.print('/');
      dataFile.print(now.day(), DEC);
      dataFile.print(' ');
      dataFile.print(now.hour(), DEC);
      dataFile.print(':');
      dataFile.print(now.minute(), DEC);
      dataFile.print(':');
      dataFile.print(now.second(), DEC);
      dataFile.println();
      dataFile.close();
    } 
    else
    {
     Serial.println("error opening datalog.txt");
    }



Nätürlich mit ein paar Funktionen noch dazwischen. Die Schleife läuft ein mal durch logged die simulierten Fehler,
wartet dann 20 Sekunden und läuft erneut an. Bleibt aber immer in "Card failed, or not present" im 2. Anlauf hängen.


uwefed

Code: [Select]
RTC.begin(DateTime(__DATE__, __TIME__));
Nimmt das nicht die Systemzeit des PC im Moment des kompilierens und inizialisiert damit die RTC? Das darfst Du nur zum Setzen der RTC nutzen und dann aus dem Sketch löschen.
Grüße Uwe

michael_x

Quote
Das darfst Du nur zum Setzen der RTC nutzen und dann aus dem Sketch löschen.

Oder du fragst vorher ab, ob die Uhr läuft.

In meiner RTCLib für DS1307 geht das z.B. so:

Code: [Select]

void setup ()
{
  RTC.begin();
  if (! RTC.isrunning())
     RTC.adjust(DateTime(__DATE__, __TIME__));
...
}


Wenn die Batterie richtig angeschlossen ist, und die Uhr einmal gesetzt war, sollte isrunning() true zurückliefern.
Es gibt mehr RTC Libraries als Uhrenbausteine, aber das entsprechende Statusbit des DS1307 sollte jede Library liefern ...

michael_x

Quote
... Log auf die SD schreiben. Leider funktioniert das nur beim ersten Durchlauf.


Versuch mal, das SD.init() nur einmal, (im setup) aufzurufen. Das sollte einen Schritt weiter helfen.

Das Problem danach ist, dass du vermutlich die SD-Card nicht im laufenden Betrieb wechseln kannst, sondern nach einem Schreib-Fehler ein Reset brauchst.
Dafür gibt es irgendwo auch eine Lösung, (glaub ich) aber die finde ich im Moment nicht.


ESLEagleEye

Du möchtest mit einem Arduino professionell für die Wareneingangskontrolle im Betrieb benutzen, bist aber nur bereit das Geld für eine billige PRODUKTFÄLSCHUNG auszugeben??? Ich will nichts gegen die Boards, die vom Arduino "inspiriert" wurden, sagen. DIESES Board ist aber echt die Höhe, auch noch widerrechtlich die Arduino-Marke zu benutzen.
Mal abgesehen davon, dass ein dicker Widerspruch in der Produktbeschreibung enthalten ist.

Topic: Also wenn die spätere Anwendung bekannt ist, dann lässt sich die spätere Last ja (je nach Anwendungsgebiet) durch eine passende Ersatzschaltung simulieren.

Go Up