AUF-BRECHEN

sich auf den Weg machen

aufbrechen -
   der Sehnsucht folgen
aufbrechen -
   Mut fassen
aufbrechen -
   Vertrautes verlassen
aufbrechen -
   Neues wagen
… im ersten Schritt
liegt der ganze Weg!


Denkanstoß am Fränkisch-Schwäbischen
Jakobsweg in der Nähe von Heuchlingen

Du kannst das Leben nicht verlängern,
noch verbreiten,
nur vertiefen.


Gorch Fock

Andere Links

Blogverzeichnis - Blog Verzeichnis bloggerei.de

Arduino-Temperatur-Sensor

English short – text:
Here are some pictures of my -Temperature-Sensor.
The three temperature sensors are connected via ethernet cable to a patch panel and then connected to the using a small breadboard.
The orange cable from the patch panel goes to a socket on the breadboard (upper right).
On the , there is a small sketch running, which gets the values from the sensors and offers them to the ethernet vie telnet (TCP, 23).
This setup has a problem with long cable length – the DS18B20 stop corresponding with the – all of them, not only the one far away! You find a patch for the library below to fix this problem.


Hier Bilder von meinem Arduino--Sensor.

Die drei DS 18B20 – -Sensoren sind über Ethernet-Kabel über ein Patchfeld

Arduino-Temp-Sensor - Patchpanel

und ein Breadboard an den Arduino angeschlossen. Das Kabel vom Patchfeld geht dabei auf eine Sockelleiste, welche auf dem Breadboard steckt (rechts oben)

Arduino-Temp-Sensor

Dort läuft ein kleines Programm, welches die Werte ausliest und per Telnet-Server im zur Verfügung stellt.

Auf meiner läuft ein Perl-Programm als minütlicher Cron-Job, der den Arduino abfragt und die Werte in  eine RRD-Datenbank schreibt. Ein andere Cron-Job erzeugt die PNGs, die dann per Web abrufbar sind:
On my Synlogy DS 207+ Diskstation, there runs a perl script every minute and collects the values from the arduino and stores them in a RRD-Database.

Arduino-Temp-Sensor - RRD-Graphen

Die “0-Grad”-Werte kommen vom Umbau des Boards, um es Photo tauglich zu machen – da haben die Sensoren zeitweise mal keine Daten geliefert…

Es gab ein Problem mit langen Leitungen: als ich die Sensoren im Haus verteilt habe und damit Kabellängen bis zu 50 Meter erzeugt habe, blieb die Kommunikation stecken. Das Problem war im Prinzip auch einfach zu lösen: die OneWire-Lib hatte ein Timingproblem. Einige der Spezifikationen wurden am Rand der Werte betrieben, was bei langen Kabeln zu einem Problem mit der Kommunikation führt. Ich habe die Werte etwas angepasst und dann ging es.

Hier mein Patch für OneWire.cpp:

--- OneWire_orig.cpp    2008-05-20 02:10:54.000000000 +0200
+++ OneWire.cpp 2009-04-14 19:30:58.000000000 +0200
@@ -115,8 +115,8 @@
 // more certain timing.
 //
 void OneWire::write_bit(uint8_t v) {
-    static uint8_t lowTime[] = { 55, 5 };
-    static uint8_t highTime[] = { 5, 55};
+    static uint8_t lowTime[] = { 60, 8 };
+    static uint8_t highTime[] = { 8, 60};
    
     v = (v&1);
     *modeReg |= bitmask;  // make pin an output, do first since we
@@ -137,7 +137,7 @@
    
     *modeReg |= bitmask;    // make pin an output, do first since we expect to be at 1
     *outputReg &= ~bitmask; // zero
-    delayMicroseconds(1);
+    delayMicroseconds(3);
     *modeReg &= ~bitmask;     // let pin float, pull up will raise
     delayMicroseconds(5);          // A "read slot" is when 1mcs > t > 2mcs
     r = ( *inputReg & bitmask) ? 1 : 0; // check the bit


Auf Anfrage hier der Code, um die RRD-Graphen zu bauen:

/etc/crontab:

*      *       *       *       *       root    /volume1/web/rrd/get_temp.pl
*/10   *       *       *       *       root    /volume1/web/rrd/make_pictures.pl

get_temp.pl

#!/opt/bin/perl
use RRD::Simple;
use strict;

my $rrd_file="/opt/var/lib/rrd/temp2.rrd";

# Create an interface object
my $rrd = RRD::Simple->new(
 file => $rrd_file,
 cf => [qw(LAST AVERAGE MIN MAX)],
 );

if (! -f $rrd_file ) {
$rrd->create(
 temp1 => "GAUGE",
 temp2 => "GAUGE",
 temp3 => "GAUGE",
 );
}

open my $in, "wget -q   -O - 192.168.178.222:23|" or die;

my @temp;
while(<$in>){
 my ($dummy,$num,$ist) = split(/\t/);
 push @temp,$ist;
}

$rrd->update(
 temp1 => $temp[0],
 temp2 => $temp[1],
 temp3 => $temp[2],
);

Make_pictures.pl:

#!/opt/bin/perl
use RRD::Simple;
use strict;

my $rrd_file="/opt/var/lib/rrd/temp2.rrd";

# Create an interface object
my $rrd = RRD::Simple->new(
 file => $rrd_file,
 );

$rrd->graph(
 destination => "/volume1/web/rrd/",
 source_labels => [ "Temp1","Temp2","Temp3"],
 extended_legend => 1,
);

9 comments to Arduino-Temperatur-Sensor

  • Bernd

    Hi, tolle sache! Ich versuche auch gerade mit DS18S20 temperaturen zu erfassen. Das funktioniert bei mir soweit (ausser mit den Nachkommastellen habe ich irgendwie noch ein problem. er zeigt immer X.75°C an..)
    Wie hast Du das mit den RRD Datenbank und graphen gemacht? Gibt es einen beispiel Code wie man die Temperaturen formatieren muß um die Werte mittels RRD anzeigen zu können?
    Gruß Bernd

    • Hallo Bernd,

      ich schreibe den Code an das Ende des Blogeintrags – ist einfacher als hier im Kommentar…

      zu den X.75 Grad: wenn ich mich richtig erinnere, muss man den Wert, der vom Sensor kommt, irgendwie umrechnen.


      ds3.reset();
      ds3.select(SensorArray[FunctionSensorNumber]);
      ds3.write(0xBE);
      LowByte = ds3.read();
      HighByte = ds3.read();
      TReading = (HighByte < < 8) + LowByte;
      SignBit = TReading & 0x8000; // test most sig bit
      if (SignBit) // negative
      {
      TReading = (TReading ^ 0xffff) + 1; // 2's comp
      result = 0 - TReading * 0.0625;
      } else {
      result = TReading * 0.0625;
      }
      return(result);

      Bin nicht mehr sicher, ob das der richtige Code ist, aber so in etwa müsste es passen... :-)

  • Hey Dirk, mir hat die Idee mit dem Patchpanel sehr gut gefallen, ich habe jetzt selbst etwas ähnliches gebaut und in der Doku auch auch deinen Blog verlinkt, ich hoffe es stört nicht ;)
    Hier: kannst du es dir ansehen: blog.jfkreuter.de

    vielen Dank für den Artikel hier, er hat mich weitergebracht!

  • Stefan D

    Hallo,
    bin durch Zufall auf den Blog gestossen und muss sagen: das ganze interssiert mich sehr. Hast du eine Art Bauanleitung?

    • Nein, leider bisher nicht dokumentiert. Ein Freund ist aber gerade auch dabei, etwas ähnliches zu machen, da werde ich dann mal die Doku basteln und hier unterbringen.

      Der Anschluß der Ds18B20 ist aber äusserst trivial – einfach mal im Blog / Playground unter http://arduino.cc/ schauen, da gibt es die OneWire-Library und darin bestimmt auch die Beispiele für die Schaltung. Lediglich bei LANGEN Kabeln den Wiederstand etwas verringern, sonst klappt die Kommunikation nicht.

  • Stefan D

    Wow, das nenne ich ne schnelle Antwort!
    Ich habe mich vielleicht etwas ungenau ausgedrückt. Arduino an Temp-Sensor DS1820 ist klar (s.o.).
    Mich würde eher die Ethernet Anbindung (Patchset) und dessen Verkabelung(Anschluss) intererssieren. Ich möchte über mein Hausnetz die Temperatur des Sensors auslesen (WebBrowser).

  • [...] Wenn die Daten im zweiten Arduino ankommen, werde ich sie dort zählen und per RRD-Tool in Grafiken darstellen. Damit sind die Grafiken per Browser abrufbar. Die Erzeugung der RRD-Grafiken erledigt meine Synology Diskstation. Siehe dazu auch das Temperatur-Messprojekt. [...]

  • [...] als noch hier beschrieben, sind die Sensoren über das Patchfeld nun in “Reihe” geschaltet: Jeder [...]

Leave a Reply

  

  

  

Please copy the string mZnlSZ to the field below: