[gelöst] Temperatur Logger, mit DS18B20

Nabend...
also, habe es jetzt hinbekommen, hatte die falsche SD-Libraries.
Jetzt klappt es. Vielen Dank.
Zwei Fragen noch, wie kann ich es ändern, das er mir statt einer *.CSV eine *.TXT Datei erstellt?
Habe es so probiert:

// create a new file
  //char filename[] = "LOGGER00.CSV";
 char filename[] = "DATALOG.TXT";
 for (uint8_t i = 0; i < 100; i++) {
    filename[6] = i/10 + '0';
    filename[7] = i%10 + '0';
    if (! SD.exists(filename)) {
      // only open a new file if it doesn't exist
      logfile = SD.open(filename, FILE_WRITE);
      break; // leave the loop!
    }
  }

Aber das hat nicht geklappt :~

Und wo ändere was, damit er nicht andauernd eine Neue Datei anfägt?
Ich möchte, das er immer in die selbe Datei schreibt, auch wenn er mal neu gestartet wird.

Vielen Dank für die tolle Hilfe bis jetzt, Suuper Forum mit klasse Leuten hier ! Daumen hoch !!

Hallo,
wenn ich das einfüge meckert er wieder.

thewknd:
habe deinen Code übernommen und
#include <RTC_DS1307.h>hinzugefügt.
Nun wird alles ohne Probleme kompiliert

Binary sketch size: 24538 bytes (of a 126976 byte maximum)

Aber ich habe es zum laufen bekommen (siehe Post drüber)
Aber Danke für die schnelle Hilfe.

versuch es damit

char filename[] = "DATALOG.TXT";
logfile = SD.open(filename, FILE_WRITE | O_APPEND);

Hi thewknd,
danke für den Code, funktioniert Super... VIELEN DANK !!!

Nu läuft ja alles so wie es soll... Eigentlich...
Es ist ja schön und gut das die Daten auf der SD-Karte geschrieben werden,
aber wie kann ich denn jetzt von Extern, darauf zugreifen, um sie auszuwerten bzw. Grafisch darzustellen?
Also Ethernet ist hinzugefügt und er zeigt mir auf der mini HP die aktuell gemessene Temperatur an.

Ich würde gern per wget die Log-Datei auf einem anderen Rechner lesen/speichern

wget http://192.168.178.216/DATALOG.TXT

Oder wie macht Ihr das ?

Hallo,

ich bereite die auf SD-Karte geschriebenen Daten mit dem Arduino so auf, dass ich sie mit dem Programm
LogView per USB lesen und darstellen kann. Finde die Darstellung echt gut gelungen. Ein entsprechendes Beispiel
findes Du in der Datei LogLesen.pde, die ich Dir schonmal geschickt habe. Habe die Daten aber auch schon in eine
Exel-Datei verwandelt. Eine graphische Auswertung sollte damit auch möglich sein.

Gruss Kalli

Kurze Frage, welches Ethernet-Shield verwendest Du? Wenn es das mit dem WIZ5100 Chip ist (ist das teurere Shield) ist, dann sollte das Übertragen größerer Datenmengen kein Problem sein. Bei dem "billig" Shield mit ENC28J60 wird das schwierig, da die Lib nicht mehrere TCP-Pakete in einer Verbindung verschicken kann, damit kannst Du ohne komplizierte Anpssungen der Lib nicht mehr als knapp 1500 Bytes auf einen Request verschicken. Das Problem hatten hier schon mehre Leute im Forum.
Ansonsten kannst Du Dich an das Beispiel "WebServer" der Ethernet Bibliothek halten, da findest Du Code mit dem man auf einen HTTP-Request Daten verschickt.
Aufpassen musst Du beim gleichzeitigen Benutzen der SD-Karte und des Ethernet-Chips, da beide die SPI Schnittstelle verwenden.

Hi,
also ich nutze das mit dem WIZ5100 Chip.
@ Kalli: Mit USB geht nicht, da das Ding so verbaut wird, das es zu weit von einem PC weg ist und
nur Netzwerkanschluss hat.

Also, habe es mit wget versucht, leider holt er nur die HTML Datei bzw. das was sie anzeigt ab.
Mit dem BeispielSkript "Webserver" werde ich mich jetzt mal beschäftigen...

Mal sehen ob ich's verstehe... :roll_eyes:

Hallo Kalli,
erstmal vielen Dank für Dateien.
Ich weiss nicht was die Datei LogLesen.pde genau macht. :blush:
Bereitet sie die Daten so auf, das man sie von der SD Karte auslesen kann? Z.B. mit einem Texteditor?

Kalli:
Hallo,

