Archived
1
0
Fork 0

Software: main.sh fertig

This commit is contained in:
Findus23 2014-11-30 13:25:24 +01:00
parent de0f540ea0
commit 36fad441c7
9 changed files with 88 additions and 32 deletions

4
code/dygraph.csv Normal file
View file

@ -0,0 +1,4 @@
2014/10/03 12:47:36,27.562,29.437,17.375,29.437,19.1,71.4,1000.95,19.30,53.0,1181
2014/10/03 12:48:07,27.625,29.437,17.375,29.437,19.1,71.4,1000.86,19.30,53.0,1140
2014/10/03 12:48:34,27.625,29.437,17.437,29.500,19.2,71.5,1001.00,19.40,53.0,1151
2014/10/03 12:49:02,27.625,29.500,17.437,29.500,19.2,71.5,1000.85,19.40,53.0,1147
1 2014/10/03 12:47:36 27.562 29.437 17.375 29.437 19.1 71.4 1000.95 19.30 53.0 1181
2 2014/10/03 12:48:07 27.625 29.437 17.375 29.437 19.1 71.4 1000.86 19.30 53.0 1140
3 2014/10/03 12:48:34 27.625 29.437 17.437 29.500 19.2 71.5 1001.00 19.40 53.0 1151
4 2014/10/03 12:49:02 27.625 29.500 17.437 29.500 19.2 71.5 1000.85 19.40 53.0 1147

View file

@ -1,7 +1,7 @@
#!/bin/bash
PFAD="/var/www/" #Pfad zum Web-Verzeichnis
r=0 # Backup-Zahl auf Null setzen
IFS="; " #Spezial-Variable - enthält Trennzeichen zum Trennen von Luftdruck und -temperatur
IFS="; "
re='^[0-9]+$' # Regulärer Ausdruck, ob Variable eine Zahl ist
pushbullet_api_key=$(cat /home/pi/Temperaturmessung/Fremddateien/pushbullet_settings.txt | head -n 1)
pushbullet_device=$(cat /home/pi/Temperaturmessung/Fremddateien/pushbullet_settings.txt | tail -n 1)
@ -26,12 +26,12 @@ then
fi
while true
do
uhrzeit=$(date +%Y/%m/%d\ %H:%M:%S) # z.B.: 2014/10/05 11:00:00 (für csv-Datei)
uhrzeit_display=$(date +%d.%m\ %H:%M:%S) # z.B.: 05.10 11:00:00 (für Display)
uhrzeit_lang=$(date +%d.%m.%y\ %H:%M:%S) # z.B.: 05.10.2014 11:00:00 (für Webinterface)
rasp=$(/opt/vc/bin/vcgencmd measure_temp | cut -c 6,7,8,9) #Betriebstemberatur messen
temp1=$(echo "scale=3; $(grep 't=' /sys/bus/w1/devices/w1_bus_master1/10-000802b53835/w1_slave | awk -F 't=' '{print $2}') / 1000" | bc -l) #Innentemperatur
while [ "$temp1" == "-1.250" ] || [ "$temp1" == "85.000" ] || [ "$temp1" == "85.000" ]
uhrzeit=$(date +%Y/%m/%d\ %H:%M:%S)
uhrzeit_display=$(date +%d.%m\ %H:%M:%S)
uhrzeit_lang=$(date +%d.%m.%y\ %H:%M:%S)
rasp=$(/opt/vc/bin/vcgencmd measure_temp | cut -c 6,7,8,9)
temp1=$(echo "scale=3; $(grep 't=' /sys/bus/w1/devices/w1_bus_master1/10-000802b53835/w1_slave | awk -F 't=' '{print $2}') / 1000" | bc -l)
while [ "$temp1" == "-1.250" ] || [ "$temp1" == "85.000" ]
do
gpio write 13 1
echo "----Temp1: $temp1"

11
code/text.txt Normal file
View file

@ -0,0 +1,11 @@
03.10 14:49:02
27.3
30.6
25.7
30.6
25
50
25.7
989.5
59.5
450

