Dallas 1-wire Bus: Unterschied zwischen den Versionen

Aus Ethersex_Wiki
Wechseln zu: Navigation, Suche
(PHP)
(Der Seiteninhalt wurde durch einen anderen Text ersetzt: „[http://ethersex.de/index.php/Onewire_%28Deutsch%29 Onewire im neuen Wiki] Category:Ethersex Category:StepByStep [[Category:One…“)
 
(19 dazwischenliegende Versionen von 12 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
== Onewire interface ==
+
[http://ethersex.de/index.php/Onewire_%28Deutsch%29 Onewire im neuen Wiki]
 
 
Ethersex kann 1-wire Temperatursensoren mit [[ECMD]] auflisten und abfragen. Es wird eine reine Softwareimplementierung des Protokolls benutzt, was keine weiteren Hardware erfordert, als die Temperatursensoren selbst. Dabei muss beachtet werden, dass der Datapin des Buses in der Standardkonfiguration auf PD6 liegt (kann in der pinning/generic.m4 geändert werden)
 
 
 
===  Onewire Befehle ===
 
 
 
unter Linux als erstes netcat starten (hierbei natürlich die IP ggf modifizieren):
 
    netcat 192.168.0.15 2701
 
danach am prompt:
 
 
 
    1w list
 
Gibt eine Liste mit Hexcodes  aller angeschlossenen und erkannten Onewire(tm) Sensoren aus.
 
 
 
    1w convert <hexcode>
 
Veranlasst eine Temperaturmessung des addressierten Sensors, oder wenn das Argument <hexcode> weggelassen wird aller angeschlossener Sensoren.
 
 
 
    1w get <hexcode>
 
Gibt die gemessene Temperatur eines Sensors aus.
 
 
 
===  Einbindung in die [[HTTPD]]-Weboberfläche ===
 
 
 
Unter httpd/embed/ow.ht.m4, bzw httpd/embed/Xow.ht.m4 liegt eine Weboberflaeche, die alle Sensoren erkennt und ihre aktuelle Temperatur regelmässig per Ajax abfragt und anzeigt. Im Falle von Xow.ht.m4 wird sogar Graph der Temperatur mittels SVG gemalt. Um die Dateien einzubinden, muss man einfach bei aktiviertem Onewiresupport den [[Webserver]] und das Datei Inlining aktivieren.
 
 
 
Die Dateien können dann unter ow.ht bzw. unter Xow.ht angezeigt werden.
 
 
 
[[Bild:onewire-svg.png]]
 
 
 
=== Anschluss AVR-NET-IO ===
 
Für das Pollin [[AVR-NET-IO]] Board können die Sensoren DS18S20+ , 
 
 
 
so im normal Modus angeschlossen werden:
 
 
 
[[Bild:netio-1wire_normal.png]]
 
 
 
 
 
 
 
so im parasitären Modus angeschlossen werden:
 
 
 
[[Bild:netio-1wire.png]]
 
 
 
=== Einbindung in [[Control6]] ===
 
Die Sensoren können mit '''ONEWIRE_GET''' einfach abgefragt werden.  Die Funktion führt automatisch ein ''convert'' aus, es sind also keine zwei Schritte erforderlich wie bei dem Zugriff über [[ECMD]].  Die Rückgabe erfogt (analog der Funktion '''KTY_GET''') in Centigrad, also Temperatur * 10. Hier vielleicht ein kleines Beispiel, das die Daten in eine von außen abfragbare Variable übernimmt.  Sicher kann man sinnvolleres damit anstellen :-)
 
 
 
<pre>CONTROL_START
 
 
 
ECMD_GLOBAL(Temperatur, 0);
 
 
 
THREAD(read_temp)
 
        Temperatur = ONEWIRE_GET(10d85594010800eb);
 
        WAIT(10);
 
THREAD_END(read_temp)
 
 
 
ON STARTUP DO
 
        THREAD_START(read_temp);
 
END
 
 
 
CONTROL_END
 
</pre>
 
 
 
 
[[Category:Ethersex]]
 
[[Category:Ethersex]]
 
[[Category:StepByStep]]
 
[[Category:StepByStep]]
 
+
[[Category:Onewire]]
=== Beispiele ===
 
 
 
===== sh oder bash =====
 
Einfaches SH (Linux Shell) Script von stesie (irc) zum Auslesen von einem Wert
 
 
 
<source lang="bash">
 
  #! /bin/sh
 
  SENSORID=10529f7001080016
 
  #ESEXIP=2001:6f8:1209:23:42::17 #IPv6 Adresse
 
  ESEXIP=192.168.255.90
 
 
 
  #IPv6
 
  #echo 1w convert $SENSORID | nc6 -u $ESEXIP 2701 -q 1 2>/dev/null | grep -qe OK || exit 1
 
  #echo 1w get $SENSORID | nc6 -u $ESEXIP 2701 -q 1 2>/dev/null | sed -e 's/Temperatur: //'
 
 
 
  #IPv4
 
  echo 1w convert $SENSORID | nc -u $ESEXIP 2701 -q 1 2>/dev/null | grep -qe OK || exit 1
 
  echo 1w get $SENSORID | nc -u $ESEXIP 2701 -q 1 2>/dev/null | sed -e 's/Temperatur: //'
 
</source>
 
 
 
==== Perl ====
 
Beispiel in Perl das alle Sensoren ermittelt und anschließend die Werte ausgibt.
 
Benötigt wird das Modul NET das kein IPv6 kann
 
 
 
<source lang="perl">
 
  #!/usr/bin/perl -w
 
  #Auslesen der 1 Wire Sensoren an einem AVR-NET-IO mit ethersex
 
 
 
  use strict;
 
  use Net::Telnet ();
 
 
 
  my $esexip="192.168.255.90";
 
  my $esexport="2701";
 
  my $esex;
 
  my @sensor;
 
  my $sensor;
 
  my $dummy;
 
  my $temp;
 
 
 
  $esex = Net::Telnet->new || die "kann Ethersex nicht finden";;
 
  $esex->open(Host  => $esexip,
 
            Port    => $esexport,
 
            Timeout => 2);
 
 
 
  #Alles Sensor-IDs auslesen und dem Array @sensor zuweisen
 
  $esex->print("1w list");
 
  ($sensor) = $esex->waitfor(Timeout => 2,
 
                            String  => "OK");
 
  @sensor=split(/\s+/, $sensor);
 
        print "@sensor","\n"; #Kontrollausgabe
 
 
 
  my $zahler=@sensor;
 
  print "Anzahl der Elemente :",$zahler,"\n\n";
 
 
 
  #Alles Sensore Temperatur einlesen
 
  $esex->print("1w convert");
 
  $esex->waitfor(Timeout => 2,
 
                String  => "OK");
 
 
 
  #Sensor ID inklusive Wert ausgeben
 
  foreach (@sensor) {
 
        $esex->print("1w get $_");
 
 
 
  ($dummy,$temp)=$esex->waitfor(Match  =>'/\d+\.\d+/',
 
                                Timeout => 2);
 
     
 
  print "Temperatur vom ID ",$_,": ",$temp," C°","\n";
 
  }
 
</source>
 
 
 
==== Python ====
 
 
 
<source lang="python">
 
  #!/usr/bin/python
 
 
 
  from socket import *
 
 
 
  def connectEP():
 
    s = socket(AF_INET, SOCK_STREAM)
 
    s.settimeout(5)
 
    s.connect(("192.168.5.3", 2701))
 
    return s
 
 
 
  def getTemperature():
 
    s.send("1w list\n")
 
    sensors = []
 
    sensors_result = {}
 
   
 
    # list aller Sensoren
 
    while 1:
 
      response = s.recv(1024).rstrip("\n")
 
      if not response: break
 
      if response != "OK":
 
        sensors.append(response)
 
      else:
 
        break
 
 
 
    # wert konvertieren
 
    for sensor in sensors:
 
      s.send("1w convert " + sensor + "\n")
 
      while 1:
 
        response = s.recv(1024).rstrip("\n")
 
        if response == "OK":
 
          break 
 
 
 
      # wert auslesen
 
      s.send("1w get " + sensor + "\n")
 
      response = s.recv(1024).rstrip("\n").lstrip()
 
      sensors_result[sensor] = response
 
    return(sensors_result)
 
 
 
  s = connectEP()
 
  for sensor, value in getTemperature().iteritems():
 
    print sensor + " " + value
 
</source>
 
 
 
==== PHP ====
 
 
 
<source lang="php">
 
 
 
<html>
 
 
 
<head>
 
<title>ethersex php example</title>
 
</head>
 
 
 
<body>
 
 
 
<?php
 
 
 
define(IP, '192.168.10.9'); // deine ethersex ip adresse
 
define(PORT, 2701); // standart port im image
 
 
 
request("1w convert");
 
 
 
$response = request("1w list");
 
$explode = explode("\n", $response);
 
 
 
for ($i=0; $i < count($explode)-2; $i++) {
 
echo "Sensor: " . trim($explode[$i]);
 
echo " -- Wert: " . request("1w get " . $explode[$i]);
 
echo "<br>\n";
 
}
 
 
 
function request($request) {
 
$rs = fsockopen(IP, PORT);
 
 
 
if (!$rs) {
 
$response  = "Kann Verbindung nicht aufbauen!";
 
}
 
else {
 
$response ="";
 
$request = "!" . $request . "\r\n";
 
 
 
fputs($rs, $request);
 
 
 
while (!feof($rs)) {
 
$response .= fgets($rs, 128);
 
}
 
fclose($rs);
 
}
 
 
 
return $response;
 
}
 
 
 
?>
 
 
 
</body>
 
</source>
 

Aktuelle Version vom 5. Juni 2013, 10:03 Uhr