Datenlogger bauen, aber wie?

Ich muss einen Datenlogger bauen und weiß ehrlich gesagt gar nicht wie ich anfangen soll.

Das Ziel ist es, 20 Relais einem Dauertest zu unterziehen, wobei in einem Fehlerfall ein Log auf eine SD-Karte geschrieben werden soll.
Die Relais werden in gewissen Zeitabständen mit einer Siemens Logo ein und ausgeschaltet. Spannung an den Kontakten soll 5V sein.

Ich habe mir gedacht, ich besorge mir dieses fertige Atmega-Board:

http://www.ebay.de/itm/Arduino-compatible-Mega-2560-ATmega2560-16AU-Board-Free-USB-Cable-/230827575561?_trksid=p5197.m1992&_trkparms=aid%3D111000%26algo%3DREC.CURRENT%26ao%3D1%26asc%3D14%26meid%3D2141060091196537560%26pid%3D100015%26prg%3D1006%26rk%3D2%26

Meine 20 Signale (5V) lege ich dann z.B. an Pin 22-44 als Eingang. Ein zusätzlicher Eingang soll Signal von der Logo bekommen (z.B. Pin 45), der übermittelt,
wann die Relais ein- oder ausgeschaltet sein sollen.

Jetzt soll in gewissen Abständen verglichen werden. Pin 45 gibt das Signal vor und Pin 22-44 sollen gleich sein. Bleibt ein Relais kleben oder zieht nicht an,
soll diese Information mit Uhrzeit und Nummer des Eingangs auf eine SD-Karte hinterlegt werden.

Das Ganze soll zur stichprobenartigen Wahren-Eiganskontrolle von unseren Relais verwendet werden.

