\documentclass[]{schulein}
\usepackage[utf8]{inputenc}
\usepackage{schulinf}

% Dieses Dokument ist in der Zusammenarbeit von Informatikreferendaren und
% ehemaligen Informatikreferendaren der Studienseminare (heute ZfsL) Arnsberg,
% Hamm und Solingen entstanden.
%
% Das Dokument steht unter der Lizenz: Creative Commons by-nc-sa Version 4.0
% http://creativecommons.org/licenses/by-nc-sa/4.0/deed.de
%
% Nach dieser Lizenz darf das Dokument beliebig kopiert und bearbeitet werden,
% sofern das Folgeprodukt wiederum unter gleichen Lizenzbedingungen vertrieben
% und auf die ursprünglichen Urheber verwiesen wird.
% Eine kommerzielle Nutzung ist ausdrücklich ausgeschlossen.
%
% Die Namensnennung durch einen Verweis und die Lizenzangabe der ursprünglichen
% Urheber auf den Materialien für Schülerinnen und Schüler ist erforderlich.
%
% Die Sammlung der Dokumente steht unter
% http://ddi.uni-wuppertal.de/material/materialsammlung/
% zur Verfügung.
%
% Das LaTeX-Paket zum Setzen der Dokumente der Sammlung steht
% unter  http://www.ctan.org/pkg/schule
% zur Verfügung.

\usepackage[pdfauthor={Referendare der Informatikfachseminare Arnsberg, Hamm und Solingen}]{hyperref}
\includexmp{lizenz}
\cclizenz{byncsaeu}
\footerQRLink{materialsammlung_qr_url.pdf}

\svnid{$Id: info_03_gpio_digitales_thermometer.tex 1437 2016-03-19 15:28:54Z pieper $}

\dokName{RasPi: Digitales Thermometer am GPIO}
\jahrgang{9}

\usepackage{inconsolata}

%Anpassungen für die Einbindung im Skript
\newcommand{\singleSection}[1]{\section*{#1}}
\renewcommand{\thesubsection}{\arabic{subsection}}

\usepackage{units}

\lstset{% 
	breaklines=true, % Zeilenumbrüche
	language=python, % Sprache
	basicstyle=\ttfamily\small,
	breakatwhitespace=false,
	tabsize=2
}

\begin{document}

\singleSection{Digitales Thermometer am GPIO}
Möchte man mit dem Raspberry Pi die Temperatur messen, so eignet sich dafür der Thermometerchip DS1820. Dieser besitzt drei Anschlüsse: Eins ist die Masse, zwei ist die Datenleitung und über drei erfolgt die Versorgung des Chips mit \(3,3\,\unit{V}\). 

\begin{center}
	\begin{minipage}{2.5cm}
		\input{chip_ds1820.cir}
	\end{minipage}\hspace{2cm}
	\begin{minipage}{4cm}
		\input{schaltung_gpio_ds1820.cir}
	\end{minipage}
\end{center}

Für die Nutzung mit dem Raspberry Pi gibt es schon passende Treiber. Dazu müssen aber die Versorgung und die Datenleitung mit einem \(4,7\,\unit{k\Omega}\) Widerstand verbunden sein und die Datenleitung mit dem Pin mit der Bezeichnung 4, was der Pin 7 auf dem Board ist. Will man mehrere dieser Thermometerchips anschließen, so müssen diese nur parallel zu den anderen Chips angeschlossen werden.

\subsection{Treiber laden}
Bevor die Treiber geladen werden können, muss der \enquote{Device Tree Overlay} aktiviert werden. Dazu muss, mit Root-Rechten in die Datei \lstinline|/boot/config.txt| folgende Zeile ergänzt werden:
\begin{lstlisting}[frame=trBL]
	dtoverlay=w1-gpio,gpiopin=4,pullup=on
\end{lstlisting}

Unter Linux werden Treiber als Kernelmodule geladen. Für den DS1820 sind zwei solcher Module notwendig: \lstinline|w1-gpio| und \lstinline|w1-therm|. Diese können als Superuser über den Befehl \lstinline|modprobe| geladen werden. Beim ersten muss aber durch die besondere Nutzung mit dem Widerstand noch der Zusatz \lstinline|pullup=1|mit angegeben werden. Daraus ergibt sich also gesamt:
\begin{lstlisting}[]
	sudo modprobe w1-gpio pullup=1
	sudo modprobe w1-therm
\end{lstlisting}

Will man die Treiber bei jedem Systemstart automatisch geladen haben, muss man den Inhalt der Datei \lstinline|/etc/modules| um folgende Zeilen ergänzen:
\begin{lstlisting}[frame=trBL]
	w1-gpio pullup=1
	w1-therm
\end{lstlisting}

\subsection{Temperatur auslesen}
Sind Thermometer angeschlossen und die Treiber geladen, so findet man im Verzeichnis \lstinline|/sys/bus/w1/devices/| Unterverzeichnisse die jeweils ein Thermometer repräsentieren und deren Namen sich aus der jeweiligen Seriennummer zusammensetzt. Innerhalb solcher Verzeichnisse kann man die Datei \lstinline|w1_slave| finden, die man mit \lstinline|cat w1_slave| ausgeben kann. Die letzte Zahl der zweiten Zeile ist die Temperatur multipliziert mit dem Faktor 1000.

\subsection{Temperatur auslesen mit Python}
Um die gemessene Temperatur auch in einem Programm nutzen zu können, muss die Datei ausgelesen und die passende Stelle extrahiert werden. Dieses kann z.\,B. mit dem folgendem Python-Code geschehen. Dazu muss der Dateiname noch dem eigenen Thermometer angepasst werden. Nähere Informationen dazu findet man unter anderem auf der Seite \url{http://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/temperature/}.

\begin{lstlisting}[numbers=left, numberstyle=\footnotesize,  numbersep=5pt]
tfile = open("/sys/bus/w1/devices/10-000802824e58/w1_slave")
text = tfile.read()
tfile.close()
secondline = text.split("\n")[1]
temperaturedata = secondline.split(" ")[9]
temperature = float(temperaturedata[2:])
temperature = temperature / 1000
print(temperature)
\end{lstlisting}

\end{document}