Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
projektewise24:projekt4:doku [2025/03/30 16:46] a.streeck |
projektewise24:projekt4:doku [2025/03/30 19:58] (aktuell) a.streeck |
||
---|---|---|---|
Zeile 47: | Zeile 47: | ||
**Programmcode:** | **Programmcode:** | ||
- | Komponenten: | + | **Komponenten:** |
^ Arduino-Pin ^ Verbindung ^ Funktion ^ | ^ Arduino-Pin ^ Verbindung ^ Funktion ^ | ||
Zeile 58: | Zeile 58: | ||
| 11 | DFPlayer Mini TX | sendet Statusmedlungen an den Arduino (wird von uns nicht aktiv genutzt) | | | 11 | DFPlayer Mini TX | sendet Statusmedlungen an den Arduino (wird von uns nicht aktiv genutzt) | | ||
- | 1.: Initialisierung (Setup-Methode) | + | **1.: Initialisierung (Setup-Methode)** |
Beim Einschalten des Systems führt der Arduino zunächst eine Initialisierung durch. Dazu gehört die Konfiguration der einzelnen Pins für die Sensoren, Aktoren und Kommunikationsmodule. Der Button wird als Eingang mit Pull-up-Widerstand definiert, damit er zuverlässig erkannt wird. Die LED sowie die Pumpen für Alkohol und Saft werden als Ausgang konfiguriert, um sie später gezielt ansteuern zu können. | Beim Einschalten des Systems führt der Arduino zunächst eine Initialisierung durch. Dazu gehört die Konfiguration der einzelnen Pins für die Sensoren, Aktoren und Kommunikationsmodule. Der Button wird als Eingang mit Pull-up-Widerstand definiert, damit er zuverlässig erkannt wird. Die LED sowie die Pumpen für Alkohol und Saft werden als Ausgang konfiguriert, um sie später gezielt ansteuern zu können. | ||
- | Zusätzlich wird eine serielle Kommunikation mit dem DFPlayer Mini über SoftwareSerial hergestellt, um Sprachansagen auszugeben. Der DFPlayer wird initialisiert und die Lautstärke auf den Wert 28 gesetzt, um eine klare Audiowiedergabe zu gewährleisten. | + | Zusätzlich wird eine serielle Kommunikation mit dem DFPlayer Mini über SoftwareSerial hergestellt, um Sprachansagen auszugeben. Der DFPlayer wird initialisiert und die Lautstärke auf den Wert 28 gesetzt. |
void setup() { | void setup() { | ||
Zeile 77: | Zeile 77: | ||
} | } | ||
- | 2.: Start des Vorgangs | + | **2.: Start des Vorgangs** |
Das System überprüft kontinuierlich, ob der Startknopf gedrückt wurde. Um Fehlbedienungen oder versehentliches Auslösen durch kleine Störungen zu vermeiden, wird die Betätigung des Knopfes doppelt geprüft: Zunächst wird erkannt, ob der Knopf gedrückt wurde. Anschließend wird eine kurze Verzögerung eingefügt, bevor erneut überprüft wird, ob der Knopf noch immer gedrückt ist. Erst wenn beide Prüfungen positiv ausfallen, startet der Prozess. | Das System überprüft kontinuierlich, ob der Startknopf gedrückt wurde. Um Fehlbedienungen oder versehentliches Auslösen durch kleine Störungen zu vermeiden, wird die Betätigung des Knopfes doppelt geprüft: Zunächst wird erkannt, ob der Knopf gedrückt wurde. Anschließend wird eine kurze Verzögerung eingefügt, bevor erneut überprüft wird, ob der Knopf noch immer gedrückt ist. Erst wenn beide Prüfungen positiv ausfallen, startet der Prozess. | ||
- | Sobald der Knopf gedrückt wurde, gibt das System eine Sprachausgabe über den DFPlayer Mini aus, um den Benutzer darauf hinzuweisen, dass die Messung beginnt. Gleichzeitig wird eine Wartezeit von neun Sekunden eingehalten, da der MQ-3 Sensor einige Zeit benötigt, um eine stabile Messung des Alkoholgehalts durchzuführen. Während dieser Zeit bleibt das System inaktiv. | + | Sobald der Knopf gedrückt wurde, gibt das System eine Sprachausgabe über den DFPlayer Mini aus, um den Benutzer darauf hinzuweisen, dass er den Becher positionieren soll und die Messung durchgeführt wird, solange die rote LED leuchtet. Gleichzeitig wird eine Wartezeit von fünf Sekunden eingehalten, da der MQ-3 Sensor einige Zeit benötigt, um eine möglichst stabile Messung des Alkoholgehalts durchzuführen. |
if (digitalRead(button) == HIGH) { | if (digitalRead(button) == HIGH) { | ||
Zeile 90: | Zeile 90: | ||
delay(9000); // Zeit für Benutzer Becher zu positionieren und Lampe zu greifen | delay(9000); // Zeit für Benutzer Becher zu positionieren und Lampe zu greifen | ||
- | 3.: Alkoholmessung | + | **3.: Alkoholmessung** |
Nach der Wartezeit beginnt das System mit der Messung des Alkoholgehalts. Dazu wird die Funktion getalkohollevel() aufgerufen, die über eine Schleife fünf Messwerte aufnimmt. Um Messfehler zu minimieren, wird der höchste der fünf erfassten Werte als endgültiger Messwert ausgewählt. | Nach der Wartezeit beginnt das System mit der Messung des Alkoholgehalts. Dazu wird die Funktion getalkohollevel() aufgerufen, die über eine Schleife fünf Messwerte aufnimmt. Um Messfehler zu minimieren, wird der höchste der fünf erfassten Werte als endgültiger Messwert ausgewählt. | ||
Zeile 108: | Zeile 108: | ||
} | } | ||
- | 4.: Entscheidung über das Mischverhältnis | + | **4.: Entscheidung über das Mischverhältnis** |
Basierend auf dem gemessenen Alkoholwert entscheidet das System, wie das Mischungsverhältnis zwischen Alkohol und Saft ausfallen soll. Es gibt drei mögliche Szenarien: | Basierend auf dem gemessenen Alkoholwert entscheidet das System, wie das Mischungsverhältnis zwischen Alkohol und Saft ausfallen soll. Es gibt drei mögliche Szenarien: | ||
Zeile 156: | Zeile 156: | ||
} | } | ||
- | 5.: Steuerung der Pumpen zur Getränkeausgabe | + | **5.: Steuerung der Pumpen zur Getränkeausgabe** |
In der Funktion mixDrink() werden die Pumpen für die jeweils berechneten Zeiträume aktiviert. Zunächst wird die Pumpe für den Alkohol aktiviert und bleibt für die vorgegebene Zeit eingeschaltet. Nach Ablauf der Zeit wird sie wieder deaktiviert. Anschließend wird die Pumpe für den Saft eingeschaltet, die ebenfalls für die vorgegebene Dauer aktiv bleibt. | In der Funktion mixDrink() werden die Pumpen für die jeweils berechneten Zeiträume aktiviert. Zunächst wird die Pumpe für den Alkohol aktiviert und bleibt für die vorgegebene Zeit eingeschaltet. Nach Ablauf der Zeit wird sie wieder deaktiviert. Anschließend wird die Pumpe für den Saft eingeschaltet, die ebenfalls für die vorgegebene Dauer aktiv bleibt. | ||
Zeile 175: | Zeile 175: | ||
} | } | ||
- | 6.: Soundausgabe | + | **6.: Soundausgabe** |
Die Soundausgaben erfolgen über die Funktion playSound(int sound). Der DFPlayer Mini spielt MP3-Dateien von einer SD-Karte ab. | Die Soundausgaben erfolgen über die Funktion playSound(int sound). Der DFPlayer Mini spielt MP3-Dateien von einer SD-Karte ab. | ||
Zeile 185: | Zeile 185: | ||
} | } | ||
- | Kompletter Programmcode: | + | **Kompletter Programmcode:** |
{{:projektewise24:projekt4:mr-take-a-shot.zip|}} | {{:projektewise24:projekt4:mr-take-a-shot.zip|}} | ||
+ | |||
+ | **Mögliche Ausgabe im seriellen Monitor:** | ||
+ | |||
+ | Knopf gedrückt. Messung ... | ||
+ | |||
+ | Sound wird abgespielt: 1 | ||
+ | |||
+ | Gemessener Alkoholwert: 316 | ||
+ | |||
+ | Niedrige Mischung | ||
+ | |||
+ | Sound wird abgespielt: 2 | ||
+ | |||
+ | Sound wird abgespielt: 5 | ||
+ | |||
+ | Getränk ausgegeben. | ||
+ | |||
+ | **Rohdaten zur Kalibrierung der Messwerte des MQ-3 Sensor:** | ||
+ | |||
+ | ^ Anton ^ Elias ^ Annika ^ Lana ^ Anouk ^ Giovanni | **Chris** | | ||
+ | | 218 211 | 246 239 | 225 230 | 264 257 | 248 272 | 245 211 | 214 223 | | ||
+ | | 256 247 | 352 318 | 293 309 | 415 449 | 437 428 | 392 368 | | | ||
+ | | 254 269 | 354 342 | 329 364 | 454 470 | 400 417 | 362 364 | | | ||
+ | | 355 369 | 383 382 | 405 429 | | 456 478 | 453 458 | | | ||
+ | | 409 386 | 448 458 | 461 489 | | | | | | ||
+ | | 500 539 | | | | | | | | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | Anhand dieser Messwerte, die über einen gesamten Abend von verschiedenen Testpersonen, jeweils nach dem Konsum eines alkoholischen Getränks gemessen wurden, haben wir uns für die finalen Grenzwerte für die Funktion des Roboters entschieden. | ||