Ich hoffe, mir kann jemand ein wenig unter die Arme greifen. Fange gerade erst mit Mikrocontrollern an =(

Ich sehe da ein Gedankenproblem. Ein Relais ohne Verbraucher zu schalten (oder in Deinem Fall mit einem minimalen Verbraucher: den pullup oder pulldown Widerstand) simuliert keinesfalls die realen Bedingungen in denen das Relais dann in der Schaltung betrieben wird.
Außerdem (hab mal einige Datenblätter zufällgig ausgesuchter Relais angesehen) garantieren die Hersteller 10 Millionen bis 100 Millionen Schaltzyklen für die Mechanik und 100000 bis 500000 Schaltzyklen für die Kontakte bei Nominallast.
Ein Hersteller gibt die maximale Schaltfrequenz bei der die Schaltzyklen für die Mechanik garantiert weden mit 10 Schaltzyklen pro Sekunde an und alle 2 Sekunden für die Kontakte ein anderer Hersteller alle 3 Sekunden.
Das wären dann im ersten Fall ca 11,5 Tage Dauertest mit 0,5 Hz (alle 2 Sekunden) für die Kontakte und 116 Tage für die Mechanik.
Im 2. Fall wären das mindestens 3,5Tage Duertest für die Kontakte.

Welches Relais mußt Du testen?

Grüße Uwe

Die Relais sind in digitale 2-Punktregler eingebaut, den Typ der Relais kenne ich nicht. Es geht auch nicht darum die maximale Schaltzahl in 11 Tagen zu erreichen. Ich möchte einen Test von 6-12 Stunden fahren können und 250-400 mal schalten lassen. Das Ganze am besten über Nacht und morgens dann gucken ob ein Reglerausgang eine Macke hat.

Wenn's eine SD Karte sein soll, nimmst du am einfachsten ein DataLogger Shield mit Uhr. Kostet allerdings mehr als dein HongKong-Mega-Nachbau.
Und ob die I2C und SPI Schnittstellen mit den Pins auf deinem ATMega zusammenpassen, solltest du auch klären.

Ansonsten kannst du auch die serielle Schnittstelle als Logger nehmen, und entweder die Uhrzeit darüber an den Arduino senden,
oder die Auswertung (Zeitstempel) gleich am PC programmieren.

Als RTC-Clock wollte ich diese nehmen:

http://www.ebay.de/itm/180874695555?ssPageName=STRK:MEWAX:IT&_trksid=p3984.m1423.l2649

Ist mit dem Board kompatiebel, da gleicher Hersteller.


Das SD-Kartenmodul soll dieses werden:

http://www.komputer.de/zen/index.php?main_page=product_info&products_id=122

--

Das Datalogger-Shield sollte aber auch drauf passen, die Pinne sind gleich (soweit ich das gesehen habe).

Die sehen auch gut aus, bei einzelnen Modulen im Gegensatz zu einem Shield ist man mit der Pinbelegung ja flexibel.

Wo ist also dein Problem ?
Was bedeutet " aber wie? " im Titel?

Mal abgesehen davon, dass Uwe natürlich recht hat, mit

  1. Relais-Kontakt-Belastung macht einen großen Unterschied
  2. Um Aussagen über die Standfestigkeit zu machen, muss man die Relais in langen Dauertests kaputt machen.

Was spricht dagegen das von einem "richtigen" Computer loggen zu lassen und den Arduino nur wie einen IO Adapter zu nutzen?

Es sind ja nicht nur die Relais, die ab und zu zicken machen, manchmal spiennen auch die Regler.

Einen zusätzlichen PC würde ich ungern verwenden, da das Gerät auch in Schalträumen von nicht so versierten Mitarbeitern benutzt werden soll. :smiley:

--

Das "Wie" in meiner Frage bezieht sich auf die Programmierung. Um ehrlich zu sein, habe ich bis jetzt mal eine LED über einen Mikrocontroller angesteuert.

Dieses hier soll mein erstes, großes Projekt werden.

Die Karte würde ich so einbinden und dann weis ich nicht mehr so richtig weiter...

// SD-Karte vorbereiten
#include <SdFat.h>
#include <Wire.h>
Sd2Card card;
SdVolume volume;
SdFile root;
SdFile file;
void setup(void)
{
card.init();
volume.init(card);
root.openRoot(volume);
char name[] = "LOGGER00.CSV"; // Neue csv-Datei erzeugen
for (uint8_t i = 0; i < 100; i++) {
name[6] = i/10 + '0';
name[7] = i%10 + '0';
if (file.open(root, name, O_CREAT | O_EXCL | O_WRITE)) break;
}
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
}

Ich würde bei einem solchen Projekt nicht mit der Programmierung anfangen, sondern erstmal planen, dann einzelne Details testen und dann erst alles zusammenbauen und das finale Programm schreiben.

Als ersten Ansatz kannst Du z.B. das Signal das von der Logo (das geschaltet wird) auf einen Interrupt-Pin legen. In der Serviceroutine werden dann einfach alle Eingänge die durch die Relais geschaltet werden abgefragt und ein "Flag" gesetzt. In der Loop wird einfach immer nur auf das "Flag" gewartet. Ist es gesetzt, werden die ausgelesenen Daten nebst Uhrzeit in das Logfile geschrieben und danach das Flag gelöscht.

Das Projekt gliederst Du in mehrere Teilprojekte

  1. SD-Card beschreiben: Hier solltest Du am Ende Funktionen haben, denen Du nur noch die zu schreibenden Daten übergbist
  2. Uhrzeit: Setzen und Auslesen der RTC. Erweiterung der SD-Card Funktionen, um die Uhrzeit in ein Logfile zu schreiben
  3. Auslesen der Relais-Pins in eine sinnvolle Datenstruktur. Erweitern der SD-Card Funktionen, um die Daten in das Logfile zu schreiben (inkl. Uhrzeit)
  4. Event-gesteuertes Auslesen der Relais-Pins (wenn das Signal von der Logo kommt) und Schreiben der Logdaten

Dann bist Du auch schon fertig :slight_smile:

Achso, Testen und Dokumentieren ist auch ganz wichtig. Das Testen beinhaltet auch einen Negativtest, also mit einem definitiv defekten Relais (kann auch erzwungen sein), um sicher zu sein, das die aufgezeichneten Daten korrekt sind.

Mario.

ÖÖÖÖÖ,

mal ne Frage, wenn Du mit ner Logo arbeitest, warum dann noch nen Adru?

In der Logo:

Signale der Kontakte einlesen, mit Signal einen Zähler erhöhen/ reduzieren
Relais schalten,
Signal einlesen, gegenteilige Aktion der Zähler mit dem Einlesen der Kontakte
(Also wenn Dein Öffner mit der '1' den Zähler +1 gesetzt hat, dann mit der 'und nicht' Abfrage, geöffneter Öffner, den Zähler um ein herunter zählen)
Relais auschalten
und so weiter.

Wenn dann einer der Zähler aus einem Bereich heraus läuft, dann sind Impulse verloren gegangen.

Die Kontakte kannst Du dann ja mit 'Normlasten' belasten, über die Logo kannst Du ja auch die Frequenz einstellen, mit der das System arbeiten soll.

Ichhabe dies mit einer Easy und einem Initiator umgesetzt,, und ein defektes Schaltgerät gefunden..

Greetz, Linpotec

btw, das mit dem Datenlogger, dem Watterott hat mit sehr geholfen, bei meinem Projekt gehts jetzt auch langsam weiter...

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:

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

    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.

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():

   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.

 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

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:

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 ...

... 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.

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.