Archived
1
0
Fork 0
This repository has been archived on 2024-06-28. You can view files and clone it, but cannot push or open issues or pull requests.
VWA/software.tex

224 lines
14 KiB
TeX
Raw Normal View History

\chapter{Software}
2014-12-14 12:58:03 +01:00
Die Software, die verwendet wird, teilt sich in (?\todo{Anzahl hinzufügen}) Teile auf:
\begin{itemize}
\item Auslesen der Sensoren, Aufbereiten der Daten und allgemeine Steuerung (main.sh)
\item Steuern des Displays
\item Endauswertung
\item Webinterface
\item sonstiges
\end{itemize}
\section{main.sh}
\label{sec:main.sh}
2014-11-30 13:25:24 +01:00
Das wichtigste Programm ist das Bash-Script \textit{main.sh}. Mithilfe eines Bash-Scriptes können Programme automatisiert gestartet und ihre Ausgaben ausgewertet werden. Dieses Bash- Script kümmert sich um die Aufzeichnung und Speicherung der Daten und die Steuerung der anderen Programme.
\subsection{Allgemeines}
\label{subsec:main.sh/allgemeines}
2014-12-14 12:58:03 +01:00
Zunächst werden die Pins angegeben, an denen die LEDs angeschlossen sind. In den Zeilen 11-13 wird nun die grüne LED eingeschaltet, um zu zeigen, dass das Programm läuft.
2014-11-30 13:25:24 +01:00
\code{main.sh}{bash}{8}{13}
Nun startet das eigentliche Programm. Alles, was nun folgt wird wiederholt, bis die Aufzeichnung beendet wird.
2014-11-23 19:47:27 +01:00
\code{main.sh}{bash}{27}{28}
2014-11-30 13:25:24 +01:00
In den folgenden drei Zeilen wird der aktuelle Zeitpunkt in drei verschiedenen Formaten für drei verschiedene Zwecke gespeichert.
2014-11-23 19:47:27 +01:00
\begin{table}[h]
\centering
\begin{tabulary}{\textwidth}{C|C|C}
Code & Beispiel & Verwendung \\
\hline
\hline
\%Y/\%m/\%d\ \%H:\%M:\%S & 2014/11/23 16:47:50 & Format zum Abspeichern in \gls{CSV} \\
\hline
\%d.\%m\ \%H:\%M:\%S & 23.11 16:47:50 & einfach lesbares Format für Display \\
\hline
2014-11-30 13:25:24 +01:00
\%d.\%m.\%y\ \%H:\%M:\%S & 23.11.2014 16:47:50 & einfaches, exaktes Format für Webinterface \\
2014-11-23 19:47:27 +01:00
\end{tabulary}
\caption{Datumsformate}
\end{table}
\code{main.sh}{bash}{29}{31}
2014-11-30 13:25:24 +01:00
\subsection{Messung}
\label{subsec:main.sh/messung}
2014-12-14 09:26:02 +01:00
Als erstes werden die Sensoren ausgelesen. Am einfachsten kann mit dem im Raspberry Pi integrierten Thermometer die \acrshort{cpu}-Temperatur ausgelesen werden:
2014-11-23 19:47:27 +01:00
\codeline{main.sh}{bash}{32}
2014-12-14 09:26:02 +01:00
Nur wenig aufwändiger sind die Temperatursensoren (\emph{DS18B20}, siehe \ref{subsec:Temperatur}). Da die Sensoren manchmal ungültige Werte zurückgeben, wird nach der ersten Messung überprüft, ob dies der Fall ist (Zeile 34) und die Messung solange wiederholt, bis eine gültige Messung erfolgt.
2014-11-30 13:25:24 +01:00
\code{main.sh}{bash}{33}{40}
2014-12-14 09:26:02 +01:00
Die Adafruit-Programme\footcite{DHT}\footcite{bmp058_adafruit}, die den Luftfeuchtesensor (siehe \ref{subsec:Luftfeuchtigkeit}) und den Luftdrucksensor (siehe \ref{subsec:Luftdruck}) auslesen, geben die Feuchtigkeit und die Temperatur durch einen Strichpunkt getrennt an. Daher wird dies zu Beginn als Trennzeichen angegeben.
2014-11-30 13:25:24 +01:00
\codeline{main.sh}{bash}{4}
2014-12-14 09:26:02 +01:00
Dadurch kann die Ausgabe einfach aufgetrennt werden:
2014-11-30 13:25:24 +01:00
\code{main.sh}{bash}{66}{69}
2014-12-14 09:26:02 +01:00
Auch hier wird bei ungültigen Messwerten mehrmals gemessen.
2014-11-30 13:25:24 +01:00
\emph{usb-sensors-linux}\footcite{usb-sensors-linux} gibt direkt den relativen Wert für die Luftqualität zurück, der nicht weiterbearbeitet werden muss.
\codeline{main.sh}{bash}{84}
\subsection{Speichern, Aufbereiten und Verarbeiten}
Nachdem alle Sensoren ausgelesen und die Messwerte in Variablen gespeichert wurden, müssen sie dauerhaft gespeichert werden. Hierzu werden alle Werte durch ein Komma getrennt und als neue Zeile an die bisherigen Messungen angehängt.
\code{main.sh}{bash}{89}{90}
Hierdurch entsteht eine \gls{CSV}-Datei die wie folgt aussehen kann.
2014-12-20 10:12:40 +01:00
\dateiklein{dygraphs.csv}
2014-12-20 21:04:50 +01:00
Diese Datei wird auch in den Ordner des Webservers kopiert, damit es grafisch dargestellt werden kann (siehe \ref{subsec:Diagramme}). Weiters verwendet die \textit{Endauswertung} (siehe \ref{sec:Endauswertung}) auch diese Datei zur rechnerischen Auswertung.
2014-11-30 13:25:24 +01:00
Als nächstes wird der Text für das Display (siehe \ref{sec:Display}) erzeugt. Da dort der Platz beschränkt ist (16x2 Zeichen), werden alle Messwerte um 3 Stellen (bzw. 2 bei Luftdruck) gekürzt. Anschließend werden diese Daten in text.txt (für Display) und text\_ws.txt (für Webinterface) exportiert.
\codeline{main.sh}{bash}{92}
\datei{text.txt}
2014-12-14 12:58:03 +01:00
\lstinputlisting[style=mystyle,label=textws.txt,caption=text\_ws.txt,basicstyle=\footnotesize]{code/text_ws.txt}
2014-11-30 13:25:24 +01:00
Abschließend wird noch 8 Sekunden gewartet und jedes tausende Mal ein Backup gemacht und mir per E-Mail geschickt, bevor die nächste Messung von vorne beginnt.
2014-12-14 09:26:02 +01:00
\section{Display}
\label{sec:Software/Display}
Um die aktuellen Messungen auch ohne Computer zu sehen, werden sie auch direkt am Raspberry Pi auf einem Display angezeigt (siehe auch \ref{sec:Display}). Um das Display anzusteuern wird ein Programm\footcite{schnatterente_code} von \emph{www.schnatterente.net} verwendet. Dieses wurde von mir um einige Funktionen ergänzt.
2014-12-20 10:12:40 +01:00
Das Programm liest aus \emph{text.txt} (siehe Datei \ref{file:text.txt}) die aktuellen Messwerte aus. Da der Platz jedoch stark beschränkt ist, werden diese auf 11 Seiten aufgeteilt, zwischen denen das Display alle 3 Sekunden wechselt.
2014-12-14 09:26:02 +01:00
\begin{figure}[h]
\centering
\includegraphics[width=0.9\textwidth]{figures/display.jpg}
\caption{eingebautes Display (eigenes Werk)}
2014-12-14 12:58:03 +01:00
\label{fig:display_alt}
2014-12-14 09:26:02 +01:00
\end{figure}
\section{Webinterface}
\label{sec:Webinterface}
Einer der wichtigsten Teile des Projektes ist die grafische Auswertung. Diese kann live auf der Webseite des Raspberry Pi und zeitverzögert unter \href{http://winkler.kremszeile.at}{winkler.kremszeile.at} angesehen werden. Die Auswertung besteht aus zwei von einander unabhängigen Teilen. Zum einen gibt es die Anzeige der Live-Daten, zum anderen die Darstellung der kompletten Aufzeichnung als interaktives Diagramm.
\subsection{Livedaten}
\label{subsec:Livedaten}
2014-11-30 13:25:24 +01:00
2014-12-14 12:58:03 +01:00
\begin{figure}[h]
\centering
\includegraphics[width=\textwidth]{figures/aktuell.png}
2014-12-20 21:04:50 +01:00
\caption{Livedaten (Screenshot von \href{http://winkler.kremszeile.at/aktuell.html}{winkler.kremszeile.at/aktuell.html})}
2014-12-14 12:58:03 +01:00
\label{fig:display_neu}
\end{figure}
2015-01-02 13:55:30 +01:00
Auf der Webseite des Raspberry Pi können die aktuellen Messwerte angezeigt und grafisch eranschaulicht werden. Hierzu wird alle 5 Sekunden mithilfe von \gls{Javascript} die Datei \emph{text\_ws.txt} nachgeladen und ausgewertet. Zusätzlich zur Anzeige der Zahlenwerte werden die Messungen mithilfe von Balken und Farbverläufen angezeigt. Für ältere Browser gibt es auch eine einfache tabellarische Ansicht\footnote{\href{http://winkler.kremszeile.at/aktuell_einfach.html}{winkler.kremszeile.at/aktuell\_einfach.html}}
2014-12-14 12:58:03 +01:00
2015-01-03 15:06:11 +01:00
\subsubsection{Wetter-Rater}
2014-12-14 12:58:03 +01:00
\label{subsubsec:Wetterrater}
2015-01-03 15:06:11 +01:00
Um die Daten auch anders zu nutzen habe ich einen \emph{Wetter-Rater} programmiert. Dieser versucht auf Basis von einfachen Berechnungen und Schätzungen das aktuelle Wetter zu \enquote{erraten}. So wird zum Beispiel die aktuelle Außentemperatur mit der nach Jahreszeit und Tageszeit zu erwartenden Temperatur verglichen, um Rückschlüsse auf den Bewölkungsgrad zu ziehen oder aufgrund der Luftfeuchtigkeit ermittelt, ob es Niederschlag gibt.
2014-12-20 10:12:40 +01:00
2014-12-20 21:04:50 +01:00
Hierzu wird zum Beispiel die Temperaturschwankung über einen Tag als Cosinusfunktion mit einer Schwankung von \SI{5}{\degreeCelsius} angenommen.
$$ \textit{Temperaturerwartung} = -5 \cdot \cos\left(\frac{\text{Stunde}\cdot 2 \cdot \pi }{24}\right) + \textit{Mittlere Temperatur des Tages}; $$
2014-12-20 21:04:50 +01:00
\begin{figure}[h]
\centering
\begin{tikzpicture}[line cap=round,line join=round,>=triangle 45,x=0.3cm,y=0.5cm]
\draw[->,color=black] (0.,13.) -- (0.,27.);
\draw[color=black] (0.3,27) node [anchor=west] {Temperatur};
\foreach \y in {14,16,18,20,22,24,26}
2014-12-20 21:04:50 +01:00
\draw[shift={(0,\y)},color=black] (2pt,0pt) -- (-2pt,0pt) node[left] {\footnotesize $\y$};
\draw[color=black] (28,18) node [anchor=east] {Stunden};
\draw[->,color=black] (-2.,17.) -- (25.,17.);
\foreach \x in {,5,10,15,20}
2014-12-20 21:04:50 +01:00
\draw[shift={(\x,17)},color=black] (0pt,2pt) -- (0pt,-2pt) node[below] {\footnotesize $\x$};
\clip(-2.,13.) rectangle (25.,27.);
\draw[smooth,samples=100,domain=-2.0:25.0] plot(\x,{0-5.0*cos(((\x)*2.0*3.1415926535/24.0)*180/pi)+20.0});
\end{tikzpicture}
\caption{Graph der Funktion bei mittlere Temp. = \SI{20}{\degreeCelsius} (eigenes Werk)}
2014-12-20 21:04:50 +01:00
\end{figure}
2015-01-03 15:06:11 +01:00
Der Wetter-Rater gibt drei Werte aus:
2014-12-14 12:58:03 +01:00
\begin{itemize}
\item Tag oder Nacht
\item Niederschlag (keiner/Gewitter/Schnee/Regen/Schneeregen)
\item Bewölkungsgrad (sonnig/leicht bewölkt/stark bewölkt)
\end{itemize}
2014-12-20 10:12:40 +01:00
Aufgrund von diesen Werten wird dann eine Grafik (siehe Abbildung \ref{fig:wettericons}) ausgewählt, welche dann angezeigt wird.
2014-12-14 12:58:03 +01:00
\begin{figure}[htb]
2014-12-14 12:58:03 +01:00
\centering
\includegraphics[width=\textwidth]{figures/wettericons.png}
\caption{Wettericons (eigenes Werk)}
\label{fig:wettericons}
\end{figure}
\subsection{Diagramme}
\label{subsec:Diagramme}
2015-01-02 13:55:30 +01:00
\begin{figure}[h]
\centering
\makebox[\textwidth][c]{\includegraphics[width=1.35\textwidth]{figures/dygraphs_ipad.png}}
\caption{Webinterface auf einem Tablet (eigenes Werk)}
\label{fig:dygraphs_tablet}
\end{figure}
2014-12-20 10:12:40 +01:00
\begin{figure}[h]
\centering
\includegraphics[width=\textwidth]{figures/dygraphs.png}
2015-01-02 13:55:30 +01:00
\caption{Webinterface (von \href{http://winkler.kremszeile.at/dygraphs_außen.html}{winkler.kremszeile.at/dygraphs\_außen.html})}
2014-12-20 10:12:40 +01:00
\label{fig:dygraphs}
\end{figure}
Damit auch die vergangenen Messergebnisse angesehen werden können, werden diese im Webinterface auf einer eigenen Seite als Diagramm dargestellt. Diese werden mithilfe von \emph{dygraphs}\footcite{dygraphs}, einer \gls{Javascript}-Bibliothek für interaktive Diagramme, erstellt.\footnote{\href{http://winkler.kremszeile.at/dygraphs_au\%C3\%9Fen.html}{winkler.kremszeile.at/dygraphs\_außen.html}}
2015-01-02 13:55:30 +01:00
Hierzu lädt der Webbrowser die komplette Aufzeichnung in Form der Datei \emph{dygraphs.csv} (siehe Datei \ref{file:dygraphs.csv}) nach. Daraus wird ein Diagramm über den gesamten Zeitraum der Messung erstellt. Im Gegensatz zu anderen Darstellungen kann hier jedoch einfach hineingezoomt werden. So können einfach einzelne Wochen oder Tage betrachtet werden. Da das Diagramm mit allen 10 Messkurven auf einmal überladen wäre, können einzelne Kurven aktiviert und deaktiviert werden. Zusätzlich kann ein Faktor eingegeben werden, um den die Kurven automatisch geglättet werden sollen. Mit einem Tastendruck kann man auch auf die letzten 24 Stunden oder 7 Tage zoomen oder in einem Kalender den Zeitraum auswählen. Es gibt auch ein Auswahlmenü, um den gewünschten Datensatz auszuwählen. Das Diagramm ist auch darauf angepasst, auch mit Tablets bzw. Touchscreens bedient zu werden.
2014-12-20 10:12:40 +01:00
Auf Youtube gibt es ein Video, wo man die Verwendung in Aktion sehen kann: \href{https://www.youtube.com/watch?v=1bv6CEXuN5c}{www.youtube.com/watch?v=1bv6CEXuN5c}
\section{Endauswertung}
\label{sec:Endauswertung}
2015-01-02 13:55:30 +01:00
Unabhängig vom Webinterface habe ich ein zweites Programm in \gls{Python} geschrieben. Dieses kann die fertige \emph{dygraphs.csv} (siehe Datei \ref{file:dygraphs.csv}) einlesen und verschiedene mathematischen Auswertungen über einen beliebigen Zeitraum erstellen.
Zunächst wird die Datei in zwei Dateien aufgespalten. Die eine enthält nur die erste Spalte mit den Zeitstempeln jeder Messung, die andere die Messergebnisse. Da schon wenige Messfehler (zum Beispiel einmalig \SI{6}{\degreeCelsius} bei \SI{20}{\degreeCelsius} Außentemperatur) den Mittelwert (und die Standardabweichung) stark verändern, wird zunächst nach Ausreißern gesucht. Hierzu für jeden Messwert überprüft, ob er um mehr als \SI{10}{\degreeCelsius} von dem vorherigen \emph{und} dem folgenden abweicht. Wenn dem so ist, wird eine Meldung ausgegeben:
\code{ausgabe.txt}{,morekeywords={Spalte,Zeile}}{5}{8}
Als nächstes kann man den Zeitraum angeben, für den die Auswertung erstellt werden soll. Hierbei wird überprüft, ob das eingegebene Datum gültig ist. Das Programm testet dann, welche Zeilen der Eingabedatei in diesem Zeitraum liegen.
\code{ausgabe.txt}{}{22}{28}
Nun werden für jede Spalte bzw. für jeden Sensor der Mittelwert, das Minimum, das Maximum und die Standardabweichung berechnet und ausgegeben:
\code{ausgabe.txt}{}{29}{59}
2014-12-20 10:12:40 +01:00
\section{diverses}
\label{sec:diverses}
2015-01-03 15:06:11 +01:00
Abgesehen von den großen Teilen gibt es auch einige kleinere Aspekte, von denen ich nun einige vorstellen möchte:
\subsection{Weather Underground}
\label{subsec:wunderground}
\emph{Weather Underground} ist ein Online-Wetterdienst mit Firmensitz in San Francisco.\footcite{wiki:wunderground} Dieser bietet auch die Möglichkeit eine eigene Wetterstation zu betreiben und die Daten auf ihrer Webseite anzuzeigen.\footnote{\href{http://www.wunderground.com/personal-weather-station/dashboard?ID=INIEDERS353}{www.wunderground.com/personal-weather-station/dashboard?ID=INIEDERS353}}
Leider werden die Wetterdaten nur in imperialen Einheiten (also \si{\degree F} und \si{\mmHg}\footnote{Millimeter-Quecksilbersäule oder Torr}) akzeptiert. Daher werden die Messwerte vorher von einem \gls{Python}-Programm umgerechnet und anschließend hochgeladen.
\subsection{Autostart}
\label{subsec:Autostart}
Damit die Umweltdatenmessung einfacher zu handhaben ist, gibt es ein einfaches Start-/Stop-Skript. So werden die Aufzeichnung und das Display automatisch beim Hochfahren gestartet und vor dem Herunterfahren ordnungsgemäß beendet.
2014-12-20 10:12:40 +01:00
\subsection{mitternacht.sh}
\label{subsec:mitternacht.sh}
2014-12-14 12:58:03 +01:00
2015-01-03 15:06:11 +01:00
Da der Raspberry Pi in der Schule hängt und nicht von außerhalb erreicht werden kann, ist es schwierig Softwareänderungen anzuwenden. Daher habe ich das kleine Skript \emph{mitternacht.sh} geschrieben. Dieses startet täglich um 0:00 Uhr und lädt die neuerste Version von \gls{Github} und installiert diese. Zusätzlich werden auch das Betriebssystem und alle installierten Programme aktualisiert. Anschließend werde ich per Push-Benachrichtigung über etwaige Probleme benachrichtigt und der Raspberry Pi startet neu.
\subsection{sonstiges}
\label{subsec:sonstiges}
\begin{itemize}
\item ein Logo (siehe Abbildung \ref{fig:logo})
\item Erstellung von statischen Diagrammen mit Gnuplot
\begin{itemize}
\item Jedoch bei zu vielen Daten unübersichtlich und langsam
\end{itemize}
\item Windows Vista/7 Gadget
\item E-Mail und Push-Benachrichtigungen
\item regelmäßiger Upload der Daten auf \href{http://winkler.kremszeile.at}{winkler.kremszeile.at}
\end{itemize}
\begin{figure}[h]
\centering
\includegraphics[width=0.5\textwidth]{figures/logo.png}
\caption{Logo (eigenes Werk)}
\label{fig:logo}
\end{figure}