HotCup-Assistent: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
|||
(14 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 45: | Zeile 45: | ||
Damit der Teebeutel aus der Tasse herausgezogen werden kann, wurde sich für einen Stepper-Motor entschieden. Bei dem Motor kann die Geschwindigkeit und die Strecke variiert werden. | Damit der Teebeutel aus der Tasse herausgezogen werden kann, wurde sich für einen Stepper-Motor entschieden. Bei dem Motor kann die Geschwindigkeit und die Strecke variiert werden. | ||
Der Stepper-Motor treibt eine Gewindestange an. Auf dieser befindet sich ein Schlitten, welcher auf einer Welle aufliegt und dort geführt wird. An dem Schlitten kann später der Teebeutel befestigt werden (vgl. Abbildung 4). | Der Stepper-Motor treibt eine Gewindestange an. Auf dieser befindet sich ein Schlitten, welcher auf einer Welle aufliegt und dort geführt wird. An dem Schlitten kann später der Teebeutel befestigt werden (vgl. Abbildung 4). | ||
[[Datei:StepperMotor.jpg|100px|thumb|rechts|Abb 4: | [[Datei:StepperMotor.jpg|100px|thumb|rechts|Abb 4: Schritt-Motor des Arduinos, mit Gewindestange <ref>Jan Müller - Eigenes Werk</ref>]] | ||
'''Temperatur-Sensor TMP36:'''<br/> | '''Temperatur-Sensor TMP36:'''<br/> | ||
Bei dem Temperatursensor handelt es sich um den TMP36. Er hat drei Anschlüsse, einmal GND, 5V und einen PIN für das Temperatursignal. Am PIN des Temperatursignals werden Spannungen zwischen 0 und 2,0V ausgegeben, welche dann in die entsprechende Temperatur umgerechnet werden müssen. Dabei entsprechen 0V -50°C und 2,0V 150°C. | Bei dem Temperatursensor handelt es sich um den TMP36. Er hat drei Anschlüsse, einmal GND, 5V und einen PIN für das Temperatursignal. Am PIN des Temperatursignals werden Spannungen zwischen 0 und 2,0V ausgegeben, welche dann in die entsprechende Temperatur umgerechnet werden müssen. Dabei entsprechen 0V -50°C und 2,0V 150°C. | ||
Der TMP36 nutzt die Bandlücke von Halbleitermaterialien aus um die Temperatur zu ermitteln. Intern sind hier mehrere Transistoren miteinander verschaltet. Besonders wichtig sind dabei zwei Transistoren die mit der ... | Der TMP36 nutzt die Bandlücke von Halbleitermaterialien aus um die Temperatur zu ermitteln. Intern sind hier mehrere PNP Transistoren miteinander verschaltet. Besonders wichtig sind dabei zwei Transistoren die mit dem gleichen Kollektorstrom versorgt werden. Die Transistoren unterscheiden sich in ihrer Emitter-Fläche. Steigt nun die Temperatur um den Sensor herum, so entsteht, abhängig von der Temperatur, bei gleicher Stromstärke eine Temperaturspannung. Da die Stromstärke abhängig von der Anzahl der Ladungsträger ist und diese wieder rum abhängig von der Fläche, entsteht eine Temperaturdifferenz, welche nach folgender Formel mathematisch hergeleitet werden kann:<br/> | ||
<math> \Delta U_{BE} = U_T \cdot \log \frac{A_{E,Q1}}{A_{E,Q2}} </math><br/> | |||
Diese Temperatur, wird intern über weitere Bauteile aufbereitet und kann dann am entsprechenden Pin abgegriffen und ausgelesen werden. Die interne Schaltung des Sensors ist im Datenblatt zu finden. | |||
<ref> [https://www.analog.com/media/en/technical-documentation/data-sheets/TMP35_36_37.pdf]</ref> | <ref> [https://www.analog.com/media/en/technical-documentation/data-sheets/TMP35_36_37.pdf]</ref> | ||
Zeile 61: | Zeile 61: | ||
Um die Eingabe der Ziehzeit zu erleichtern wurde ein Drehpotentiometer verwendet. Der mittlere Abgriff dieses veränderbaren Widerstandes wird dafür an einen Analog-Eingang des Arduinos angeschlossen. In Abhängigkeit des Widerstandes zwischen Eingang des Potentiometers und Mittelabgriff liegt hier eine Spannung zwischen 0 und 5V an. Diese wird über den A/D-Wandler des Arduinos in ein digitales Signal, zwischen 0 und 1024, umgewandelt. Dieser Wert kann im Programm in die entsprechende Zeit umgewandelt werden. | Um die Eingabe der Ziehzeit zu erleichtern wurde ein Drehpotentiometer verwendet. Der mittlere Abgriff dieses veränderbaren Widerstandes wird dafür an einen Analog-Eingang des Arduinos angeschlossen. In Abhängigkeit des Widerstandes zwischen Eingang des Potentiometers und Mittelabgriff liegt hier eine Spannung zwischen 0 und 5V an. Diese wird über den A/D-Wandler des Arduinos in ein digitales Signal, zwischen 0 und 1024, umgewandelt. Dieser Wert kann im Programm in die entsprechende Zeit umgewandelt werden. | ||
'''Piezo-Speaker''' | '''Piezo-Speaker:'''<br/> | ||
Bei dieser Art Lautsprecher wird der Piezoeffekt verwendet. Übt man auf bestimmte Materialien (z.B. Quarz) eine Kraft aus, so entsteht eine elektrische Ladung an gegenüberliegenden Oberflächen des Kristalls. Dieser Effekt ist umkehrbar, legt man an einen Piezokristall eine Spannung an so verbiegt sich dieser. Der Piezospeaker wird an einen Pin mit Pulsweitenmodulation und Ground angeschlossen. Über die Funktion wird dieser Pin mit einer vorher angegeben Frequenz angesteuert. Durch das sich ändernde Signal wird der Piezokristall in der entsprechenden Frequenz ausgelenkt und zum schwingen angeregt. Diese Auslenkung wird auf eine Membran übertragen, wodurch ein Ton erzeugt werden kann. | |||
== Umsetzung (HW/SW) == | == Umsetzung (HW/SW) == | ||
[[Datei:Displayhalterung_.jpg|400px|thumb|rechts|Abb 6: Displayhalterung fertig montiert <ref>Jan Müller - Eigenes Werk</ref>]] | [[Datei:Displayhalterung_.jpg|400px|thumb|rechts|Abb 6: Displayhalterung fertig montiert <ref>Jan Müller - Eigenes Werk</ref>]] | ||
Zeile 73: | Zeile 74: | ||
Als Orientierung für die Entwicklung der Software wurde mit dem PAP gearbeitet welcher vor Beginn des Schreiben der eigentlichen Software erstellt wurde (vgl. Abbildung 7). Für die Steuerung der einzelnen Aktoren wurden eigenen Funktionen geschrieben. | Als Orientierung für die Entwicklung der Software wurde mit dem PAP gearbeitet welcher vor Beginn des Schreiben der eigentlichen Software erstellt wurde (vgl. Abbildung 7). Für die Steuerung der einzelnen Aktoren wurden eigenen Funktionen geschrieben. | ||
Die Rohen-Sensordaten, welche an den Analogen-Eingängen empfangen werden, werden mithilfe des map()-Befehls umgerechnet. Wie im folgenden Beispiel zu sehen: | Die Rohen-Sensordaten, welche an den Analogen-Eingängen empfangen werden, werden mithilfe des map()-Befehls umgerechnet. Wie im folgenden Beispiel zu sehen: | ||
<div style="width:800px; height: | <div style="width:800px; height:140px; overflow:auto; border: 2px solid #088"> | ||
Sensorwert = analogRead(TMP_Sensor); | |||
Temperatur = map(Sensorwert, 0, 410, -50, 150); //0 und 410 Wertebereich | |||
WassertempArray[zaehler] = map(Temperatur, 28,36,65,95); | |||
</div> | </div> | ||
Der map()-Befehl wandelt dabei automatisch den Sensorwert, welcher in einem Wertebereich von 0 bis 410 (da nur max. 2Volt vom TMP36 ausgehen) digital vorliegen, in die entsprechende Temperatur (-50 bis 150°C) um. | Der map()-Befehl wandelt dabei automatisch den Sensorwert, welcher in einem Wertebereich von 0 bis 410 (da nur max. 2Volt vom TMP36 ausgehen) digital vorliegen, in die entsprechende Temperatur (-50 bis 150°C) um. | ||
Da der Temperatursensor nur die Lufttemperatur über dem Tee misst, kann man über diesen Wert keine direkte Aussage über die Wassertemperatur machen. Um eine ungefähre Abschätzung über die Temperatur des Wassers machen zu können, haben wir die Wassertemperatur analog gemessen, während der Temperatursensor Messdaten über die Temperatur der aufsteigenden Luft aufgenommen hat. | Da der Temperatursensor nur die Lufttemperatur über dem Tee misst, kann man über diesen Wert keine direkte Aussage über die Wassertemperatur machen. Um eine ungefähre Abschätzung über die Temperatur des Wassers machen zu können, haben wir die Wassertemperatur analog gemessen, während der Temperatursensor Messdaten über die Temperatur der aufsteigenden Luft aufgenommen hat. Bei diesem Test hat sich die Wassertemperatur in einem Zeitraum von 15 Minuten von 95 auf 65°C abgekühlt, während die aufsteigende Luft eine Temperatur von 36 bis 28°C hatte. Der Verlauf ist in beiden Fällen annähernd linear und wird für die weitere Verwendung so angenommen. Umgerechnet wird die gemessene Temperatur erneut über den map()-Befehl, in eine Wassertemperatur. | ||
Ähnlich wie bei der Temperaturmessung werden auch beim Potentiometer die Rohdaten von Analog-Eingang mit dem map()-Befehl umgerechnet. Anders ist hier, dass der Wertebereich des Eingangs zwischen 0 und 1024 liegt, da hier nun maximal 5 Volt anliegen können. Da Tees in der Regel nicht länger als 8 Minuten ziehen müssen, haben wir für die Umrechnung der Sensordaten den Wertebereich von 0 bis 480 (Sekunden) angenommen. Die Zeit in Sekunden wurde dann aufgeteilt in Minuten und Sekunden, für eine bessere Displayausgabe. Wie im Folgenden zusehen wurde dies mit den "/" und "%" Operatoren realisiert. | |||
Ähnlich wie bei der Temperaturmessung werden auch beim Potentiometer die Rohdaten von Analog-Eingang mit dem map()-Befehl umgerechnet. Anders ist hier, dass der Wertebereich des Eingangs zwischen 0 und 1024 liegt, da hier nun maximal 5 Volt anliegen können. | |||
<div style="width:1000px; height:300px; overflow:auto; border: 2px solid #088"> | <div style="width:1000px; height:300px; overflow:auto; border: 2px solid #088"> | ||
void Poti() | void Poti() | ||
Zeile 122: | Zeile 121: | ||
Wurden alle Parameter eingestellt und mit dem Taster bestätigt beginnt die Temperaturmessungs-Schleife. Hierbei wird im Sekundentakt die Temperatur ermittelt. Da mit dem HotCup-Assistent auch andere Heißgetränke kontrolliert werden können gibt es in der Schleife eine Fallunterscheidung, ob gerade ein Tee unter dem Sensor steht oder nicht. Steht ein Tee drunter spielt die zuvor eingestellte Ziehzeit eine Rollen. Ist diese abgelaufen (if ZeitPoti == 0), wird die Motoransteuerung einmalig angesteuert, sodass der Teebeutel vom Motor hochgezogen wird. Anschließend läuft die Temperaturmessung einfach weiter, bis die, aus eigener, subjektiver Meinung, optimale Temperatur zum trinken des Tees (etwa 65°C) erreicht wurde. | Wurden alle Parameter eingestellt und mit dem Taster bestätigt beginnt die Temperaturmessungs-Schleife. Hierbei wird im Sekundentakt die Temperatur ermittelt. Da mit dem HotCup-Assistent auch andere Heißgetränke kontrolliert werden können gibt es in der Schleife eine Fallunterscheidung, ob gerade ein Tee unter dem Sensor steht oder nicht. Steht ein Tee drunter spielt die zuvor eingestellte Ziehzeit eine Rollen. Ist diese abgelaufen (if ZeitPoti == 0), wird die Motoransteuerung einmalig angesteuert, sodass der Teebeutel vom Motor hochgezogen wird. Anschließend läuft die Temperaturmessung einfach weiter, bis die, aus eigener, subjektiver Meinung, optimale Temperatur zum trinken des Tees (etwa 65°C) erreicht wurde. | ||
Da der Temperatursensor durchaus durch äußerer Einflüsse (z.B. Luftzug bei Bewegung, ...) etwas schwanken kann, bestimmen wir in jedem Schleifendurchlauf einen Mittelwert der letzten zehn Messwerte des Sensors, sodass größere, kurzzeitige Schwankungen keine Auswirkung auf den ausgegebenen Wert haben. | |||
<div style="width:1000px; height:200px; overflow:auto; border: 2px solid #088"> | <div style="width:1000px; height:200px; overflow:auto; border: 2px solid #088"> | ||
while(Temperatur > | while(Temperatur > 0) | ||
{ | { | ||
T2 = T2 +1; | |||
Temperatur = | Temperatur = 95.0 - (T2*0.044); | ||
Serial.println(Temperatur); | |||
if(Tee == 1) | if(Tee == 1) | ||
{ | { | ||
Zeile 134: | Zeile 134: | ||
{ | { | ||
Motoransteuerung(HOCH); | Motoransteuerung(HOCH); | ||
Tee = 0; | |||
} | |||
} | |||
else | |||
{ | |||
delay(1000); | |||
} | |||
if(Temperatur > 80) | |||
{ | |||
digitalWrite(rot,HIGH); | |||
digitalWrite(gelb,LOW); | |||
digitalWrite(gruen,LOW); | |||
} | |||
else if(Temperatur>65 && Temperatur<=80) | |||
{ | |||
digitalWrite(rot,LOW); | |||
digitalWrite(gelb,HIGH); | |||
digitalWrite(gruen,LOW); | |||
} | |||
else if(Temperatur<65) | |||
{ | |||
digitalWrite(rot,LOW); | |||
digitalWrite(gelb,LOW); | |||
digitalWrite(gruen,HIGH); | |||
if(Ton==0) | |||
{ | |||
tone(TonP, 440, 3000); //Es soll genau 3 Sekunden ein Ton mit einer Frequenz von 440 Hz ausgegeben werden | |||
Ton = 1; | |||
} | } | ||
} | } | ||
BildschirmausgabeTemp(); | |||
} | } | ||
</div> | </div> | ||
Zeile 153: | Zeile 183: | ||
[[Datei:Verdrahtung_mit_Mikrocontroller.jpg|400px|thumb|links|Abb 9: Verdrahtung des HotCup-Assistent <ref>Jan Müller - Eigenes Werk</ref>]] | [[Datei:Verdrahtung_mit_Mikrocontroller.jpg|400px|thumb|links|Abb 9: Verdrahtung des HotCup-Assistent <ref>Jan Müller - Eigenes Werk</ref>]] | ||
Der HotCup-Assistent wurde wie in Abbildung 9 abgebildet verdrahtet, der Mikrocontroller mit seinem Anschlüssen befindet sich dabei versteckt hinter der Displayhalterung. Das komplett fertige System kann in Abbildung 1 bewundert werden. | Der HotCup-Assistent wurde wie in Abbildung 9 abgebildet verdrahtet, der Mikrocontroller mit seinem Anschlüssen befindet sich dabei versteckt hinter der Displayhalterung. Das komplett fertige System kann in Abbildung 1 bewundert werden. | ||
Ein Video, welches alle Funktionen des HotCup-Assistenten präsentiert ist unten verlinkt. | Ein Video, welches alle Funktionen des HotCup-Assistenten präsentiert, ist unten verlinkt. | ||
<br clear = all> | <br clear = all> | ||
Zeile 184: | Zeile 214: | ||
== YouTube Video == | == YouTube Video == | ||
{{#ev:youtube|https://youtu.be/ZQe1VjVbf-I|800px|left}} | |||
<br clear=all> | |||
== Weblinks == | == Weblinks == |
Aktuelle Version vom 11. Januar 2022, 11:54 Uhr
Autoren: Laura Fricke & Jan Müller
Betreuer: Prof. Göbel & Prof. Schneider
→ zurück zur Übersicht: WS 20/21: Angewandte Elektrotechnik (BSE)
Einleitung
Zu Zeiten von Homeoffice & Teams-Meetings ist das selbst zubereitete Heißgetränk ein immer wichtigerer Bestandteil unseres Alltags geworden. Bei den teilweise eng getakteten Terminen, die über einen Tag hinweg anfallen, kann man sein Heißgetränk schonmal vergessen. Verbrannte Zungen, weil man zu früh einen genüsslichen Schluck aus seiner Tasse nehmen wollte oder ein kalter Tee, der viel zu lange zog, sind Probleme, die uns lange beschäftigt haben.
Diese gehören nun allerdings endgültig der Vergangenheit an. Der "HotCup-Assistent" wird uns zukünftig bei all diesen Problemen unterstützen. So soll über einen Temperatur-Sensor erfasst werden, ob das Heißgetränk noch zu warm zum Trinken ist. Zusätzlich wird der "HotCup-Assistent" nach einer zuvor eingestellten Zeit den Teebeutel aus der Tassen nehmen, sodass der Tee nicht zu lange zieht.
Anforderungen
- Spannungsversorgung über Batterien für mehr Flexibilität
- Stromsparender Aufbau: z.B. System schaltet sich erst bei anwesender Tasse ein
- Auswahl ob Tee oder anderes Heißgetränk
- Timer (für den Tee) einstellen
- Mechanismus zum herausnehmen des Teebeutels
- Erfassung der Temperatur des Heißgetränks
- Auswertung und Anzeigen der Temperatur über LED (z.B.: Rot = zu heiß, Gelb = Gut, Grün = angenehm)
- Akustisches Signal, wenn Getränk entsprechend abgekühlt ist
Funktionaler Systementwurf/Technischer Systementwurf
Der in Abbildung. 1 abgebildete Systementwurf gibt einen groben Überblick über die Sensoren und Aktoren, sowie ihre entsprechenden Funktionen im System. Der Arduino ist dabei das Herzstück des Systems. Dieser soll über eine 9 Volt Blockbatterie mit Spannung versorgt werden, sodass das System leicht zu transportieren und unabhängig von Steckdosen betrieben werden kann. Die Sensoren und Aktoren werden an den Mikrocontroller angeschlossen und über diesen gesteuert. Zum Ein- & Ausschalten des Systems wird ein Schalter vor den Mikrocontroller in Reihe verdrahtet, sodass das System spannungslos geschaltet werden kann, wenn es nicht benötigt wird. Das LCD-Modul, die LED-Dioden und der Piezo Speaker dienen der Kommunikation mit dem Anwender.
Mechanisch muss das System und sein Gehäuse so ausgelegt sein, dass es mindestens Spritzwassergeschützt ist und die Elektrik nicht durch beispielsweise einen tropfenden Teebeutel beschädigt werden kann. Darüber hinaus muss die Ablagefläche, auf der die Tasse gestellt wird, stabil sein und das hohe Gewicht einer vollen Tasse aushalten können. Für ein stabiles Fundament, auf welchem die Tasse stehen soll, habe wir uns für das Material Holz entschieden. Dieses soll so beschichtet werden, dass es das unter Umständen tropfende Wasser nicht aufnehmen kann. Auf diesem Holz-Fundament aufbauend, wird ein Turm aufgebaut. Dieser hat auf mittlerer Höhe den Temperatursensor verbaut. Darüber wird ein Gelenk mit einem Hebelarm aufgebaut. Über diesen Hebelarm soll später der Teebeutel nach einer eingestellten Zeit aus der Tasse gehoben werden (vgl. Abbildung 3).
Komponentenspezifikation
Stepper-Motor:
Damit der Teebeutel aus der Tasse herausgezogen werden kann, wurde sich für einen Stepper-Motor entschieden. Bei dem Motor kann die Geschwindigkeit und die Strecke variiert werden.
Der Stepper-Motor treibt eine Gewindestange an. Auf dieser befindet sich ein Schlitten, welcher auf einer Welle aufliegt und dort geführt wird. An dem Schlitten kann später der Teebeutel befestigt werden (vgl. Abbildung 4).
Temperatur-Sensor TMP36:
Bei dem Temperatursensor handelt es sich um den TMP36. Er hat drei Anschlüsse, einmal GND, 5V und einen PIN für das Temperatursignal. Am PIN des Temperatursignals werden Spannungen zwischen 0 und 2,0V ausgegeben, welche dann in die entsprechende Temperatur umgerechnet werden müssen. Dabei entsprechen 0V -50°C und 2,0V 150°C.
Der TMP36 nutzt die Bandlücke von Halbleitermaterialien aus um die Temperatur zu ermitteln. Intern sind hier mehrere PNP Transistoren miteinander verschaltet. Besonders wichtig sind dabei zwei Transistoren die mit dem gleichen Kollektorstrom versorgt werden. Die Transistoren unterscheiden sich in ihrer Emitter-Fläche. Steigt nun die Temperatur um den Sensor herum, so entsteht, abhängig von der Temperatur, bei gleicher Stromstärke eine Temperaturspannung. Da die Stromstärke abhängig von der Anzahl der Ladungsträger ist und diese wieder rum abhängig von der Fläche, entsteht eine Temperaturdifferenz, welche nach folgender Formel mathematisch hergeleitet werden kann:
Diese Temperatur, wird intern über weitere Bauteile aufbereitet und kann dann am entsprechenden Pin abgegriffen und ausgelesen werden. Die interne Schaltung des Sensors ist im Datenblatt zu finden.
[5]
LCD-Display:
Das LCD-Display hat auf der Displayfläche insgesamt zwei mal 16 Felder. Jedes dieser Felder kann einzeln angesteuert werden, wodurch insgesamt 32 Zeichen gleichzeitig auf dem Display ausgegeben werden können. Zur einfacheren Kommunikation zwischen Software und Hardware, wurde das Display mit einem I2C-Modul erweitert. Hierdurch kann das Display über Funktionen, die durch die "LiquidCrystal I2C"-Bibliothek bereitgestellt werden, ganz einfach angesteuert werden.
Potentiometer:
Um die Eingabe der Ziehzeit zu erleichtern wurde ein Drehpotentiometer verwendet. Der mittlere Abgriff dieses veränderbaren Widerstandes wird dafür an einen Analog-Eingang des Arduinos angeschlossen. In Abhängigkeit des Widerstandes zwischen Eingang des Potentiometers und Mittelabgriff liegt hier eine Spannung zwischen 0 und 5V an. Diese wird über den A/D-Wandler des Arduinos in ein digitales Signal, zwischen 0 und 1024, umgewandelt. Dieser Wert kann im Programm in die entsprechende Zeit umgewandelt werden.
Piezo-Speaker:
Bei dieser Art Lautsprecher wird der Piezoeffekt verwendet. Übt man auf bestimmte Materialien (z.B. Quarz) eine Kraft aus, so entsteht eine elektrische Ladung an gegenüberliegenden Oberflächen des Kristalls. Dieser Effekt ist umkehrbar, legt man an einen Piezokristall eine Spannung an so verbiegt sich dieser. Der Piezospeaker wird an einen Pin mit Pulsweitenmodulation und Ground angeschlossen. Über die Funktion wird dieser Pin mit einer vorher angegeben Frequenz angesteuert. Durch das sich ändernde Signal wird der Piezokristall in der entsprechenden Frequenz ausgelenkt und zum schwingen angeregt. Diese Auslenkung wird auf eine Membran übertragen, wodurch ein Ton erzeugt werden kann.
Umsetzung (HW/SW)
Hardware:
Der Turm und die Displayhalterung mit Bedienung wurde mittel CAD erstellt und anschließend mit einem 3D-Drucker hergestellt. Der Turm ist zusätzlich in einer Holzplatte eingelassen, damit die benötigte Standfestigkeit erreicht werden kann und um die elektrische Hardware verstauen zu können. Der Arm des Turms wurde so gestaltet, dass hier der Motor mitsamt Führung eingebaut werden kann (vgl. Abbildung 5). Das Display, der Schalter zum einschalten des Systems, das Potentiometer für die Zeiteinstellung, ein Taster und die LEDs wurde alle in die Displayhalterung integriert (vgl. Abbildung 6).
Software:
Als Orientierung für die Entwicklung der Software wurde mit dem PAP gearbeitet welcher vor Beginn des Schreiben der eigentlichen Software erstellt wurde (vgl. Abbildung 7). Für die Steuerung der einzelnen Aktoren wurden eigenen Funktionen geschrieben.
Die Rohen-Sensordaten, welche an den Analogen-Eingängen empfangen werden, werden mithilfe des map()-Befehls umgerechnet. Wie im folgenden Beispiel zu sehen:
Sensorwert = analogRead(TMP_Sensor); Temperatur = map(Sensorwert, 0, 410, -50, 150); //0 und 410 Wertebereich WassertempArray[zaehler] = map(Temperatur, 28,36,65,95);
Der map()-Befehl wandelt dabei automatisch den Sensorwert, welcher in einem Wertebereich von 0 bis 410 (da nur max. 2Volt vom TMP36 ausgehen) digital vorliegen, in die entsprechende Temperatur (-50 bis 150°C) um. Da der Temperatursensor nur die Lufttemperatur über dem Tee misst, kann man über diesen Wert keine direkte Aussage über die Wassertemperatur machen. Um eine ungefähre Abschätzung über die Temperatur des Wassers machen zu können, haben wir die Wassertemperatur analog gemessen, während der Temperatursensor Messdaten über die Temperatur der aufsteigenden Luft aufgenommen hat. Bei diesem Test hat sich die Wassertemperatur in einem Zeitraum von 15 Minuten von 95 auf 65°C abgekühlt, während die aufsteigende Luft eine Temperatur von 36 bis 28°C hatte. Der Verlauf ist in beiden Fällen annähernd linear und wird für die weitere Verwendung so angenommen. Umgerechnet wird die gemessene Temperatur erneut über den map()-Befehl, in eine Wassertemperatur. Ähnlich wie bei der Temperaturmessung werden auch beim Potentiometer die Rohdaten von Analog-Eingang mit dem map()-Befehl umgerechnet. Anders ist hier, dass der Wertebereich des Eingangs zwischen 0 und 1024 liegt, da hier nun maximal 5 Volt anliegen können. Da Tees in der Regel nicht länger als 8 Minuten ziehen müssen, haben wir für die Umrechnung der Sensordaten den Wertebereich von 0 bis 480 (Sekunden) angenommen. Die Zeit in Sekunden wurde dann aufgeteilt in Minuten und Sekunden, für eine bessere Displayausgabe. Wie im Folgenden zusehen wurde dies mit den "/" und "%" Operatoren realisiert.
void Poti() {
lcd.clear(); Zeit1 = millis(); while(abs(Zeit2-Zeit1) <= 10000 && digitalRead(taster) == LOW) { Potiwiderstand = analogRead(PotiPin); ZeitPoti = map(Potiwiderstand, 0, 1024, 0, 480); //in sekunden //Umrechnung in Minuten und Sekunden für Bildschirmausgabe Minuten = ZeitPoti/60; Sekunden = ZeitPoti%60; BildschirmausgabeZeit(); Zeit2 = millis(); delay(500); } Tee = 1;
}
void BildschirmausgabeZeit() {
lcd.clear(); lcd.setCursor(0, 0);//Hier wird die Position des ersten Zeichens festgelegt. lcd.print("Ziehzeit: "); lcd.print(Minuten); lcd.print(":"); if(Sekunden < 10) { lcd.print("0"); lcd.print(Sekunden); } else { lcd.print(Sekunden); }
}
Wurden alle Parameter eingestellt und mit dem Taster bestätigt beginnt die Temperaturmessungs-Schleife. Hierbei wird im Sekundentakt die Temperatur ermittelt. Da mit dem HotCup-Assistent auch andere Heißgetränke kontrolliert werden können gibt es in der Schleife eine Fallunterscheidung, ob gerade ein Tee unter dem Sensor steht oder nicht. Steht ein Tee drunter spielt die zuvor eingestellte Ziehzeit eine Rollen. Ist diese abgelaufen (if ZeitPoti == 0), wird die Motoransteuerung einmalig angesteuert, sodass der Teebeutel vom Motor hochgezogen wird. Anschließend läuft die Temperaturmessung einfach weiter, bis die, aus eigener, subjektiver Meinung, optimale Temperatur zum trinken des Tees (etwa 65°C) erreicht wurde. Da der Temperatursensor durchaus durch äußerer Einflüsse (z.B. Luftzug bei Bewegung, ...) etwas schwanken kann, bestimmen wir in jedem Schleifendurchlauf einen Mittelwert der letzten zehn Messwerte des Sensors, sodass größere, kurzzeitige Schwankungen keine Auswirkung auf den ausgegebenen Wert haben.
while(Temperatur > 0) { T2 = T2 +1; Temperatur = 95.0 - (T2*0.044); Serial.println(Temperatur); if(Tee == 1) { Timer(); if(ZeitPoti == 0) { Motoransteuerung(HOCH); Tee = 0; } } else { delay(1000); }
if(Temperatur > 80) { digitalWrite(rot,HIGH); digitalWrite(gelb,LOW); digitalWrite(gruen,LOW); } else if(Temperatur>65 && Temperatur<=80) { digitalWrite(rot,LOW); digitalWrite(gelb,HIGH); digitalWrite(gruen,LOW); } else if(Temperatur<65) { digitalWrite(rot,LOW); digitalWrite(gelb,LOW); digitalWrite(gruen,HIGH); if(Ton==0) { tone(TonP, 440, 3000); //Es soll genau 3 Sekunden ein Ton mit einer Frequenz von 440 Hz ausgegeben werden Ton = 1; } } BildschirmausgabeTemp(); }
Wurde dies erreicht, wird ein Signalton über die Piezospeaker erzeugt und die grünen LEDs leuchte.
Das vollständige Programm ist im SVN hinterlegt.
Komponententest
Bevor die Komponenten in das Gehäuse eingesetzt wurden, sind diese getestet worden. Es wurde dafür kleine Sketeche für die einzelnen Sensoren und Aktoren geschrieben, um diese zum einen zu Testen und zum anderen auch besser verstehen zu können. Durch die Programmgestaltung mithilfe mehrerer Funktionen, konnten im Anschluss die Ausschnitte aus den Sketchen in das Hauptprogramm zusammengefügt werden. Nachdem und während das System aufgebaut wurde, wurde die Verdrahtung mit dem Verdrahtungsplan (vgl. Abbildung 8) abgeglichen. Im Anschluss dann das Programm auf den Arduino gespielt und überprüft. Danach wurden die Komponenten in das Gehäuse eingesetzt und die Anforderungen mittels einer Checkliste überprüft.
Ergebnis
Der HotCup-Assistent wurde wie in Abbildung 9 abgebildet verdrahtet, der Mikrocontroller mit seinem Anschlüssen befindet sich dabei versteckt hinter der Displayhalterung. Das komplett fertige System kann in Abbildung 1 bewundert werden.
Ein Video, welches alle Funktionen des HotCup-Assistenten präsentiert, ist unten verlinkt.
Zusammenfassung
Das Projekt beschreibt die Planung, Konstruktion, Programmierung und den Zusammenbau des HotCup-Assistenten. Damit der HotCup-Assistent erfolgreich umgesetzt werden kann, werden Kenntnisse aus den Bereichen der Mechanik, Elektrotechnik und Informatik benötigt. So verbindet das Projekt auf spielerische Weise alle Themengebiete der Mechatronik.
Während der Durchführung des Projektes sind Probleme aufgetreten, welche vorher in der Planung nicht berücksichtigt wurden. Zum Beispiel mussten Teile, nachdem sie gedruckt waren umkonstruiert und angepasst werden. Die Abmessung der Komponenten haben nicht mit den Abmessungen des Gehäuses zusammengepasst, somit wurden kleine Änderunegn und Anpassungen realisiert.
Lessons Learned
In dem Prjekt "HotCup-Assistent" konnten bereits bestehende Kenntnisse vertieft und verbessert werden. Zudem wurden neue Kenntnisse aufgebaut.
- Ansteuerung eines Stepper-Motors
- Umgang mit CAD
- Auswahl geeigneter Aktoren und Sensoren
- Realistische Zeitplanung (Puffer einbauen)
Projektunterlagen
Projektplan
Projektdurchführung
Zu Beginn des Projektes wurde gebrainstormt, wie die Anforderungen am besten umgesetzt und welche Komponenten für die Umsetzung benötigt werden. Auf Grundlage dieser Überlegungen sind die fehlenden Komponenten beschafft worden. Anhand der Geometrievorgaben der Komponenten und deren Größe wurden die 3D-Modelle erstellt, angepasst und abschließend verbessert. Danach konnten die Komponenten mittels 3D-Druck gefertigt werden. Währenddesen wurde die Software geschrieben. Abschließend wurde alles zusammengesetzt und getestet.
YouTube Video
Weblinks
Literatur
→ zurück zur Übersicht: WS 21/22: Angewandte Elektrotechnik (BSE)