ich bereite die auf SD-Karte geschriebenen Daten mit dem Arduino so auf, dass ich sie mit dem Programm
LogView per USB lesen und darstellen kann. Finde die Darstellung echt gut gelungen. Ein entsprechendes Beispiel
findes Du in der Datei LogLesen.pde, die ich Dir schonmal geschickt habe. Habe die Daten aber auch schon in eine
Exel-Datei verwandelt. Eine graphische Auswertung sollte damit auch möglich sein.

Gruss Kalli

Also, wenn ich das richtig sehe, dann wird hier(siehe Code) der Request mit einer leeren Seite quittiert.
Wenn ich wget http://192.168.178.216/ aufrufe, lädt er mir eine leere Datei runter, weil ja nix angegeben ist, oder versteh ich das falsch?

 EthernetClient client = server.available();
  if (client) {
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println();

Wenn das bis jetzt richtig wäre, müsste ich doch beim letzten

client.println();

die Datei (DATALOG.TXT) angeben, damit ich sie runterladen kann, Oder föllig miss verstanden? :frowning:

Noch eine Frage,habe bei google irgendwie nix gefunden, kann den Sketch/Code auf die SD-Karte packen? Mein Sketch hat jetzt schon 29660bytes von max 32256bytes

Cetax:

client.println();

die Datei (DATALOG.TXT) angeben, damit ich sie runterladen kann, Oder föllig miss verstanden? :frowning:

Noch eine Frage,habe bei google irgendwie nix gefunden, kann den Sketch/Code auf die SD-Karte packen? Mein Sketch hat jetzt schon 29660bytes von max 32256bytes

Im Prinzip schon, aber nicht die Datei gibst Du an, sondern Du musst diese Schrittweise einlesen und an den Client ausgeben. Datei auf der SD-Card öffnen, Daten aus der Datei lesen und per client.print() an den Client schicken. Und hier greift dann ggf. das Problem des gleichzeitigen Lesens von SD und Senden per Ethernet.
Achtung, das leere client.println(); ist wichtig. Damit weiss der Browser (wget) das der HTTP-Header zuende ist und die Daten anfangen. Also erst nach dem leeren client.println(); Deine Ausgabe einbauen.

Hallo Stefan,

Ich weiss nicht was die Datei LogLesen.pde genau macht.
Bereitet sie die Daten so auf, das man sie von der SD Karte auslesen kann? Z.B. mit einem Texteditor?

Generell erfolgt die Ausgabe der Daten auf SD-Karte in einem Format, das man mit jedem Texteditor lesen kann.
Mein Logger unterteilt sich in zwei Teile (mit Dil-Schalter einstellbar). Im ersten Teil erfolgt die Ausgabe der Daten,
bis der 1. Dil-Schalter wieder ausgeschaltet wird. Im zweiten Teil werden die Daten von der SD-Karte gelesen und etwas
aufbereitet per USB an LogView übergeben. Es hat sich herausgestellt, dass das byteweise Lesen von der SD-Karte
und die Ausgabe per USB teilweise fehlerhaft ist. Deshalb werden erst die Daten eingelesen und als geschlossener Block
über USB ausgegeben.
Zur Zeit werden noch Zeit und Temp-Daten in getrennten Dateien ausgegeben. Soll sich aber auch noch ändern. Für eine Exel Datei kann man ganz einfach beide Dateien zusammenfügen, da es Text-Dateien sind. In dem Programm können max. 6 DS-18B20 angeschlossen werden. Zur zeit benutze ich vier.

Gruss Kalli

Hallo,
ich habe da nochmal eine Verständnis Frage, folgendes Szenario:
Der Arduino misst die Temperatur und schreibt sie eine Logdatei,
ohne sie auf einer Webseite wieder zugeben.
Kann ich dann ohne Problem die Daten per FTP oder telnet abrufen ?

Arduino -->Logfile -->Ethernet

Dann dürfte sich doch nichts beissen, oder nicht ?

Danke für Eure Hilfe und Geduld :blush:

Cetax:
Hallo,
ich habe da nochmal eine Verständnis Frage, folgendes Szenario:
Der Arduino misst die Temperatur und schreibt sie eine Logdatei,
ohne sie auf einer Webseite wieder zugeben.
Kann ich dann ohne Problem die Daten per FTP oder telnet abrufen ?
Arduino -->Logfile -->Ethernet

Dann musst Du Deinem Arduino aber auch FTP oder telnet beibringen. Denn so wie Du es beschreibst, ist der Arduino der Server, denn der loggt ja die Daten.
Das Problem bleibt aber das Gleiche, Dein Arduino hat die Daten und Du musst sie per Ethernet abholen. Dabei ist dann HTTP immer noch viel einfacher als telnet oder ftp.
Wo ist denn Dein Problem, wenn Du den Webserver schon hast. Du musst lediglich noch die Datei auf der SD-Karte öffnen und dann die Daten in einen Puffer lesen und den dann an den verbundenen Webclient (Browser, wget etc.) ausgeben.

Hi,
ok danke für die erläuterung, ich glaube ich verstehe.
Vielleicht denke ich auch zu kompliziert oder zu einfach... :~

Wo ist denn Dein Problem, wenn Du den Webserver schon hast. Du musst lediglich noch die Datei auf der SD-Karte öffnen und dann die Daten in einen Puffer lesen und den dann an den verbundenen Webclient (Browser, wget etc.) ausgeben.

Das ich nicht verstehe wie ich das umsetzten soll. :blush:
Was du geschrieben hast, verstehe ich (glaub ich..).

  • DATALOG.txt öffnen -->Inhalt in den Puffer schieben -->Webclient ruft den Puffeinhalt ab (z.b. wget)

Und da verließen sie mich.. Sorry...
Und ich glaube, das der Sketch zu groß wird, er hat jetzt schon 29660bytes

Ist es Hilfreich, den Sketch zu Posten?
Danke !

Ja, der Code wäre sicher hilfreich. Aber bitte in "#" Tags. Evtl. auch als Anhang, denn ich vermute mal das ist nicht wenig :slight_smile:
Evtl. kann man ja das eine oder andere optimieren, damit der Webservice auch noch mit dazu passt.

Hallo,
erstmal ein großes Danke für deine Hilfe und Mühe !!
Ich habe aber noch eine Fage.
Wäre es einfacher, ich würde alles wegwerfen und neu anfangen (Theoretisch :grin:)
Folgende Vorstellung:

DS18B20 --> Arduino Ethernet -->LAN-Kabel --> WebServer (Synology DS111)

Soll heißen, der Arduino misst die Temperatur und mein Webserver ruft die Temperatur ab und speichert sie in einer Text-Datei (z.b. Log.txt)
Dann hätte ich doch nicht das Problem mit der SD-Karte und dem Ethernet Pin, oder ?
Und der Code wäre kleiner und der Arduino vielleicht nicht überlastet.

Oder geht das so nicht ? (Is ja nur so´ne Idee :roll_eyes:)

Ich pack den Sketch mal als Anhang...

Temp_Logger_1.ino (4.72 KB)

Dann mach doch aus dem Arduino einen Webclient, keinen Webserver.
Der Arduino misst die Temperatur und ruft auf Deinem Webserver eine URL (z.B. http:///senddata.php?temp1=10.3&temp2=23) auf. Der Synology-Webserver kann auch PHP, Du kannst dort also ohne Probleme die Daten verarbeiten und in eine Datei schreiben. Außerdem sparst Du Dir so den Cronjob auf dem NAS das alle X Minuten den Arduino abfragt. Meine Arduino-Wetterstation funktioniert auf diese Weise sehr stabil seit einem halben Jahr. Ich habe mir sogar die RTC gespart und frage einmal täglich über eine spezielle URL von Webserver die Zeit ab. Das spart den Code für eine NTP-Funktion, denn ein HTTP-Get musste ich ja eh bauen.
Ein weiterer Vorteil ist, das der Arduino den Zeitpunkt zum Senden der Daten bestimmen kann und nicht immer auf ankommende Requests warten muss.

dafür hast du den grossen Nachteil, dass

  • wenn das NAS nicht läuft
  • wenn das Netzwerkkabel nicht eingesteckt ist
    du keine Messwerte hast.

Dafür ist ja die SD-Karte da, dort werden die Daten lokal gespeichert. Der Zugriff selbst kann auch wieder indirekt erfolgen. z.B. durch aufrufen eine URL http:///service.php
Das kann der Arduino regelmäßig pollen und dort stehen z.B. Befehle wie
"send 2012-04-19.csv" drin. Damit kann der Arduino in einer "Messpause" die Datei von der SD-Karte per HTTP-Post an den Webserver hochladen.
Das kann man sicher auch alles anders lösen. Es gibt immer verschiedene Wege zum Ziel. Bei meiner Lösung war mir wichtig, das der Arduino Wetterdaten sammelt und nicht die meiste Zeit damit verbringt auf einen HTTP-Request zu warten, oder von einem Request im ungünsitgen Zeitraum erwischt wird.

Hallo mkl0815,
Das hört sich super an.
Nur wie das funktionieren soll mit dem übergeben der gemessenen Temperatur, versteh ich nicht.
Bin jetzt auf die Arbeit,werde mich heute Abend mal dran setzen.
Aber erstmal vielen Dank den Lösungsvorschlag.
Ich werde aber bestimmt für die Umsetzung deine Hilfe brauchen.

PS: Eine Wetterstation habe ich auch, WS2300.