Dallas 1-wire Bus: Unterschied zwischen den Versionen

Aus Ethersex_Wiki
Wechseln zu: Navigation, Suche
K (Anmerkungen (Scripte laufen nur mit udp-Support))
(besseres Beispiel)
Zeile 52: Zeile 52:
  
 
=== Einbindung in [[Control6]] ===
 
=== 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 erfolgt (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 :-)
+
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 erfolgt (analog der Funktion '''KTY_GET''') in Centigrad, also Temperatur * 10. Hier vielleicht ein kleines Beispiel, das die Daten per [[SYSLOG]] ausgibt sobald sich die Temperatur um mehr als ein Grad zur letzten Messung verändert hat.
  
<pre>CONTROL_START
+
<pre>int16_t Temperatur;
 +
int16_t Temperatur_alt;
  
ECMD_GLOBAL(Temperatur, 0);
+
CONTROL_START
  
 
THREAD(read_temp)
 
THREAD(read_temp)
        Temperatur = ONEWIRE_GET(10d85594010800eb);
+
  Temperatur = ONEWIRE_GET(10d85594010800eb);
        WAIT(10);
+
  ON abs(Temperatur-Temperatur_alt)>10 DO
 +
    SYSLOG("temperature changed %d.%d\n",Temperatur/10,Temperatur%10)
 +
    Temperatur_alt = Temperatur;
 +
  END
 +
  WAIT(15);
 
THREAD_END(read_temp)
 
THREAD_END(read_temp)
  
 
ON STARTUP DO
 
ON STARTUP DO
        THREAD_START(read_temp);
+
  Temperatur = Temperatur_alt = 0;
 +
  THREAD_START(read_temp);
 
END
 
END
  
CONTROL_END
+
CONTROL_END</pre>
</pre>
 
  
 
=== Beispiele ===
 
=== Beispiele ===

Version vom 1. Dezember 2010, 14:12 Uhr

Onewire interface

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/hardware/netio.m4 oder pinning/hardware/etherrape.m4 geändert werden)

Onewire Hardware

Folgende 1-wire Hardware wird momentan durch Ethersex unterstützt:

  • DS1820 (Temperatursensor)
  • DS18B20 (Temperatursensor)
  • DS1822 (Temperatursensor)
  • DS2502 (EEPROM)
  • DS2450 (4 Kanal ADC)

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.

Onewire-svg.png

Anschluss AVR-NET-IO

Für das Pollin AVR-NET-IO Board können die Sensoren DS18S20+ ,

normal Betrieb

Netio-1wire normal.png


parasitären Modus

Netio-1wire.png

Pinbelegung:

Ds18s20-par-pinout.jpg

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 erfolgt (analog der Funktion KTY_GET) in Centigrad, also Temperatur * 10. Hier vielleicht ein kleines Beispiel, das die Daten per SYSLOG ausgibt sobald sich die Temperatur um mehr als ein Grad zur letzten Messung verändert hat.

int16_t Temperatur;
int16_t Temperatur_alt;

CONTROL_START

THREAD(read_temp)
  Temperatur = ONEWIRE_GET(10d85594010800eb);
  ON abs(Temperatur-Temperatur_alt)>10 DO
    SYSLOG("temperature changed %d.%d\n",Temperatur/10,Temperatur%10)
    Temperatur_alt = Temperatur;
  END
  WAIT(15);
THREAD_END(read_temp)

ON STARTUP DO
  Temperatur = Temperatur_alt = 0;
  THREAD_START(read_temp);
END

CONTROL_END

Beispiele

sh oder bash

Einfaches SH (Linux Shell) Script von stesie (irc) zum Auslesen von einem Wert (udp support muss enabled sein oder option -u nicht verwenden!)

  #! /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: //'

bash Script von Tron12 zum Auslesen aller Werte (Achtung Port 2701 ist nicht standard!! Sowie udp support muss enabled sein oder option -u nicht verwenden!)

#! /bin/sh
#
# netcat-openbsd  1.89-3ubuntu2

NETIOIP="-4 192.168.178.249"

#für IPv6:
#NETIOIP="-6 2001:6f8:1209:23:42::17"

NETIOPORT="2702"

N_DATE=`echo date | nc -u $NETIOIP $NETIOPORT -q 1 ` 
N_GET_ID=`echo 1w list | nc -u $NETIOIP $NETIOPORT -q 1 | grep -qe OK || exit 1`

echo "Date:     $N_DATE"
echo "---------------------------------"

for i in $N_GET_ID
do
	tmp=`echo 1w convert $i | nc -u $NETIOIP $NETIOPORT -q 1 2>/dev/null | grep -qe OK || exit 1`
	tmp=`echo 1w get $i | nc -u $NETIOIP $NETIOPORT -q 1 2>/dev/null `
	echo "Sensor:  $i :: $tmp"
done

Perl

Beispiel in Perl das alle Sensoren ermittelt und anschließend die Werte ausgibt. Benötigt wird das Modul NET das kein IPv6 kann

  #!/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 => 5);
      
   print "Temperatur vom ID ",$_,": ",$temp," C°","\n";
  }

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

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>

Günstiger Einkauf von Temperatursensoren bei k1w1 (Michael)

Vom Michael Schultz (k1w1) hab ich die Info erhalten, das er immer DS1820 auf Lager hat und sie sehr günstig weiterverkaufen kann. Auch Mindermengen. Mail: ethersex [AT] keyb [DOT] de