1
code/text_ws.txt Normal file
View file

@ -0,0 +1 @@
03.10.14 14:49:02,27.3,30.6,25.7,30.6,25,50,25.7,989.5,59.5,450

View file

@ -27,7 +27,7 @@
\newglossaryentry{gpio}
{
name=GPIO,
description={General Purpose Input/Output\newline Kontakte, die Softwareseitig für verschiedene Zwecke angesteuert werden können\newline z.B.: Auslesen von Sensoren, Ansteuern von Displays}
description={General Purpose Input/Output\newline Kontakte, die Softwareseitig für verschiedene Zwecke angesteuert werden können\newline \zB: Auslesen von Sensoren, Ansteuern von Displays}
}
\newglossaryentry{Kernelmodul}
{

View file

@ -44,7 +44,7 @@ Zur Messung der Umweltdaten werden folgende Sensoren verwendet:
\subsection{Temperatur}
\label{subsec:Temperatur}
Mithilfe der Temperatursensoren werden die Innentemperatur, die Gehäusetemperatur und die Bodentemperatur (Außen) gemessen. Diese haben eine Messgenauigkeit von \SI{\pm 0.5}{\degreeCelsius} und einen Messbereich von \SI{-10}{\degreeCelsius} bis \SI{+85}{\degreeCelsius}. \footcite[20]{temp}
Mithilfe von 4 Sensoren des Typ \emph{DS18B20} werden die Innentemperatur, die Gehäusetemperatur und die Bodentemperatur (Außen) gemessen. Diese haben eine Messgenauigkeit von \SI{\pm 0.5}{\degreeCelsius} und einen Messbereich von \SI{-10}{\degreeCelsius} bis \SI{+85}{\degreeCelsius}. \footcite[20]{temp}
\begin{figure}[h]
\centering
@ -94,7 +94,7 @@ Auch hier werden die Daten von einem Programm von Adafruit ausgelesen. \footcite
\subsection{Luftqualität}
\label{subsec:Luftqualitat}
Der letzte Sensor, der hinzugekommen ist, ist der \emph{VOLTCRAFT CO-20}. Da CO\textsubscript{2}-Sensoren und andere genaue Luftqualitätssensoren teuer sind, habe ich mich für einen einfachen \acrshort{voc}-Sensor entschieden. Dieser misst die Menge an \emph{Flüchtigen organischen Verbindungen} in der Luft. Dies sind Stoffe, die schon bei niedrigen Temperaturen verdampfen. Sie können von verschiedensten Quellen stammen (z.B.: Benzindämpfe, Tabakrauch, Lacke)\footcite[41\psqq]{innenraum} und von leichten Kopfschmerzen und Konzentrationsstörungen bis zu bleibenden Gesundheitsschäden führen.\footcite[Gesundheitliche Wirkung]{VOC}
Der letzte Sensor, der hinzugekommen ist, ist der \emph{VOLTCRAFT CO-20}. Da CO\textsubscript{2}-Sensoren und andere genaue Luftqualitätssensoren teuer sind, habe ich mich für einen einfachen \acrshort{voc}-Sensor entschieden. Dieser misst die Menge an \emph{Flüchtigen organischen Verbindungen} in der Luft. Dies sind Stoffe, die schon bei niedrigen Temperaturen verdampfen. Sie können von verschiedensten Quellen stammen (\zB: Benzindämpfe, Tabakrauch, Lacke)\footcite[41\psqq]{innenraum} und von leichten Kopfschmerzen und Konzentrationsstörungen bis zu bleibenden Gesundheitsschäden führen.\footcite[Gesundheitliche Wirkung]{VOC}
Der Sensor gibt einen Wert an, der die relative Verschlechterung seit dem Einschalten angibt. Hierbei steht 450 für die anfängliche Qualität ist und ein höherer Wert für eine schlechtere Luftqualität.
Da der \emph{VOLTCRAFT CO-20} jedoch nicht mehr erhältlich ist, verwende ich den baugleichen \emph{Raumluftfühler} von Velux.\footcite{Velux}
@ -106,9 +106,10 @@ Da der \emph{VOLTCRAFT CO-20} jedoch nicht mehr erhältlich ist, verwende ich de
\label{fig:velux}
\end{figure}
Der Sensor wird über USB an den Raspberry Pi angeschlossen. Um die Daten unter Linux auszulesen, wird \emph{usb-sensors-linux} verwendet.\footcite{usb-sensors-linux}
Der Sensor wird über USB an den Raspberry Pi angeschlossen. Um die Daten unter Linux auszulesen, wird das Programm \emph{usb-sensors-linux} verwendet.\footcite{usb-sensors-linux}
\section{Display}
\label{sec:Display}
\begin{figure}[h]
\centering
@ -131,3 +132,4 @@ Da jedoch fix angelötete Kabel unflexibel sind, bin ich auf ein Display von \em
\end{figure}
\section{Anschluss}
\label{sec:Anschluss}

BIN
main.pdf

Binary file not shown.

View file

@ -176,7 +176,7 @@
\lstdefinestyle{mystyle}{
backgroundcolor=\color{white},
% basicstyle=\footnotesize,
breakatwhitespace=false,
% breakatwhitespace=false,
breaklines=true,
captionpos=b,
commentstyle=\color{mygreen}\itshape,
@ -194,7 +194,7 @@
stepnumber=1,
stringstyle=\color{mymauve},
tabsize=2,
morekeywords={gpio, out},
morekeywords={gpio, out, sudo, python, bc, cut, date, rev},
}
\lstdefinestyle{terminal}{
backgroundcolor=\color{black},
@ -235,16 +235,23 @@
{}{{\EUR}}1 {£}{{\pounds}}1 {}{}0,
numberbychapter=false,
}
\renewcommand{\lstlistingname}{Programmcode}
\renewcommand{\lstlistlistingname}{Programmcode}
\renewcommand{\lstlistingname}{Datei}
\renewcommand{\lstlistlistingname}{Dateiverzeichnis}
\newcommand{\code}[4]{
\lstinputlisting[language=#2,style=mystyle,firstline=#3,lastline=#4,caption=#1 (Zeile #3 bis #4),firstnumber=#3]{code/#1}
}
\newcommand{\codeline}[3]{
\lstinputlisting[language=#2,style=mystyle,firstline=#3,lastline=#3,caption=#1 (Zeile #3),firstnumber=#3]{code/#1}
}
\newcommand{\dateiklein}[1]{
\lstinputlisting[style=mystyle,caption=#1,basicstyle=\scriptsize]{code/#1}
}
\newcommand{\datei}[1]{
\lstinputlisting[style=mystyle,caption=#1]{code/#1}
}
\usepackage[binary-units = true]{siunitx}
\usepackage{tabulary}
\newcommand{\zB}{z.\,B.}
\usepackage[toc,nopostdot]{glossaries}
\glsenablehyper
\input{glossar.tex}

View file

@ -11,23 +11,17 @@ Die Software, die verwendet wird, teilt sich in (?) Teile auf:
\section{main.sh}
\label{sec:main.sh}
Das wichtigste Programm ist das Bash-Script \textit{main.sh}. Mithilfe eines Bash-Scriptes können Programme automatisiert gestartet und ihre Ausgaben ausgewertet werden.
Die Datei beginnt mit einem \textit{Shebang} (auch \textit{Magic Line} genannt). Diese Zeile sagt dem Betriebssystem, womit die Datei ausgeführt werden soll.
\codeline{main.sh}{bash}{1}
Die folgenden Zeilen geben allgemeine Einstellungen an und definieren später gebrauchte Variablen. Man kann den Pfad zum Webserver, auf dem das Webinterface liegt, angeben. In Zeile 6 und 7 werden die Zugangsdaten für Pushbullet aus einer anderen Datei ausgelesen. Die Zeilen 8-10 geben die Pins an, an denen die LEDs angeschlossen sind. In Zeile 11-13 wird die grüne LED eingeschaltet, um zu zeigen, dass das Programm läuft.
\code{main.sh}{bash}{2}{13}
Zeile 14 bis 26 kümmern sich um Parameter, die an das Programm übergeben werden. Mit \enquote{-d} kann die letzte Aufzeichnung überschrieben werden und mit \enquote{-h} wird ein kurzer Info-Text angezeigt.
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.
\begin{lstlisting}[language=bash,style=terminal]
lukas@kinderzimmer:~$ main.sh -h
-d csv-Datei leeren
für weitere Informationen siehe http://winkler.kremszeile.at/ oder https://github.com/Findus23/Umweltdatenmessung
\subsection{Allgemeines}
\label{subsec:main.sh/allgemeines}
\end{lstlisting}
\code{main.sh}{bash}{14}{26}
Alles, was nun folgt, wird unendlich wiederholt, bis das Programm beendet wird.
Zunchst werden 10 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.
\code{main.sh}{bash}{8}{13}
Nun startet das eigentliche Programm. Alles, was nun folgt wird wiederholt, bis die Aufzeichnung beendet wird.
\code{main.sh}{bash}{27}{28}
In den folgenden drei Zeilen wird die aktuelle Uhrzeit und Datum in drei verschiedenen Formaten für drei verschiedene Zwecke.
In den folgenden drei Zeilen wird der aktuelle Zeitpunkt in drei verschiedenen Formaten für drei verschiedene Zwecke gespeichert.
\begin{table}[h]
\centering
\begin{tabulary}{\textwidth}{C|C|C}
@ -38,12 +32,49 @@ In den folgenden drei Zeilen wird die aktuelle Uhrzeit und Datum in drei verschi
\hline
\%d.\%m\ \%H:\%M:\%S & 23.11 16:47:50 & einfach lesbares Format für Display \\
\hline
\%d.\%m.\%y\ \%H:\%M:\%S & 23.11.2014 & einfaches, exaktes Format für Webinterface \\
\%d.\%m.\%y\ \%H:\%M:\%S & 23.11.2014 16:47:50 & einfaches, exaktes Format für Webinterface \\
\end{tabulary}
\caption{Datumsformate}
\end{table}
\code{main.sh}{bash}{29}{31}
\subsection{Messung}
\label{subsec:main.sh/messung}
Als erstes werden die Sensoren ausgelesen. Am einfachsten kann der im Raspberry Pi integrierte Thermometer für die \acrshort{cpu}-Temperatur ausgelesen werden:
\codeline{main.sh}{bash}{32}
Nur etwas 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.
\code{main.sh}{bash}{33}{40}
Das Programm des Luftfeuchtesensors (siehe \ref{subsec:Luftfeuchtigkeit}) und des Luftdrucksensors (siehe \ref{subsec:Luftdruck}) geben die Feuchtigkeit und die Temperatur durch einen Strichpunkt getrennt an. Daher wird dies zu Beginn als Trennzeichen angegeben.
\codeline{main.sh}{bash}{4}
Danach kann die Ausgabe einfach aufgetrennt werden.
\code{main.sh}{bash}{66}{69}
\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.
\dateiklein{dygraph.csv}
Diese Datei wird auch in den Ordner des Webservers kopiert, damit es grafisch dargestellt werden kann (siehe \ref{}\todo{Link zu Webinterface}). Weiters verwendet die \textit{Endauswertung} (siehe \ref{}\todo{Link zu Endauswertung}) auch diese Datei zur rechnerischen Auswertung.
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}
\lstinputlisting[style=mystyle,caption=text\_ws.txt,basicstyle=\footnotesize]{code/text_ws.txt}
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.
%%\begin{lstlisting}[language=bash,style=terminal]
%%lukas@kinderzimmer:~$ main.sh -h
%%-d csv-Datei leeren
%%für weitere Informationen siehe http://winkler.kremszeile.at/ oder https://github.comFindus23/Umweltdatenmessung
%%\end{lstlisting}