Benutzer-Werkzeuge

Webseiten-Werkzeuge


projektewise24:projekt4:doku

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
projektewise24:projekt4:doku [2025/03/30 15:14]
Anton_Sey
projektewise24:projekt4:doku [2025/03/30 19:58] (aktuell)
a.streeck
Zeile 43: Zeile 43:
  
 {{:​projektewise24:​projekt4:​wunderlampe.png?​200|}} ​ {{:​projektewise24:​projekt4:​wunderlampe.png?​200|}} ​
 +
 +
 +**Programmcode:​**
 +
 +**Komponenten:​** ​
 +
 +^ Arduino-Pin ​ ^ Verbindung ​   ^ Funktion ​    ^
 +| A0           | MQ-3 Sensor ​  | Misst Alkoholgehalt ​ |
 +| 2            | Taster ​       | Startet Mess- und Mischvorgang |
 +| 5            | LED           | Zeigt vorgegebene Länge zum Pusten ​ |
 +| 8            | Saftpumpe ​    | Dosiereinheit Saft  |
 +| 9            | Alkoholpumpe ​ | Dosiereinheit Alkohol |
 +| 10           | DFPlayer Mini RX  | empfängt Befehle vom Arduino zum Abspielen der Audios ​ |
 +| 11           | DFPlayer Mini TX  | sendet Statusmedlungen an den Arduino (wird von uns nicht aktiv genutzt) ​ |
 +
 +**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.
 +
 +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() {
 +  pinMode(button,​ INPUT_PULLUP);​
 +  pinMode(LED,​ OUTPUT); ​
 +  pinMode(saftpumpe,​ OUTPUT);
 +  pinMode(alkoholpumpe,​ OUTPUT);
 +  Serial.begin(9600);​
 +  mySoftwareSerial.begin(9600);​
 +  myDFPlayer.begin(mySoftwareSerial);​
 +  myDFPlayer.volume(28);​
 +  myDFPlayer.setTimeOut(500);​
 +  myDFPlayer.EQ(0);​
 +}
 +
 +**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.
 +
 +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) {
 +  delay(50); ​
 +  if (digitalRead(button) == HIGH) {  ​
 +    Serial.println("​Knopf gedrückt. Messung ...");
 +    playSound(1); ​ // Startansage
 +    delay(9000);​ // Zeit für Benutzer Becher zu positionieren und Lampe zu greifen
 +
 +**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.
 +
 +Der Sensor gibt einen analogen Wert aus, der eine grobe Schätzung des Alkoholgehalts darstellt. Je höher der Wert, desto höher ist die gemessene Alkoholkonzentration. Dieser Wert wird in der seriellen Konsole ausgegeben, um den Messvorgang nachverfolgen zu können.
 +
 +int getalkohollevel() {
 +  int maxWert = 0;
 +  for(int i = 0; i < 5; i++) {
 +    int wert = analogRead(mq3);​
 +    if (wert > maxWert) {
 +      maxWert = wert;
 +    }
 +    delay(10);
 +  }
 +  return maxWert;
 +}
 +
 +**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:
 +
 +Niedrige Alkoholkonzentration (< 400):
 +
 +  * Das Getränk wird stärker gemischt, mit einem höheren Anteil an Alkohol.
 +
 +  * Eine Sprachausgabe informiert den Benutzer über die „starke Mischung“.
 +
 +  * Das Mischverhältnis beträgt 10,5 Sekunden Alkohol + 5,5 Sekunden Saft.
 +
 +Mittlere Alkoholkonzentration (400 – 550):
 +
 +  * Das Getränk enthält eine ausgewogene Mischung aus Saft und Alkohol.
 +
 +  * Eine Sprachausgabe gibt die „mittlere Mischung“ aus.
 +
 +  * Das Mischverhältnis beträgt 9 Sekunden Alkohol + 7 Sekunden Saft.
 +
 +Hohe Alkoholkonzentration (> 550):
 +
 +  * Das Getränk wird mit einer hohen Menge Saft gemischt.
 +
 +  * Der Benutzer wird durch eine Sprachausgabe über die „niedrige Mischung“ informiert.
 +
 +  * Das Mischverhältnis beträgt 6 Sekunden Alkohol + 10 Sekunden Saft.
 +
 +Beide Pumpen haben durch die unterschiedliche Luftdichten eine unterschiedlich lange Vorlaufzeit. Diese beträgt 6 Sekunden bei der Alkohol- und 3 Sekunden bei der Saftpumpe. ​
 +Das gewählte Mischverhältnis wird anschließend an die Funktion mixDrink() übergeben, welche die Pumpensteuerung übernimmt.
 +
 +if (alkoholLevel < 400) {
 +  Serial.println("​Starke Mischung"​);​
 +  playSound(2);​
 +  delay(3000);​
 +  mixDrink(10500,​ 5500);
 +} else if (alkoholLevel >= 400 && alkoholLevel < 550) {
 +  Serial.println("​Mittlere Mischung"​);​
 +  playSound(3);​
 +  delay(4000);​
 +  mixDrink(9000,​ 7000);
 +} else {
 +  Serial.println("​Niedrige Mischung"​);​
 +  playSound(4);​
 +  delay(4000);​
 +  mixDrink(6000,​ 10000);
 +}
 +
 +**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.
 +
 +Sobald beide Flüssigkeiten ausgegeben wurden, gibt das System eine weitere Sprachausgabe aus, die signalisiert,​ dass das Getränk fertig ist. Gleichzeitig wird eine entsprechende Nachricht in die serielle Konsole geschrieben.
 +
 +void mixDrink(int alkohol, int saft) {
 +  digitalWrite(alkoholpumpe,​ HIGH);
 +  delay(alkohol);​
 +  digitalWrite(alkoholpumpe,​ LOW);
 +
 +  digitalWrite(saftpumpe,​ HIGH);
 +  delay(saft);​
 +  digitalWrite(saftpumpe,​ LOW);
 +  ​
 +  playSound(5);​
 +  Serial.println("​Getränk ausgegeben."​);​
 +}
 +
 +**6.: Soundausgabe**
 +
 +Die Soundausgaben erfolgen über die Funktion playSound(int sound). Der DFPlayer Mini spielt MP3-Dateien von einer SD-Karte ab.
 +
 +void playSound(int sound) {
 +  myDFPlayer.play(sound);​
 +  Serial.print("​Sound wird abgespielt: ");
 +  Serial.println(sound);​
 +}
 +
 +**Kompletter Programmcode:​**
 +
 +{{:​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.
  
  
Zeile 64: Zeile 240:
 **Vorführung des Roboters:** **Vorführung des Roboters:**
  
-Nüchtern:+ 
 +Durchlauf im nüchternen zustand: 
 {{:​projektewise24:​projekt4:​3aefb3b5-9c15-4de5-adbc-c55fb5f3d15c.mp4|}} {{:​projektewise24:​projekt4:​3aefb3b5-9c15-4de5-adbc-c55fb5f3d15c.mp4|}}
  
-1+ 
 + 
 +Durchlauf mit wenig getrunkenen Alkohol:
  
 {{:​projektewise24:​projekt4:​01a1a2d3-13ec-4519-a925-e916059a3768.mp4|}}  ​ {{:​projektewise24:​projekt4:​01a1a2d3-13ec-4519-a925-e916059a3768.mp4|}}  ​
  
-3+ 
 + 
 +Durchlauf mit viel getrunkenen Alkohol:
  
 {{:​projektewise24:​projekt4:​f9e59bd7-cae4-436f-8a69-dc18a1d72ddf.mp4|}} {{:​projektewise24:​projekt4:​f9e59bd7-cae4-436f-8a69-dc18a1d72ddf.mp4|}}
projektewise24/projekt4/doku.1743340490.txt.gz · Zuletzt geändert: 2025/03/30 15:14 von Anton_Sey