Skip to content
Snippets Groups Projects
Commit e4ab7577 authored by Frederic Aust's avatar Frederic Aust
Browse files

Doku ist nun fertiggestellt; Cocktailmaker GUI funktioniert und steuert...

Doku ist nun fertiggestellt; Cocktailmaker GUI funktioniert und steuert erfolgreich den Mikrocontroller mit der Software aus dem Arduino/cocktailmaschine Verzeichnis
parent 36331bb1
No related branches found
No related tags found
No related merge requests found
Showing
with 981 additions and 22 deletions
...@@ -33,7 +33,7 @@ Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41); ...@@ -33,7 +33,7 @@ Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41);
#define USMIN 600 // This is the rounded 'minimum' microsecond length based on the minimum pulse of 150 #define USMIN 600 // This is the rounded 'minimum' microsecond length based on the minimum pulse of 150
#define USMAX 2400 // This is the rounded 'maximum' microsecond length based on the maximum pulse of 600 #define USMAX 2400 // This is the rounded 'maximum' microsecond length based on the maximum pulse of 600
#define SERVO_FREQ 50 // Analog servos run at ~50 Hz updates but in this case it's 60 Hz #define SERVO_FREQ 50 // Analog servos run at ~50 Hz updates but in this case it's 60 Hz
#define NUM_PUMPS 4 #define NUM_PUMPS 15
#define PIN_AIR_PUMP 13 #define PIN_AIR_PUMP 13
#define PIN_PSU 12 #define PIN_PSU 12
#define TUBE_MOVER 15 #define TUBE_MOVER 15
...@@ -52,13 +52,13 @@ float magic = 461.3; ...@@ -52,13 +52,13 @@ float magic = 461.3;
unsigned long g600 = 419667; unsigned long g600 = 419667;
typedef enum { typedef enum {
pump_ms, PUMP_MS,
pump_g, PUMP_G,
tara, tara,
idle IDLE
} action; } action;
action currentAction = idle; action currentAction = IDLE;
void setup() void setup()
{ {
...@@ -74,6 +74,10 @@ void setup() ...@@ -74,6 +74,10 @@ void setup()
//###################### //######################
// power on PSU
pinMode(PIN_PSU, OUTPUT);
digitalWrite(PIN_PSU, HIGH);
// init Servos // init Servos
pwm.begin(); pwm.begin();
pwm.setPWMFreq(SERVO_FREQ); // Analog servos run at ~60 Hz updates pwm.setPWMFreq(SERVO_FREQ); // Analog servos run at ~60 Hz updates
...@@ -85,15 +89,15 @@ void setup() ...@@ -85,15 +89,15 @@ void setup()
{ {
//openPumpForMs(i, 1000); //openPumpForMs(i, 1000);
closePump(i); closePump(i);
delay(1000);
} }
// power on PSU
pinMode(PIN_PSU, OUTPUT);
digitalWrite(PIN_PSU, HIGH);
//init air pump //init air pump
pinMode(PIN_AIR_PUMP, OUTPUT); pinMode(PIN_AIR_PUMP, OUTPUT);
digitalWrite(PIN_AIR_PUMP, LOW); digitalWrite(PIN_AIR_PUMP, LOW);
//init LEDs
pinMode(LED_BUILTIN, OUTPUT); pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW); digitalWrite(LED_BUILTIN, LOW);
} }
...@@ -111,7 +115,7 @@ void loop() ...@@ -111,7 +115,7 @@ void loop()
weight = getWeight(reading); weight = getWeight(reading);
Serial.println(String(weight)); Serial.println(String(weight));
} }
if (currentAction == pump_ms) if (currentAction == PUMP_MS)
{ {
// Check if any pump reached it's timelimit // Check if any pump reached it's timelimit
unsigned long now = millis(); //get current timestamp unsigned long now = millis(); //get current timestamp
...@@ -129,7 +133,7 @@ void loop() ...@@ -129,7 +133,7 @@ void loop()
} }
} }
} else if (currentAction == pump_g) } else if (currentAction == PUMP_G)
{ {
// if weightlimit reached stop pummping // if weightlimit reached stop pummping
...@@ -169,7 +173,7 @@ void loop() ...@@ -169,7 +173,7 @@ void loop()
} }
else if (currentAction == tara) else if (currentAction == tara)
{ {
currentAction = idle; currentAction = IDLE;
initScale(); initScale();
setLedMode(3); setLedMode(3);
} }
...@@ -177,7 +181,7 @@ void loop() ...@@ -177,7 +181,7 @@ void loop()
if (keepPumping == false) if (keepPumping == false)
{ {
deactivateAirPump(); deactivateAirPump();
currentAction = idle; currentAction = IDLE;
goalWeight = 0; goalWeight = 0;
setLedMode(3); setLedMode(3);
} }
...@@ -209,7 +213,7 @@ void interpretInput(String input) ...@@ -209,7 +213,7 @@ void interpretInput(String input)
unsigned long pumpG[NUM_PUMPS]; unsigned long pumpG[NUM_PUMPS];
currentAction = idle; currentAction = IDLE;
setLedMode(3); setLedMode(3);
while ((str = strtok_r(p, ";", &p)) != NULL) // delimiter is the semicolon while ((str = strtok_r(p, ";", &p)) != NULL) // delimiter is the semicolon
...@@ -220,12 +224,12 @@ void interpretInput(String input) ...@@ -220,12 +224,12 @@ void interpretInput(String input)
// get Action // get Action
if (String(str) == "t") if (String(str) == "t")
{ {
currentAction = pump_ms; currentAction = PUMP_MS;
setLedMode(1); setLedMode(1);
continue; continue;
} else if (String(str) == "g") } else if (String(str) == "g")
{ {
currentAction = pump_g; currentAction = PUMP_G;
setLedMode(1); setLedMode(1);
continue; continue;
} else if (String(str) == "tara") } else if (String(str) == "tara")
...@@ -236,11 +240,11 @@ void interpretInput(String input) ...@@ -236,11 +240,11 @@ void interpretInput(String input)
} }
// get g /ms based on action // get g /ms based on action
if (currentAction == pump_ms) if (currentAction == PUMP_MS)
{ {
pumpMS[i] = strtoul(str, NULL, 10); // := milliseconds pumpMS[i] = strtoul(str, NULL, 10); // := milliseconds
} }
else if (currentAction == pump_g) else if (currentAction == PUMP_G)
{ {
//pumpId = str; //pumpId = str;
//if ((goalWeight = strtok_r(p, ";", &p)) != NULL) //if ((goalWeight = strtok_r(p, ";", &p)) != NULL)
...@@ -259,7 +263,7 @@ void interpretInput(String input) ...@@ -259,7 +263,7 @@ void interpretInput(String input)
Serial.println("done"); Serial.println("done");
if (currentAction == pump_ms) if (currentAction == PUMP_MS)
{ {
for (uint8_t i = 0; i < NUM_PUMPS; i++) for (uint8_t i = 0; i < NUM_PUMPS; i++)
{ {
...@@ -272,7 +276,7 @@ void interpretInput(String input) ...@@ -272,7 +276,7 @@ void interpretInput(String input)
closePump(i); closePump(i);
} }
} }
} else if (currentAction == pump_g) } else if (currentAction == PUMP_G)
{ {
goalWeight = 0; goalWeight = 0;
bool firstSet = false; bool firstSet = false;
......
...@@ -10,8 +10,10 @@ void mainMenue() ...@@ -10,8 +10,10 @@ void mainMenue()
void closePump(uint8_t servo) void closePump(uint8_t servo)
{ {
setServoToDegree(servo, 20); // tubes are pressed //setServoToDegree(servo, 20); // tubes are pressed
setServoToDegree(servo, 100); // tubes are pressed
Serial.println("Servo: "+String(servo)+" closed"); Serial.println("Servo: "+String(servo)+" closed");
} }
void openPumpForMs(uint8_t servo, unsigned long milliseconds) void openPumpForMs(uint8_t servo, unsigned long milliseconds)
...@@ -38,7 +40,6 @@ void activateAirPump() ...@@ -38,7 +40,6 @@ void activateAirPump()
void deactivateAirPump() void deactivateAirPump()
{ {
// TODO to be implemented
//Serial.println("Air Pump deactivated"); //Serial.println("Air Pump deactivated");
digitalWrite(PIN_AIR_PUMP, LOW); digitalWrite(PIN_AIR_PUMP, LOW);
digitalWrite(LED_BUILTIN, LOW); digitalWrite(LED_BUILTIN, LOW);
...@@ -60,7 +61,7 @@ void initScale() { ...@@ -60,7 +61,7 @@ void initScale() {
Serial.println("Begin: Init Scale - Tara"); Serial.println("Begin: Init Scale - Tara");
unsigned long initMedian = 0; unsigned long initMedian = 0;
int i = 0; int i = 0;
for (; i < 100; i++) { for (; i < 20; i++) {
long reading = scale.read(); long reading = scale.read();
initMedian += abs(reading); initMedian += abs(reading);
delay(100); delay(100);
......
# LaTeX-Vorlage CVH
Eine LaTeX-Vorlage, die man für Abschlussarbeiten aber auch Dokumentationen nehmen kann.
\ No newline at end of file
Dokumentation/_attachments/cat.jpg

970 KiB

% Encoding: UTF-8
@article{MakeLabornetzteil,
author = {Jack Henschel},
title = {PC-Netzteil als Labor-Stromversorgung},
journal = {Make Magazin},
volume = {5},
year = {2015},
pages = {82--87},
}
@book{giancoli2006physik,
title={Physik},
pages={608},
author={Giancoli, D.C. and Eibl, O.},
isbn={9783827371577},
series={Pearson Studium - Physik},
url={https://books.google.de/books?id=x-Y2F9xxAWMC},
year={2006},
publisher={Pearson Studium}
}
@Online{hector9000,
author = {Cadmium},
title = {{Hector 9000}},
url = {https://hackaday.io/project/161585-hector-9000},
note = {Datum des Zugriffs: 03.02.2022},
timestamp = {2022-02-03}
}
@Comment{jabref-meta: databaseType:biblatex;}
@online{hector9000CAD,
author = {cadm1um},
title = {GitHub: Hector9000CAD},
note = {Datum des Zugriffs: 03.02.2022},
timestamp = {2022-02-03},
url = {https://github.com/H3c702/Hector9000CAD}
}
@online{fusion360,
author = {Autodesk},
title = {Fusion 360},
note = {Datum des Zugriffs: 09.03.2022},
timestamp = {2022-03-09},
url = {https://www.autodesk.com/products/fusion-360/overview}
}
% -*- coding: utf-8 -*-
% !TEX encoding = UTF-8 Unicode
% !TEX root = main.tex
\chapter{Beispiel Kapitel}
\label{chap:beispiel-kapitel}
In diesem Kapitel wird eine sehr kurze Einleitung in die Verwendung von \verb|LaTeX| beschrieben.\\
Für die Erstellung der Arbeit kann über \url{http://www.texstudio.org/} mit installierter TeX-Distribution \url{https://miktex.org/} das TeXstudio heruntergeladen werden.
\section{Abbildungen}
Eine Abbildung lässt sich einfach über einfügen: \par\medskip
\lstset{language=TeX}
\begin{lstlisting}
\begin{figure}[h]
\centering
\includegraphics[width=\textwidth]{foc-ac-dc.pdf}
\caption{Beschriftung der Abbildung}
\label{fig:foc-ac-dc}
\end{figure}
\FloatBarrier
\end{lstlisting}
Die breite der Abbildung kann einerseits skaliert oder direkt im Maßstab von \SI{14.5}{\centi\meter} erstellt werden.
Wenn die Abbildung maßstabsgetreu erstellt wird, muss \verb|\centering| und der optionale Befehl \verb|[width=\textwidth]| nicht zwingend übernommen werden.\par\medskip
Es werden beim Auftreten des Befehls \verb|\FloatBarrier| alle bis dahin eingefügten Float-Umgebungen gesetzt Das kann z.B. dazu verwendet werden, dass Floats, wie figure oder table, nicht unterhalb einer neuen \verb|section| oder \verb|chapter| ausgegeben werden.\par\medskip
Abbildung \ref{fig:foc-dc-ac} zeigt \ldots \par\medskip
\begin{figure}[h]
\centering
\includegraphics[width=\textwidth]{foc-dc-ac.pdf}
\caption{Beschriftung der Abbildung}
\label{fig:foc-dc-ac}
\end{figure}
\FloatBarrier
Durch setzten des \verb|[h]| hinter der \verb|figure| Umgebung, kann die Positionierung der Abbildung festgelegt werden.\par\medskip
Dabei sind folgende Werte ebenfalls möglich:
\begin{enumerate}
\item h (here) - Gleicher Ort
\item t (top) - Oben auf der Seite
\item b (bottom) - Unten auf der Seite
\item p (page) - Auf einer eigenen Seite
\item ! (override) - Erzwingt die angegebene Position
\end{enumerate}
\section{Tabellen}\label{sec:tab}
Zur Erstellung einfacher Tabellen, bietet die Website \url{http://www.tablesgenerator.com/} eine einfach zu bedienende Oberfläche. \par\medskip %erzeugt einen mittleren Abstand
Für komplexere Tabellen können die \verb|multicol| und \verb|multirow| Pakete verwendet werden, wie in Tabelle \ref{tab:vgl_mosfet} dargestellt \cite{dalton}.
\begin{table}[h]
\centering
\renewcommand{\arraystretch}{1.6}
\begin{tabular}{lc|c|c|c|l}
\cline{3-5}
& \multicolumn{1}{l|}{} & \multicolumn{3}{c|}{MOSFET} & \\ \cline{3-5}
& \multicolumn{1}{l|}{} & IRFS7530 & IPB019N08N3 & CSD19536KCS & \\ \cline{3-5}
& \multicolumn{1}{l|}{} & International Rectifier & Infineon & Texas Instruments & \\ \cline{1-5}
\multicolumn{1}{|l|}{\multirow{4}{*}{\begin{turn}{90}Parameter\end{turn}}} & $Q_{\mathsf{G}}$ & 354 \nano\coulomb & 206 \nano\coulomb & 153 \nano\coulomb & \\ \cline{2-5}
\multicolumn{1}{|l|}{} & $Q_{\mathsf{GS}}$ & 62 \nano\coulomb & 50 \nano\coulomb & 37 \nano\coulomb & \\ \cline{2-5}
\multicolumn{1}{|l|}{} & $Q_{\mathsf{GD}}$ & 73 \nano\coulomb & 30 \nano\coulomb & 17 \nano\coulomb & \\ \cline{2-5}
\multicolumn{1}{|l|}{} & $R_{\mathsf{DSon}}$ & 1,4 \milli\ohm & 1,9 \milli\ohm & 3,5 \milli\ohm & \\ \cline{1-5}
\end{tabular}
\caption{Vergleich verschiedener MOSFET \cite{dalton}}
\label{tab:vgl_mosfet}
\end{table}
\FloatBarrier
\section{Zitate}\label{sec:cite}
Für Zitationen wird \verb|BibLaTeX| verwendet. Als Backend wird \verb|bibtex| vom Compiler verlangt.
\begin{quote}
\enquote{Bei jeder permanentmagneterregten Synchronmaschine ändern sich die Induktivitäten in Abhängigkeit von der Last. In erster Linie sind dafür die Sättigungseffekte, aber auch die Kreuzkopplung verantwortlich.} \autocite[S.~2]{ternes2015}
\end{quote}
Im Text zitierte Werke werden über die Syntax \verb|\textcite[S.~2]{ternes2015}| korrekt zitiert. Beispielsweise: Wie in \cite{ternes2015} erläutert, sind die Induktivitäten abhängig von der Last \ldots \par\medskip
Der aktuelle Stil des Literaturverzeichnisses und der Zitationen ist \verb|IEEEtran|, kann aber auch in Absprache geändert werden, dazu empfiehlt es sich, die \verb|BibLaTeX|-Dokumentation zu konsultieren.\\
\clearpage
\section{Anhänge}\label{sec:Anhang}
Um Anhänge zu referenzieren, können diese mit Hilfe des erstellten Anhangs (vgl. \ref{anhang_LastenheftEpOS}) referenziert werden.
\section{Formeln}\label{sec:Formeln}
Bei Implementierung von Formeln mit eingesetzten Werten, erweist sich eine Kombination von Tabelle und Formel als Sinnvoll. Tabelle \ref{tab:param_voltageDrop} zeigt die in Formel \ref{eq:voltagedrop} eingesetzten Parameter, mit Beschreibung sowie dem zugehörigen Wert \cite{drv8303}. \par\medskip
\begin{table}[h]
\centering
\begin{tabular}{ccc}
\hline
Parameter & Beschreibung & Wert \\ \hline
$V_{\mathsf{0}}$ & Maximale Ausgangsspannung & 3,3\ \volt \\
$V_{\mathsf{REF}}$ & Referenz-Spannung & 3,3\ \volt \\
$G$ & Verstärkungsfaktor & 40 $\frac{\volt}{\volt}$ \\
${R}_{\mathsf{SHUNT}}$ & Shunt-Widerstand & $500\ \micro\ohm$ \\ \hline
\end{tabular}
\caption{Parameter der Operationsverstärker-Einstellungen des DRV8303}
\label{tab:param_voltageDrop}
\end{table}
\begin{equation}
\centering
V_{\mathsf{Smax}} = {\lvert ({SN}_{\mathsf{x}} - {SP}_{\mathsf{x}}) \rvert}_{\mathsf{max}} = \left( \frac{ \left({V}_{0} - \frac{ {V}_{\mathsf{REF}}}{2} \right)}{G}\right) = 41,25\ \milli \volt
\label{eq:voltagedrop}
\end{equation}
\FloatBarrier
%%% Local Variables:
%%% mode: latex
%%% TeX-master: "main"
%%% TeX-open-quote: "\\enquote{"
%%% TeX-close-quote: "}"
%%% LaTeX-csquotes-open-quote: "\\enquote{"
%%% LaTeX-csquotes-close-quote: "}"
%%% End:
\chapter{Anhang}
Der Anhang kann dazu dienen große Bilder oder langen Quellcode zu beinhalten, falls dieser für den Text der Dokumentation unübersichtlich gestalten würde.
\section{Skizze}
\label{sec:anhang_konzept}
\begin{figure}[h]
\centering
\includegraphics[width=1\textwidth]{_attachments/cat.jpg}
\caption{Als Belohnung gibt es eine Katze}
\label{fig:cat}
\end{figure}
\ No newline at end of file
% -*- coding: utf-8 -*-
% !TEX encoding = UTF-8 Unicode
% !TEX root = main.tex
\chapter{Einleitung}
\label{chap:einleitung}
Ziel des Projektes ist die Entwicklung einer Cocktailmaschine, die mehrere Flüssigkeiten anhand eines Rezepts mischt.
Dabei werden Pumpen angesteuert, um unterschiedliche Getränke aus den Flaschen in ein Glas zu transportieren. Damit die Fördermenge genauer gesteuert werden kommen Ventile zum Einsatz, ebenso wie eine Waage. Mit dieser wird das Gewicht der ins Glas gefüllten Flüssigkeit ermittelt, um daraus auf die Füllmenge zu schließen. Über einzeln steuerbare \ac{LED}'s wird der aktuelle Status dargestellt.
Über das Programm Cocktailmaker wird die Maschine gesteuert. Dabei wählen Benutzer*innen mittels grafischer Oberfläche das gewünschte Getränk aus und starten den Ausschank. Die Rezepte sind lokal hinterlegt und nicht hart codiert, was eine Erweiterung ohne Neukompilierung ermöglicht.
\section{Anforderungen}
\label{sec:einleitungAnforderungen}
Für die Mischung eines Cocktails werden verschiedene Getränkearten verwendet. Zum einen Softdrinks die mit Kohlensäure versetzt sind, wie Cola oder Fanta und zum Anderen welche Ohne, wie beispielsweise Spirituosen und Säfte. Zudem sind unterschiedliche Viskositäten zu beachten, wie zum Beispiel dickflüssiger Sirup.
Die Hardware muss in den Bereichen wo Sie mit Lebensmitteln in Kontakt kommt lebensmittelecht und leicht zu reinigen sein, um eine Wiederverwendung zu ermöglichen. Zudem soll die Hardware günstig und die Konstruktion simpel sein, damit möglichst viele Interessent*innen die Möglichkeit haben das Projekt nachzubauen. Aufgrund dieser Anforderung ist der verwendete Code auf GitLab als Open Source unter der \ac{AGPL3} veröffentlicht.
Abschließend soll das Projekt möglichst einfach zu erweitern und warten sein. Dabei sind die Erweiterungen nicht nur auf mehr Flaschen bezogen, sondern auch auf mögliche neue Funktionen.
% -*- coding: utf-8 -*-
% !TEX encoding = UTF-8 Unicode
% !TEX root = main.tex
\chapter{Fazit und Ausblick}
\label{chap:fazit}
Das Projekt ist in der Zeit vor den Kontaktbeschränkung der Corona-Pandemie entstanden und versprach die Getränkeauswahl bei Partys zu optimieren, sowie überdosierte, schlecht gemischte Cocktails zu vermeiden. Zudem sollte die Cocktailmaschine den Anreiz schaffen etwas neues auszuprobieren. Die Grundlage dafür ist erfolgreich geschaffen, denn es können verschiedene Rezepte inklusive Bild hinterlegt werden, welche in gleichbleibender Qualität ausgegeben werden. Außerdem ist die Bedienung einfach. Reinigung und Transport sind nur mit geringem Aufwand verbunden, was die häufige Verwendung wahrscheinlich macht.
Die Auflage, dass das Projekt möglichst günstig bleibt war insbesondere bei den Motoren eine Herausforderung, führte zu Problemen. Die aus China importieren Varianten der Motoren sind nicht so leistungsstark wie die Originalen, was in Situationen, wo die Endposition nicht angefahren werden konnte, zu einer Überlastung des Driverboards führte. Bei einem Nachbau des Projekts sollt daher auf Hardware mit besserer Qualität geachtet werden.
Insgesamt sind die Kosten mit unter 100\,€ gering geblieben, was dank einfacher Konstruktion und quelloffenem Code zum Nachbauen einlädt.
Da die Anforderungen aus Abschnitt \ref{sec:einleitungAnforderungen} erfüllt sind kann das Projekt als erfolgreich angesehen werden.
\section{Ausblick}
\label{sec:fazit_ausblick}
Im Projektverlauf und den Tests haben sich noch Ideen für Erweiterungen entwickelt. Derzeit ist die Rezeptdatenbank auf allgemein bekannte und lokal gespeicherte Rezepte limitiert. Einer der ursprünglichen Gedanken war, mit Hilfe der Cocktailmaschine, Anregungen zu schaffen und neue Rezepte auszuprobieren. Dies ließe sich beispielsweise durch einen Anschluss an die Website makemeadrink.com realisieren, auf der Benutzer eigene Rezepte hochladen können.
Zudem ist das Gehäuse ausbaufähig. Aktuell ist es funktional gehalten, so dass es leicht zu transportieren und warten ist. Ein ästhetisch ansprechendes Gehäuse würde die Maschine insgesamt aufwerten, zudem ließe sich eine Bedienoberfläche direkt integrieren. Dank Corona war es allerdings noch nicht möglich in einem Maker-Space an dem neuen Gehäuse zu arbeiten.
\section{Persönliches Fazit}
\label{sec:fazit_persoenlich}
Dieses Projekt war eine interessante Erfahrung und hat mich viel über Elektronik, Motorensteuerung und die Funktionsweise von Waagen gelehrt. Angefangen bei der Verwendung von Relais und die Funktionsweise der Luftpumpe über das demontieren einer Küchenwaage und die anschließende Verwendung des Wägeelements. Es war spannend auszuprobieren, wie die verschiedenen Bauteile angestuert werden und miteinander arbeiten. Zudem war es interessant die Verbindung von Windows- und Embeddedprogrammierung einzusetzen. Leider war es keine gute Idee für die Motoren günstigere Kopien, anstelle der Originalen zu verwenden, da Sie weniger Leistung haben und nicht zu verlässig funktionieren, was zu stellenweise unnötigen Problemen führte. Insgesamt ist das Ergebnis gut zu verwenden und ich freue mich darauf, welche Erweiterungen noch kommen werden. Durch die letzte Konstruktion ist die Cocktailmaschine sehr mobil und wird vermutlich häufig eingesetzt. Wahrscheinlich werden schon während des nächsten Einsatzes neue Funktionen geplant.
% -*- coding: utf-8 -*-
% !TEX encoding = UTF-8 Unicode
% !TEX root = main.tex
\chapter{Hardware}
\label{chap:hardware}
\section{Mikrocontroller}
\label{sec:hardwareMikrocontroller}
Zur Steuerung der Hardware wird ein Eleego Uno R3 verwendet. Dieser ist weit verbreitet, da er in diversen Startpaketen zusammen mit einer Vielzahl von Sensoren enthalten ist. Zudem verfügt er über 14 digitale I/O Pins und 8 analoge Eingänge. Zudem stehen 2 \ac{IIC} Schnittstellen zur Verfügung. Eine dieser Schnittstellen wird für die Waage aus Abschnitt \ref{sec:hardwareWaage} verwendet.
\section{Pumpen}
\label{sec:hardwarePumpen}
Für das Projekt kommen zwei Arten von Pumpen zum Einsatz. Diese unterscheiden sich signifikant in Funktionsweise, Fördermenge und Genauigkeit. Es werden Pumpen und Schläuche aus dem Aquarium-Zubehör verwendet, da diese günstig, lebensmittelecht und verbreitet sind.
\subsection{Luftpumpe}
\label{sec:hardwarePumpenLuftpumpe}
Für ein hohes Fördervolumen wird eine Luftpumpe verwendet. Diese verfügt über einen Blasebalg, der durch die sinusförmige Amplitudenänderung im 230\,V AC Netz mit Hilfe eines Elektromagneten zusammengezogen wird. Die Pumpenstärke wird über ein Stellrad geregelt, welches den Magneten näher an den Blasebalg führt, siehe Abbildung \ref{fig:luftpumpeAufgeschraubt}. Je geringer der Abstand, desto größer ist der Einfluss das Magnetfeldes und der Blasebalg entsprechend stärker zusammengedrückt, was zu einem erhöhten Luftdruck führt.
Aufgrund der Funktionsweise kann die Luftpumpe mit einem Relais gesteuert werden, welches die Stromzufuhr aktiviert, wenn die Pumpe arbeiten soll. Dabei ist zu beachten, dass die Pumpe mit 230\,V betrieben wird. Bei der Arbeit mit der Stromversorgung und den Relais muss besonders darauf geachtet werden, dass keine leitenden Stellen bei aktiver Stromversorgung berührt werden!
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.4\textwidth]{Luftpumpe Aufbau.jpeg} % wir müssen hier nicht _img/ schreiben, der in der main.tex der Pfad für alle Grafiken bereits angelegt wurde.
\caption{Aufgeschraubte Luftpumpe mit getrenntem Stromkabel
\label{fig:luftpumpeAufgeschraubt}}
\end{center}
\end{figure}
\subsection{Peristaltikpumpe}
\label{sec:hardwarePumpenPristaltik}
Bei dieser Pumpenart sind die Schlauchanschlüsse mit einem weichen, flexiblen Schlauch verbunden, welcher durch das Kopfstück der Pumpe konstant an mindestens einer Stelle abgequetscht ist. Der Teil, der gegen den Schlauch drückt, wird vom Motor entlang des Schlauches bewegt. Dadurch wird am Eingang ein Unterdruck und am Ausgang ein Überdruck erzeugt, wodurch die Flüssigkeit gefördert wird. Sobald der Motor die Bewegung stoppt, kann aufgrund der Bauart, die Flüssigkeit nicht mehr fließen. Durch diesen Aufbau ist eine genaue Förderung möglich, allerdings ist das Durchflussvolumen mit ca 80\,ml bis 150\,ml pro Minute sehr gering. Die verwendete Pumpe \ref{fig:peristaltikpumpe} benötigt eine Spannung von 12\,V und wird ebenfalls über ein Relais gesteuert.
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.4\textwidth]{Peristaltikpumpe.jpeg} % wir müssen hier nicht _img/ schreiben, der in der main.tex der Pfad für alle Grafiken bereits angelegt wurde.
\caption{Peristaltikpumpe
\label{fig:peristaltikpumpe}}
\end{center}
\end{figure}
\section{Schläuche}
\label{sec:hardwareSchlauche}
Bei den Schläuchen ist darauf zu achten, dass diese lebensmittelecht sind, da die Getränke durch selbige gefördert werden und ein Teil der Schläuche bis zum Boden der Flaschen reicht. Durch die in Abbildung \ref{fig:schlaucheFlaschenanschluss} gezeigten manipulierten Deckel werden die Schläuche hineingeführt. Die Funktionsweise des so umgesetzten Förderung wird in Abschnitt \ref{sec:konstruktionBlasebalg} eingegangen. Aufgrund der Quetschventile aus Abschnitt \ref{sec:hardwareQVentil} müssen Sie sehr flexibel sein und einen 6\,mm Außen- / 4\,mm Innendurchmesser haben. Diese werden im Aquariumbedarf eingesetzt.
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.3\textwidth]{Flaschenanschluss.jpeg} % wir müssen hier nicht _img/ schreiben, der in der main.tex der Pfad für alle Grafiken bereits angelegt wurde.
\caption{Schläuche im Flaschenanschluss
\label{fig:schlaucheFlaschenanschluss}}
\end{center}
\end{figure}
\section{Motoren}
Abgeleitet von dem Projekt Hector 9000 \cite{hector9000} werden Longrunner LKY62 Motoren \ref{fig:motor} und ein PCA9685 Driver Board von Sunfounder \ref{fig:motorDriverBoardMontiert} verwendet. Das Board bietet dabei 16 Motorenanschlüsse und es können bis zu 62 Boards in Reihe geschaltet werden. Die Kommunikation mit dem Board findet mittels \ac{IIC} statt. wird eine externe Stromversorgung von 5\,V und mindestens 300\,mA pro Motor benötigt. Diese Spitzenlast ist im Projektverlauf aufgefallen, wenn die Motoren ihr Ziel nicht vollständig anfahren konnten, beziehungsweise als kurzzeitige Spitze zu Beginn des Anfahrvorgangs. Um die Suche nach diesem Fehler vorzubeugen, wird hier auf eine ausreichend dimensionierte Spannungsversorgung hingewiesen.
Die Motoren werden sowohl für die Quetschventile \ref{fig:quetschventilMontiert}, als auch für den Schlaucharm \ref{fig:schlaucharmMotorMontiert} eingesetzt.
\begin{multicols}{2}
\begin{figure}[H]%
\includegraphics[width=0.6\textwidth]{Motor Driver.jpeg}
\caption{PCA9685 Diver Board am Holzkreuz montiert
\label{fig:motorDriverBoardMontiert}}
\end{figure}
\begin{figure}[H]
\includegraphics[width=0.4\textwidth]{Motor.jpeg} % wir müssen hier nicht _img/ schreiben, der in der main.tex der Pfad für alle Grafiken bereits angelegt wurde.
\caption{LKY62 Motor
\label{fig:motor}}
\end{figure}
\end{multicols}
Beim Schlaucharm sorgt ein Motor dafür, dass die Schläuche nur dann über der Waage sind, wenn ein Getränk ausgegeben wird. Dadurch wird größtenteils verhindert, dass nach dem Ausschenkvorgang Reste auf die Waage tropfen und schlimmstenfalls in die Elektronik gelangen.
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.8\textwidth]{Schlaucharmmotor.jpeg} % wir müssen hier nicht _img/ schreiben, der in der main.tex der Pfad für alle Grafiken bereits angelegt wurde.
\caption{Schlaucharm mit Motor am Holzkreuz montiert
\label{fig:schlaucharmMotorMontiert}}
\end{center}
\end{figure}
\cleardoublepage
\section{Ventile}
\subsection{Quetschventil}
\label{sec:hardwareQVentil}
Die Ventilart ist dem Hector 9000 entnommen, ebenso werden dessen 3D-Modelle \cite{hector9000CAD} verwendet. Dabei werden die Luftzufuhr- und die Flüssigkeitsabfuhrschläuche simultan abgeklemmt. Dadurch kann keine weitere Flüssigkeit aus der Flasche gelangen und der Druck innerhalb der Flasche nimmt langsamer ab. Der Vorteil fällt gerade bei Kohlensäure haltigen Getränken in weichen Flaschen auf, da bei Diesen der notwendige Druck abhängig von Füllstand und Öffnungszeit der Flasche steigt.
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.4\textwidth]{Quetschventil.jpeg} % wir müssen hier nicht _img/ schreiben, der in der main.tex der Pfad für alle Grafiken bereits angelegt wurde.
\caption{Quetschventil am Holzkreuz montiert
\label{fig:quetschventilMontiert}}
\end{center}
\end{figure}
\subsection{Magnetventil}
\label{sec:hardwareMVentil}
Um nur die Luftzufuhr zu unterbrechen, werden Magnetventile eingesetzt, welche Luft in eine Richtung durchlassen, wenn der interne Elektromagnet mit 12\,V versorgt wird. Ansonsten sind Sie geschlossen und unterbinden den Luftstrom. Damit wird der Druckaufbau innerhalb einer Flasche und damit effektiv die Füllmenge kontrolliert. Bei kohlensäurehaltigen Getränken steigt der Überdruck zwar nicht weiter, allerdings wird auch nicht der Abfluss unterbunden. Dies führt zu einem Nachtropfen, bis der Innendruck abgenommen hat.
Der Anschlussdurchmesser der hier verwendeten Magnetventile ist signifikant größer als die in Abschnitt \ref{sec:hardwareSchlauche} beschriebenen Schläuche, weshalb Adapter mittels 3D-Druck erstellt wurden.
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.4\textwidth]{Magnetventil installiert.jpeg} % wir müssen hier nicht _img/ schreiben, der in der main.tex der Pfad für alle Grafiken bereits angelegt wurde.
\caption{Magnetventil mit Schlauchadapter
\label{fig:magnetventilMitAdapter}}
\end{center}
\end{figure}
\section{Waage}
\label{sec:hardwareWaage}
Zur zyklischen Gewichtsmessung werden Teile einer ausgemusterten Küchenwaage verwendet. Der Vorteil dabei ist die Genauigkeit von ca. 1\,g, was für dieses Projekt ausreichend ist, da es sich üblicherweise um Mengenabstufungen von $\geq$ 10\,ml (ca. 10\,g) handelt. Für die Ansteuerung der Wägezelle wird ein HX711 Modul als Verstärker verwendet, welches über IIC angesteuert wird. Für die Waage wird keine externe Stromversorgung benötigt, es reicht der Anschluss über die GPIO Pins des Mikrocontrollers.
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.8\textwidth]{Waage.jpeg} % wir müssen hier nicht _img/ schreiben, der in der main.tex der Pfad für alle Grafiken bereits angelegt wurde.
\caption{Waage am Holzkreuz montiert
\label{fig:waageMontiert}}
\end{center}
\end{figure}
\section{Beleuchtung}
Für die Beleuchtung wird ein LED-Stripe mit WS2812b LEDs eingesetzt. Es wird eine externe Stromversorgung von 5\,V verwendet, um den Mikrocontroller zu entlasen, da bis zu 60\,mA pro LED benötigt werden. Bei der Verkabelung ist zu beachten, dass die Masse der LED-Strips mit einem Masse-Pin des Mikrocontrollers verbunden ist, da es ansonsten zu Übertragungsfehlern kommt und die Steuerung der LEDs nicht zuverlässig funktioniert. In der Konstruktion Holzkreuz \ref{sec:konstruktionHolzkreuz} werden die Leds wie in Abbildung \ref{fig:ws2812bInstalliert} verbaut.
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.8\textwidth]{WS2812b LEDs.jpg} % wir müssen hier nicht _img/ schreiben, der in der main.tex der Pfad für alle Grafiken bereits angelegt wurde.
\caption{WS2812b LEDs unter dem Querbalken vom Holzkreuz installiert
\label{fig:ws2812bInstalliert}}
\end{center}
\end{figure}
\subsection{Stromversorgung}
Als Stromversorgung kommt ein ATX-Netzteil zu Einsatz. Durch die Leistungsaufnahme moderner Computerhardware sind diese Netzteile meistens hoch dimensioniert, was dazu führt das leistungsärmere Varianten ersetzt werden. Dadurch sind Sie weit verbreitet und es existieren vielen Anleitungen, wie die Netzteile weiter verwendet werden können. Sie werden beispielsweise als günstige Labornetzteile \cite{MakeLabornetzteil} zweckentfremdet, so auch in diesem Projekt.
Von einem ATX-Netzteil gehen mehrere Kabel ab. Diese sind zur Unterscheidung mit verschiedenen Farben gekennzeichnet, wodurch die gelieferte Spannung, Masse und der Einschalter unterschieden werden.
\begin{itemize}
\item + 12\,V (Gelb)
\item - 12\,V (Blau)
\item + 5\,V (Rot)
\item - 5\,V (Weiß)
\item + 3,3\,V (Orange)
\item Masse / GND (Schwarz)
\item Einschalter / PS ON (Grün)
\item + 5\,VSB (Lila)
\end{itemize}
Für das Projekt werden allerdings nur die + 5\,V DC und +12\,V DC benötigt.
Zum Einschalten des Netzteils wird das PS ON Kabel mit einem Masse-Kabel verbunden. Diese Verbindung wird mittels eines Relais hergestellt, wodurch das Netzteil zur Laufzeit durch den Mikrocontroller eingeschaltet werden kann.
\section{3D-Druck}
Der 3D-Druck bietet die Möglichkeit schnell, einfach und kostengünstig Adapter, Gehäuse und sonstige Bauteile zu erstellen.
Die Modelle für den Schlaucharm \ref{fig:schlaucharm} und dessen Motorgehäuse \ref{fig:schlaucharmmotorhalterung} wurden auf diese Art angefertigt. Ebenso sind die Adapter von den Magnetventilen \ref{fig:schlauchadapter} zu den Schläuchen 3D-Druckmodelle, da der Schlauchdurchmesser signifikant kleiner ist als die Gewinde der Ventile. Erstellt wurden die Bauteile mit dem Programm Fusion 360 von Autodesk. \cite{fusion360}
\begin{multicols}{2}
\begin{figure}[H]
\includegraphics[width=0.4\textwidth]{Schlauchadapter.jpg} % wir müssen hier nicht _img/ schreiben, der in der main.tex der Pfad für alle Grafiken bereits angelegt wurde.
\caption{3d-Modell Magnetventil-Schlauch-Adapter
\label{fig:schlauchadapter}}
\end{figure}
\begin{figure}[H]
\includegraphics[width=0.4\textwidth]{Schlaucharmmotorhalterung.jpg} % wir müssen hier nicht _img/ schreiben, der in der main.tex der Pfad für alle Grafiken bereits angelegt wurde.
\caption{3D-Modell Halterung für den Schlaucharm-Motor
\label{fig:schlaucharmmotorhalterung}}
\end{figure}
\end{multicols}
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.5\textwidth]{Schlaucharm.jpg} % wir müssen hier nicht _img/ schreiben, der in der main.tex der Pfad für alle Grafiken bereits angelegt wurde.
\caption{3D-Modell Schlaucharm
\label{fig:schlaucharm}}
\end{center}
\end{figure}
% -*- coding: utf-8 -*-
% !TEX encoding = UTF-8 Unicode
% !TEX root = main.tex
\chapter{Darstellung von Informationen}
\label{chap:informationsdarstellung}
\section{Listen}
\label{sec:info_listen}
\subsection{Listen ohne Nummerierung}
\label{sec:info_unnummeriert}
\begin{itemize}%[label=$\ast$] setzt das Aufzählungszeichen für die gesamte Liste
\item Erstens
\begin{itemize}
\item Ineinanderverschachtelung ist möglich
\item Die Aufzählungszeichen werden dann automatisch bestimmt
\begin{itemize}
\item Die Verschachtelung sollte nicht zu komplex werden
\end{itemize}
\end{itemize}
\item Zweitens
\item[--] Änderung der Aufzählungszeichen
\item[$-$] Es kann grundlegend jedes Mathematische Symbol genutzt werden
\item[$\ast$] Stern
\item[$\cdot$] Multiplikationssymbol
\end{itemize}
\subsection{Listen mit Nummerierung}
\label{sec:info_nummeriert}
\begin{enumerate}%[label=\alph*)] oder [label=\arabic*)] oder [label=roman*)] setzt Aufzählungsart für die gesamte Liste
\item Erstens
\begin{enumerate}
\item Ineinanderverschachtelung ist möglich
\item Die Aufzählungszeichen werden dann automatisch bestimmt
\begin{itemize}
\item Listenarten sind mischbar
\end{itemize}
\end{enumerate}
\item Zweitens
\item[$\ast$] Die Aufzählung kann durch eine eigene Anführungszeichen unterbrochen werden
\item Drittens
\end{enumerate}
\section{Tabellen}
\label{sec:info_tabellen}
Für die Tabellen wird das Package \textit{longtable} genutzt, da es einige Vorteile, wie seitenübergreifende Tabellen und eine sinnvolle mehrfache Nutzung der horizontalen Linien mit sich bringt. Für die Verlinkung zum Tabellenverzeichnis wird noch einmal eine eigene Tabellenumgebung instanziiert. Das geht wahrscheinlich sinnvoller, aber zum jetzigen Zeitpunkt scheint dies eine schnelle, einfache und stabile Lösung zu sein.
\subsection{Kleine Tabellen}
\label{sec:info_tabelle_klein}
\begin{table}[H] % Das [H] steht für Here. Somit wird sichergestellt, dass die Tabelle auch wirklich an dieser Stelle erscheint. Ein kleines [h] lässt LaTeX ein wenig Spielraum beim Setzen der Tabelle und keine Option überlässt LaTeX eine freie Positionierung im Dokument
\begin{center}
\begin{tabular}{|l|c|r|} % Die | stehen für die vertikalen Ränder in der Tabelle, \hline bedeutet eine horizontale Linie
\hline
\textbf{Spalte 1} & \textbf{Spalte 2} & \textbf{Spalte 3} \\
\hline\hline % dickere Linie
links & mitte & rechts \\\hline
links & mitte & rechts \\\hline
\end{tabular}
\end{center}
\caption{Kleine, mittig zentrierte Tabelle mit \textit{tabular}}
\label{tab:lcr_tabelle_tabular}
\end{table}
\begin{longtable}{|l|c|r|}
\hline
\textbf{Spalte 1} & \textbf{Spalte 2} & \textbf{Spalte 3} \\
\hline\hline % dickere Linie
links & mitte & rechts \\\hline
links & mitte & rechts \\\hline
\end{longtable}
\begin{table}[H]
\caption{Kleine, mittig zentrierte Tabelle mit \textit{longtable}}
\label{tab:lcr_tabelle_longtable}
\end{table}
\subsection{Seitenübergreifende Tabellen}
\label{sec:info_tabelle_groß}
\begin{longtable}{|p{0.1\textwidth}|p{8cm}|R{2cm}|} % es sind absolute und relative Angaben möglich
\hline
\textbf{Symbol} & \textbf{Abgeänderter erster Header} & \textbf{Einheit} \\\hline
\hline\hline
\endfirsthead % diese vier Zeilen können gelöscht werden, wenn alle Header gleich sein sollen
\hline
\textbf{Symbol} & \textbf{Bedeutung} & \textbf{Einheit} \\\hline
\hline\hline
\endhead % dieser Head wird auf allen Seiten genutzt
$a$ & Kantenlänge Elementarzelle & $\si{\angstrom}$ \\\hline
$\mathrm{c}$ & Lichtgeschwindigkeit im Vakuum & $\si{\meter\per\second}$ \\\hline
$d_\mathrm{hkl}$ & Netzebenenabstand & $\si{\angstrom}$ \\\hline
$\mathrm{e}$ & elektrische Elementarladung & $\mathrm{As}$ \\\hline
$\epsilon$ & Energie zur Erzeugung eines Elektronen-Loch-Paares & $\mathrm{eV}$ \\\hline
$E$ & Energie der Röntgenstrahlung & $\mathrm{e}\si{\volt}$ \\\hline
$F$ & Fano-Faktor & \\\hline
$f_0$ & Atomformfaktor & \\\hline
$f_T$ & Atomformfaktor unter Berücksichtigung der Temperatur & \\\hline
$F_\mathrm{hkl}$ & Strukturfaktor & \\\hline
$\Gamma_0$ & elektronisches Rauschen & $\mathrm{eV}$ \\\hline
$\mathrm{h}$ & PLANCKsches Wirkungsquantum & $\si{\joule\second}$ \\\hline
$h\,k\,l$ & Millersche Indizes & \\\hline
$I$ & Strahlungsintensität & a.u. \\\hline
$I_\mathrm{K}$ & Röhrenstrom & $\mathrm{mA}$ \\\hline
$K_\alpha$ & charakteristische Röntgenenergie & $\mathrm{keV}$ \\\hline
\hline\hline
\end{longtable}
\begin{table}[H] % hier wird für die Verlinkung zum Tabellenverzeichnis noch einmal eine eigene Tabellenumgebung instanziiert. Das Ganze geht wahrscheinlich sinnvoller, aber zum jetzigen Zeitpunkt scheint das eine schnelle und gute Lösung zu sein.
\caption{Longtable mit fester Spaltenbreite und einer rechts-zentrierten Spalte}
\label{tab:big_longtable}
\end{table}
\section{Code}
\label{sec:info_code}
\begin{figure}[H]
\begin{lstlisting}
class Triple {
constructor(name) {
this.objectName = name;
}
static customName = 'Tripler';
static description = 'I triple any number you provide';
static triple(n = 1) {
return n * 3;
}
}
console.log(Triple.description); // 'I triple any number you provide'
console.log(Triple.triple()); // 3
console.log(Triple.triple(6)); // 18
const tp = new Triple('TripleObject');
console.log(tp.objectName); // 'TripleObject'
console.log(tp.triple()); // ERROR 'not a function'.
\end{lstlisting}
\caption{Beispielcode: Benutzung des Schlagwortes static in JS \cite{jsstatic}
\label{fig:beispielcode}}
\end{figure}
\section{Pseudocode}
\label{sec:info_pseudocode}
\begin{algorithm}[H]
\KwIn{Array}
%\KwOut{sortedArray} finde ich persönlich unnötig, weil es im return schon angegeben wird.
\While{Array is not sorted}{
a $\leftarrow$ random(0, Array.length)\;
b $\leftarrow$ random(0, Array.length)\;
temp $\leftarrow$ Array[a]\;
Array[a] $\leftarrow$ Array[b]\;
Array[b] $\leftarrow$ temp\;
}
\KwRet{sortedArray}
\caption{Bogosort - the best sort}
\label{alg:bogosort}
\end{algorithm}
\section{Grafiken}
\label{sec:info_bilder}
Grafiken lassen sich schnell und einfach einbinden. Für optimale Qualität wird hier ein Dateiformat für Vektorgrafiken empfohlen, wie zum Beispiel \ac{PDF} oder \ac{SVG}.
Im gesamten Dokument sollte die Bildbreite einheitlich gewählt werden. Empfohlen sind hier 70-100\%. Beim Erstellen von Grafiken muss natürlich darauf geachtet werden, dass die gedruckt lesbar sind. Bei Online-Abgaben kann der Bildausschnitt vergrößert werden, hier müssen die Vorlieben der Prüfer*innen beachtet werden.
\begin{figure}[H]
\begin{center}
\includegraphics[width=1\textwidth]{konzept_service.pdf} % wir müssen hier nicht _img/ schreiben, der in der main.tex der Pfad für alle Grafiken bereits angelegt wurde.
\caption{Beispielgrafik
\label{fig:beispielgrafik}}
\end{center}
\end{figure}
\subsection{Inline-Grafiken}
\label{sec:info_inlinegrafik}
Inline-Grafiken eignen sich perfekt für Anleitungen. \\
Beispiel: Klicke auf \inlinegraphic{inlinebsp.png} zum Erstellen und Anzeigen der PDF in TeXstudio.
\subsection{Das Dateiformat SVG}
\label{sec:info_svg}
Für die Nutzung des SVG-Dateiformates in \LaTeX\ müssen zusätzliche Schritte durchgeführt werden.
Dieses Kapitel wird in Zukunft eingefügt. Bitte vorerst PDF nutzen.
\section{Diagramme}
\label{sec:info_diagramme}
In diesem Abschnitt werden einige Diagrammbeispiele aus den Vorlesungsfolien von Sebastian Blänsdorf \cite{latexdiagrams} implementiert.
Dazu wird das Package pgfplots \cite{pgfplots} verwendet.
\begin{multicols}{2}
\begin{figure}[H]
\begin{tikzpicture}
\begin{axis}[xmin=0, xmax=1]
\addplot [fill=red] coordinates
{(0.1,0.15) (0.2,0.5)
(0.3,0.62) (0.5,0.58)
(0.6,0.65) (0.7,0.6)
(0.9,0.55) (1,0.52)}
\closedcycle; % Obwohl der Befehl als nicht erkannt markiert wird, hat er einen Effekt: Die Fläche wird von der letzten Koordinate zur x-Achse rot gefüllt und geht dann zur ersten Koordinate zurück. Ansonsten würde die Fläche durch eine direkte Verbindung von der letzen zur ersten Koordinate begrenzt sein.
\end{axis}
\end{tikzpicture}
\caption{Diagramm mit roter Fläche und eigenen Koordianten
\label{fig:reddiagram}}
\end{figure}
\begin{figure}[H]
\begin{tikzpicture}
\begin{axis}
\addplot table [only marks] {
x y
0.50 0.2
0.20 0.1
0.70 0.6
0.35 0.4
0.65 0.1
};
\end{axis}
\end{tikzpicture}
\caption{Scatter-Plot mit eigenen Daten
\label{fig:simplescatter}}
\end{figure}
\begin{figure}[H]
\begin{tikzpicture}
\begin{axis}[xmax=1]
\addplot [color=red, mark=x] table [only marks] {_ressources/scatterdata.dat};
\end{axis}
\end{tikzpicture}
\caption{Scatter-Plot mit eigenen Daten aus externer Datei
\label{fig:simplescatter2}}
\end{figure}
\begin{figure}[H]
\begin{tikzpicture}
\begin{axis}
\addplot[smooth, mark=*, blue]
coordinates {
(0,2) (1,3) (3,1)
};
\addlegendentry{Blau}
\addplot[smooth, color=red, mark=x]
coordinates {
(0,0) (1,1) (2,1) (3,2)
};
\addlegendentry{Rot}
\end{axis}
\end{tikzpicture}
\caption{Polynom durch Koordinaten und Legenden
\label{fig:smoothandlegend}}
\end{figure}
\begin{figure}[H]
\begin{tikzpicture}
\begin{axis}[smooth, axis y line=center, axis x line=middle, xlabel=$x$,ylabel=$\sin x$, ymin=-1.2, ymax=1.2, xmin=-5, xmax=5]
\addplot[blue ,mark=none, domain=-4:4, samples=80]
{sin(deg(x))}; % mit der angegebenen Funktion, domain und samples wird das zu zeichnende Polynom bestimmt.
\end{axis}
\end{tikzpicture}
\caption{Sinus mit geänderten Achsen
\label{fig:sin}}
\end{figure}
\begin{figure}[H]
\begin{tikzpicture}
\begin{axis}[axis y line=center, axis x line=middle, xlabel=$x$,ylabel=$\cos(x)+1$, ymax=2.2]
\addplot[blue ,mark=none, domain=-4:4, samples=20]
{cos(deg(x))+1};
\end{axis}
\end{tikzpicture}
\caption{geringe Samplesize und fehlender Option \textit{smooth}
\label{fig:cos}}
\end{figure}
\begin{figure}[H]
\begin{tikzpicture}
\begin{axis}[xmin=20, ymin=20]
\addplot+[
error bars/y dir=both,
error bars/y fixed relative=.1,
] table [x=x,y=y]
{x y
32 32
64 64
128 128
};
\end{axis}
\end{tikzpicture}
\caption{Fehlerbalken mit 10\% Fehler pro Datenpunkt
\label{fig:errorbars1}}
\end{figure}
\begin{figure}[H]
\begin{tikzpicture}
\begin{axis}
\addplot+[error bars/.cd, x dir=both, x explicit, y dir=both, y explicit]
coordinates {
(1,1) += (0.4, 0.2)
-= (0.1, 0.2)
(3,2) -= (0.5, 0.0)
(4,5) +- (0.3, 0.2)
};
\end{axis}
\end{tikzpicture}
\caption{Explizite Fehlerbalken
\label{fig:errorbars2}}
\end{figure}
\begin{figure}[H]
\begin{tikzpicture}
\begin{axis}[xbar, width=6cm, height=3.5cm, enlarge y limits=0.5, xlabel={Anzahl der Antworten}, symbolic y coords={Ja,Nein}, ytick=data, title=Sind Diagramme cool?]
\addplot coordinates {
(3,Nein) (7,Ja) % Hier darf keine Leertaste nach den Kommata stehen
};
\end{axis}
\end{tikzpicture}
\caption{Balkendiagramm mit festgelegter Größe
\label{fig:balken}}
\end{figure}
\begin{figure}[H]
\begin{tikzpicture}
\begin{axis}[ybar, enlargelimits=0.2, symbolic x coords={a,x,c}, xtick={a,x,c}, ymax=80] % Gesamthöhe = ymax + ymax*enlargelimits = 96
\addplot coordinates {
(a,40) (x,50) (c,80) % Hier darf keine Leertaste nach den Kommata stehen
};
\addplot coordinates {
(a,43) (x,45) (c,65) % Hier darf keine Leertaste nach den Kommata stehen
};
\addplot coordinates {
(a,13) (x,25) (c,35) % Hier darf keine Leertaste nach den Kommata stehen
};
\end{axis}
\end{tikzpicture}
\caption{Säulendiagramm
\label{fig:säulen}}
\end{figure}
\begin{figure}[H]
\begin{tikzpicture}
\begin{axis} [ytick={1}, yticklabels={G1}] % Mit mehr Ticks können mehrere Boxplots eingepflegt werden. Siehe Feuersängers Manual for Package pgfplots p.494
\addplot+[
boxplot prepared={
lower whisker=1.5,
lower quartile=3,
median=4,
average = 4.5,
upper quartile=5.5,
upper whisker=8,
}
] coordinates {
% Liste mit den sog. Outliers
(1, 1)
};
\end{axis}
\end{tikzpicture}
\caption{Einfacher Boxplot
\label{fig:Boxplot}}
\end{figure}
\begin{figure}[H]
\begin{tikzpicture}
\begin{polaraxis}
\addplot coordinates {(90,1) (180,1)
};
\end{polaraxis}
\end{tikzpicture}
\caption{Diagramm in Polarkoordinaten
\label{fig:Polar}}
\end{figure}
\begin{figure}[H]
\begin{tikzpicture}
\begin{axis}
\addplot3[surf, domain=0:360, samples=20]
{sin(x)*sin(y)};
\end{axis}
\end{tikzpicture}
\caption{3Diagramm % Ja, ich hab's gemacht.
\label{fig:3Diagram}}
\end{figure}
\end{multicols}
% -*- coding: utf-8 -*-
% !TEX encoding = UTF-8 Unicode
% !TEX root = main.tex
\chapter{Konstruktion}
\label{chap:konstruktion}
Im Projektverlauf wurde der Aufbau mehrfach angepasst, Fehler ausgebessert und Erweiterungen vorgenommen. Dabei sind verschiedene Bauformen entstanden, welche sich jeweils durch Ansteuerung, Aufbau und Hardware unterscheiden. Während der Entwicklung wurden Pumpen und Ventile ergänzt. Zudem wurde die Maschine um Hardware erweitert, welche Sie qualitativ verbessert beziehungsweise optisch aufwertet. Sie bauen hinsichtlich Hardware und Konzeptidee aufeinander auf, weshalb im Folgenden auf die Erweiterungen, beziehungsweise Verbesserungen aufgrund gewonnener Erfarungen eingegangen wird.
\section{Der Blasebalg}
\label{sec:konstruktionBlasebalg}
Die erste Konstruktion verfügt nur über die Luftpumpe. Diese pustet Luft in eine Flasche, um dadurch den Innendruck zu erhöhen. Durch den Überdruck in der Flasche wird die Flüssigkeit heraus gedrückt. Dieser erste Versuch, wie in Abbildung \ref{fig:blasebalg} zu sehen, ist sehr rudimentär aufgebaut und entspricht einem \ac{PoC}.
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.3\textwidth]{Blasebalg.jpeg} % wir müssen hier nicht _img/ schreiben, der in der main.tex der Pfad für alle Grafiken bereits angelegt wurde.
\caption{Test - Förderung per Überdruck
\label{fig:blasebalg}}
\end{center}
\end{figure}
Bei diesem Aufbau, wie in Abbildung \ref{fig:ueberdruckskizze} skizziert, gehen zwei Schläuche über den Deckel in die Flasche. Der Luftschlauch endet dabei kurz unter dem Deckel, wohingegen der Förderschlauch bis zum Flaschenboden reicht.
Dieses Förderkonzept hat sich bewährt, da die Durchflussgeschwindigkeit hoch ist und Softdrinks anschließend ausreichend Kohlensäure enthalten um den Geschmack nicht zu verändern. Daher wurde dieses Konzept beibehalten. Allerdings lässt sich die Ausflussmenge nur über den aufgebauten Luftdruck steuern, was insbesondere bei Softdrinks problematisch ist, da der notwendige Druck stark von der Füllmenge und der Kontaktzeit des Flascheninhalts mit der Luft abhängt. Zudem können Mengen von 1 cl nicht zuverlässig ausgeschenkt werden, da die Pumpdauer im Sekundenbereich liegt und der Zeitpunkt, ab dem der Innendruck ausreichend groß ist, von der Füllmenge abhängt.
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.25\textwidth]{Überdruck Skizze.png} % wir müssen hier nicht _img/ schreiben, der in der main.tex der Pfad für alle Grafiken bereits angelegt wurde.
\caption{Test - Förderung per Überdruck
\label{fig:ueberdruckskizze}}
\end{center}
\end{figure}
\cleardoublepage
\section{Der Reiskocher}
\label{sec:konstruktionReiskocher}
Als Erweiterung des Blasebalgs in Kapitel \ref{sec:konstruktionBlasebalg} kommt eine Peristaltikpumpe zum Einsatz. Der Vorteil dieser Pumpe im Vergleich zur Luftpumpe ist die erheblich genauere Förderung. Da die Flüssigkeit durch den Schlauch gedrückt wird geht allerdings viel Kohlensäure verloren. Zudem ist die Geschwindigkeit zu gering um in einer annehmbaren Zeit ein Glas von\,250 ml zu befüllen. Ebenso wird ein Relais zur Steuerung der Pumpen ergänzt.
Diese werden so an das Relais angeschlossen, dass sie nur mit Strom versorgt sind, wenn das Relais geschaltet wird. Dies stellt sicher, dass die Pumpen nur dann arbeiten, wenn dies gewünscht ist. Gesteuert werden Sie über den Eleego Uno. Dadurch können die Pumpen für einen definierten Zeitraum eingeschaltet werden, was einen genaueren Ausschank ermöglicht. Für die Stromversorgung der Peristaltikpumpe wird der +12\,V Ausgang eines ausgemusterten ATX Netzteils verwendet. Dieses wird eingeschaltet, in dem das grüne Power ON, mit einem der schwarzen Masse Kabel verbunden wird.
Zudem kommt als ersten Test ein Druckschalter zum Einsatz, welcher einen GPIO Pin auf High zieht und damit einen Interrupt auslöst. Dadurch wird der Ausschank mit einem fest einprogrammierten Rezept als \ac{PoC} gestartet.
Namensgebens für die Konstruktion in Abbildung \ref{fig:reiskocherhinten} ist der Reiskocher, welcher als Gehäuse und Schlauchhalter fungiert.
\begin{multicols}{2}
\begin{figure}[H]%
\includegraphics[width=0.5\textwidth]{Reiskocher_hinten.jpeg}
\caption{Verschaltung der Bauteile oben auf dem Resikocher
\label{fig:reiskocherhinten}}
\end{figure}
\begin{figure}[H]
\includegraphics[width=0.5\textwidth]{Reiskocher_Vorne.jpeg}
\caption{Vorderseite des Reiskochers mit Ausschankschläuchen
\label{fig:reiskocherVorn}}
\end{figure}
\end{multicols}
\section{Der Pizzakarton}
\label{sec:konstruktionPizzakarton}
Da der Reiskocher zum Kochen benötigt wurde musste ein neues Gehäuse gebaut werden. Als neues Prototypengehäuse kommen Pizzakartons zum Einsatz. Diese sind leicht zu bearbeiten und können mit Heißkleber fixiert werden. Bei diesem Aufbau sind die Ausschankschläuche fest verklebt und hängen nicht frei.
Bei der vorigen Konstruktion ist aufgefallen, dass der Ausschank mittels Zeitangabe bei kohlensäurehaltigen Getränken nicht zuverlässig funktioniert. Die Pumpzeit ist abhängig von dem vorhandenen Flascheninhalt und der enthaltenen Kohlensäure. Um diese Schwäche zu beheben wird eine Waage eingesetzt, welche das ausgeschenkte Volumen anhand des Gewichts abschätzt. Dabei wird davon ausgegangen, dass $10\,ml \approx 10\,g$ entsprechen. Diese Näherung bezieht sich darauf, dass $1\,l$ Wasser bei $3,98\,^{\circ}c$ exakt $1\,kg$ entspricht \cite{giancoli2006physik} und funktioniert bei Softdrinks ausreichend gut. Dadurch kann zyklisch das aktuelle Gewicht des Glases mit der Summe aus Ausschankvolumen und Glasgewicht verglichen werden, um ein näherungsweise gleiches Füllvolumen unabhängig von Flascheninhalt und verbleibender Kohlensäure zu gewährleisten.
Mit der Waage kommt die in Abschnitt \ref{sec:softwareEmbeddedTara} beschriebene Tara Funktion hinzu, welche beispielsweise bei Waagen im Haushaltsbereich üblich ist. Diese wird in diesem Projekt verwendet um das Füllgewicht zu berechnen. Dabei wird das Glasgewicht von dem tatsächlich gemessenen Gewicht abgezogen und erhält das Füllgewicht.
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.6\textwidth]{Pizzakarton.jpeg} % wir müssen hier nicht _img/ schreiben, der in der main.tex der Pfad für alle Grafiken bereits angelegt wurde.
\caption{Test der Cocktailmaschine im Pizzakarton
\label{fig:pizzakarton}}
\end{center}
\end{figure}
\section{Das Holzkreuz}
\label{sec:konstruktionHolzkreuz}
In der Pizzakartonkonstruktion (Kapitel \ref{sec:konstruktionPizzakarton}) funktioniert das Ausschenken von kohlensäurefreien Getränken schon gut, allerdings ist die Peristaltikpumpe langsam und bei Softdrinks wird der Ausschank nicht sofort beendet, wenn die Luftpumpe ausgeschaltet wird. Um die Geschwindigkeit zu verbessern werden beide Getränkearten an die Luftpumpe angeschlossen. Damit es bei dem höheren Durchlaufvolumen möglich ist kleine Mengen auszuschenken kommen Ventile zum Einsatz. Pro Flasche wird ein Quetschventile aus Kapitel \ref{sec:hardwareQVentil} verwendet. Sobald das Ausschankziel erreicht ist werden die beiden Schläuche, für Luftzufuhr und Getränkabfluss, durch das Ventil simultan abgeklemmt. Das Nachtropfen bei Softdrinks wird dadurch ebenfalls verhindert.
Alternativ zu den gedruckten Ventilen werden Magnetventile eingesetzt, welche in eine Richtung Luft durchlassen, wenn sie geschaltet werden. Die Idee dabei ist, dass der Druckaufbau genauer gesteuert beziehungsweise unterbrochen werden kann. So funktioniert die Förderung von Getränken ohne Kohlensäure ebenfalls mit der Luftpumpe. Bei Softdrinks kann dieses Ventil nicht eingesetzt werden, da das Nachtropfen aufgrund des abgeklemmten Luftschlauchs verstärkt wird.
Durch den Einsatz der Ventile kann eine Luftpumpe über Y-Adapter an mehrere Flaschen angeschlossen werden, was die Hardwarekosten reduziert. Bei den Quetschventilen sind mit dem verwendeten Motor Driverboard bis zu 16 Ventile möglich, bei in Serie geschalteten Driverboards bis zu 64. Die Luftventile sind hingegen abhängig von dem Relais und benötigen jeweils einen GPIO Pin. Aufgrund der einfacheren Ansteuerung und der Erweiterbarkeit sind die Quetschventile für den Einsatz geeigneter.
Da das Nachtropfen nicht vollständig verhindert werden kann, sind die Schläuche an einem beweglichen Arm montiert. Dieser ist mit einem Motor verbunden und wird nur für den Ausschank über die Waage beewegt. Wird kein Cocktail ausgegeben befinden sich die Schläuche über einem Abtropfgefäß. So wird verhindert, dass Flüssigkeit in die Elektronik läuft und die Waage durch trocknende Rückstände der Softdrinks weniger klebrig wird.
Als visuelle Rückmeldung sind LEDs unter dem horizontalen Holzbalken angebracht. Diese sind an die 5\,V Versorgung des Netzteils angeschlossen und werden vom Eleego, wie in Abschnitt \ref{sec:softwareEmbedded} gesteuert.
Die Rezepte werden nicht mehr wie in den vorigen Konstruktionen im embedded Code hinterlegt, da dieser \ac{PoC} für mehrere Rezepte unpraktisch ist und die Auswahl sehr reduziert. Statt dessen werden sie in einer CSV-Datei gespeichert, welche das Programm Cocktailmaker aus Abschnitt \ref{sec:softwareGui} verwendet und dann über die Serielle Schnittstelle an den Microkontroller überträgt. Daher muss dieser immer von einem Computer gesteuert werden. Durch diese Erweiterung entfallen auch die Knöpfe aus den vorigen Konstruktionen. Funktionen wie beispielsweise Tara werden ebenfalls von dem Cocktailmaker gestartet.
Das ATX Netzteil wird nun von dem Relais geschaltet und ist nur dann eingeschaltet, wenn die Cocktailmaschine läuft.
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.5\textwidth]{Holzkreuz.jpeg} % wir müssen hier nicht _img/ schreiben, der in der main.tex der Pfad für alle Grafiken bereits angelegt wurde.
\caption{Test - Förderung per Überdruck
\label{fig:holzkreuz}}
\end{center}
\end{figure}
\ No newline at end of file
% -*- coding: utf-8 -*-
% !TEX encoding = UTF-8 Unicode
% !TEX root = main.tex
\chapter{Software}
\label{chap:software}
\section{GUI - Cocktailmaker}
\label{sec:softwareGui}
Das Bedienungsprogramm \ref{cocktailmakerGUI} ist in \CS mit dem Framework \ac{WPF} geschrieben. Dabei wird die GUI für eine leichtere Wartung und Erweiterung getrennt von der Logik entwickelt. Die Anwendung ist aufgrund der großen Bedienelemente auf die Touchbedienung ausgelegt, um es für Anwender*innen angenehmer zu gestalten. Zur Verbindungsherstellung mit der Cocktailmaschine wird der COM Port ausgewählt, an dem diese angeschlossen ist und anschließend mit einem Klick auf \textit{Verbinden} die Kommunikation aufgebaut. Bei bestehender Verbindung kann über Klicken des Cocktails und anschließender Bestätigung des Start-Buttons das Getränk geordert werden. Das Rezept wird über die aufgebaute serielle Verbindung an die Cocktailmaschine geschickt und dort verarbeitet. Die Rezepte werden in einer CSV Datei bereitgestellt, welche eine manuelle Erweiterung erlaubt ohne den Cocktailmaker neu kompilieren zu müssen. Die Bilder der Getränke werden in einem Unterordner \text{images} gespeichert, auf welche von der Rezeptdatei mittels relativen Pfades referenziert wird. Es steht zudem eine manuelle Tara-Funktion (Abschnit \ref{sec:softwareEmbeddedTara}) zur Verfügung. Nach Benutzung der Cocktailmaschine kann zur Reinigung das gleichnamige Rezept ausgewählt werden, welches alle Pumpen und Ventile aktiviert und so die Schläuche durchspült. Für die Reinigung sollten die Flascheninhalte durch Wasser mit einem milden Spülmittel verwendet werden und anschließend noch einmal mit klarem Wasser durchgeführt werden.
\begin{figure}[H]
\begin{center}
\includegraphics[width=0.8\textwidth]{Cocktailmaker GUI.jpg} % wir müssen hier nicht _img/ schreiben, der in der main.tex der Pfad für alle Grafiken bereits angelegt wurde.
\caption{Cocktailmaker GUI mit Logs im Konsolenfenster
\label{fig:cocktailmakerGUI}}
\end{center}
\end{figure}
\section{Übertragungsprotokoll}
\label{sec:softwareUebertragungsprokoll}
\subsection{Cocktailmaker $\rightarrow$ Cocktailmaschine}
\label{sec:softwareUebertragungsprokollGzuE}
Die Rezepte werden als ASCII Daten übertragen. Dabei werden immer die Pumpangaben für alle Pumpen angegeben. Alle Felder sind durch ein Semikolon separiert. Die Angabe ob das Rezept in Zeit (ms) oder Gewichts (g) ist wird zu Beginn festgelegt. Pro Pumpe wird anschließend ein numerischer Wert angegeben. Bei zwei Pumpen würde die Übertragung entsprechend aus drei Feldern bestehen.
Funktionen wie Tara haben einen eigenen Befehl, wodurch sich die Interpretierung an dieser Stelle unterscheidet.
\subsection{Cocktailmacker $\leftarrow$ Cocktailmaschine}
\label{sec:softwareUebertragungsprokollEzuG}
Die Statusmeldungen wie aktuelles Gewicht, derzeitiger Status und Debugausgaben werden direkt und ohne Protokoll versendet. Derzeit wird dies noch nicht ausgewertet und nur für die Logeinträge verwendet.
\section{Embedded - Cocktailmaschine}
\label{sec:softwareEmbedded}
Nach dem Einschalten des Mikrocontrollers wird automatisch die setup()-Funktion aufgerufen. In dieser wird die serielle Kommunikation über den ComPort aktiviert und Statusmeldungen über den Startvorgang gesendet. Bei der Übertragung wird nicht überprüft, ob tatsächlich ein Teilnehmer über diese Verbindung angeschlossen ist. Die Informationen werden auch nicht vorgehalten, bis ein Verbindungsaufbau von beiden Teilnehmern bestätigt wurde, da es für diesen Anwendungsfall nicht notwendig ist.
Anschließend wird die Waage initialisiert und dessen Tara-Funktion aufgerufen. Für die Initialisierung der Motoren wird zuvor die PSU per Relais aktiviert und damit die eigentliche Stromversorgung der Cocktailmaschine eingeschaltet. Dadurch können die Motoren auf ihre Standardposition gefahren werden, so dass die Ventile geschlossen sind und die Schläuche nicht über der Waage hängen.
Die Pumpen bleiben während des Startvorgangs ausgeschaltet.
Sobald die Start-Funktion abgeschlossen ist, wird die loop()-Funktion aufgerufen. Diese verhält sich wie eine Dauerschleife und wird bis zu einem Kritischen Fehler oder einer Trennung der Stromversorgung wieder aufgerufen, sobald Diese durchlaufen wurde. Darin werden mehrere Aufgaben nach Round-Robin parallel ausgeführt.
\begin{enumerate}
\item Steuern der LEDs ( laufende Muster)
\item Lesen der Waage
\item Prüfen ob Ventile ihr Ziel (Gewicht/Zeit) erreicht haben und ob die Luftpumpe deaktiviert werden kann
\item Tara
\item Lesen der Seriellen Schnittstelle
\item Statusausgabe
\end{enumerate}
Da die einzelnen Aufgaben sich innerhalb des Ausgabeprozesses unterscheiden regelt eine Statemachine den weiteren Ablauf.
\subsection{IDLE}
\label{sec:softwareEmbeddedIdle}
Es wird überprüft ob an der Seriellen Schnittstelle neue Daten anliegen. Falls neue Daten empfangen wurden, wird die Interpeter-Funktion aufgerufen, welche den String dekodiert. Je nach Inhalt wird es in ein Rezept oder Befehl konvertiert und anschließend der entsprechende Status gesetzt. Im Falle eines Rezeptes werden die Gewicht- oder Zeitarrays der Pumpen beschrieben. Sollten keine Daten anliegen wird der Regenbogenmodus (LEDs) um eine Iteration fortgesetzt.
\subsection{PUMP\_MS, PUMP\_G}
\label{sec:softwareEmbeddedPump}
Bei \texttt{PUMP\_MS} sind alle angegebenen Ventile gleichzeitig für die jeweilige Pumpzeit aktiviert und bei \texttt{PUMP\_G} werden sie nacheinander eingeschaltet, wobei der Wechsel stattfindet, sobald das jeweilige Gewichtsziel erreicht ist.
Bei \texttt{PUMP\_MS} wird zu Beginn geprüft ob eine der Flaschen ihr Zeitlimit erreicht hat. Ist dies der Fall wird das Ventil für sie deaktiviert. Im State \texttt{PUMP\_G} hingegen wird geprüft ob das aktuelle Gewichtslimit erreicht wurde. Sollte dem so sein wird das Ventil deaktiviert und das Nächste geöffnet. Sollten alle Ventile der Luftpumpe geschlossen sein wird auch diese deaktiviert. Abschließend, sollten alle Pumpen ausgeschaltet sein, wird der Schlaucharm vom Getränk wegbewegt und der Status auf \texttt{IDLE} gesetzt.
Wenn noch Ventile offen sind, wird das Beleuchtungsmuster um eine Iteration fortgesetzt.
\subsection{TARA}
\label{sec:softwareEmbeddedTara}
Dieser Status stellt den Befehl dar, mit dem ein Durchschnittsgewicht über die Messungen der Waage in einem Zeitraum von 2 Sekunden berechnet wird. Dieser stellt wird als Offset verwendet, der vom Messergebnis abgezogen wird. Damit kann beispielsweise das Gewicht eines Glases heraus gerechnet werden, um die Gewichtsziele in einem Rezept nicht vorzeitig zu überschreiten.
Der TARA-Status wird durch komplett Weiße Beleuchtung dargestellt und die übliche Loop-Funktion für diesen Zeitraum aufgehalten.
\ No newline at end of file
Dokumentation/_img/Blasebalg.jpeg

2.65 MiB

Dokumentation/_img/Cocktailmaker GUI.jpg

163 KiB

Dokumentation/_img/Flaschenanschluss.jpeg

101 KiB

Dokumentation/_img/HX711 Board.jpeg

193 KiB

Dokumentation/_img/Holzkreuz.jpeg

365 KiB

Dokumentation/_img/Luftpumpe Aufbau.jpeg

292 KiB

Dokumentation/_img/Magnetventil installiert.jpeg

193 KiB

0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment