INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 1 Bewertungen - 5 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Reaktionsspiel funktioniert nicht, wie es sollte...
19.07.2019, 16:36
Beitrag #1
Reaktionsspiel funktioniert nicht, wie es sollte...
Hallo an die Arduino- Community,
Möchte mich vorerst für den Thread davor entschuldigen. So jetzt aber zu 100% was anderes. Ich habe ein kleines Reaktionsspiel gebaut, das mithilfe der App Blynk funktioniert, von der müsst ihr aber keine Ahnung haben, ist für die Frage relativ egal. Das ganze läuft so ab, dass die LEDs erstmal ein bisschen leuchten, im Kreis, im Kreis andersrum und eben als kleine Spielerei (Stelle //Spielerei), dann kommt ein random delay, dann sollen alle leuchten(//alle leuchten). Ab da sollen die Buttons in der App, die ich als Digital Pins definiert habe, freigegeben sein und Messungen dieser aufgenommen werden. So Problem 1 ist, dass ich den Seriellen Monitor nicht öffnen kann, da Blynk diesen Serial Port schon nutzt... Dafür habe ich mir aber meinen Speaker/Active Buzzer ausgedacht, der in der Auswertung danach, der Spielerzahl entsprechend oft aktiviert wird (z.B. Spieler 2- 2 Töne)... Das klappt nicht, ich denke es liegt daran, dass meine Methode zum Vergleichen der Zeiten (Stelle //Vergleich) falsch ist. Bitte dort helfen, falls ihr gute Ideen habt!
Und dann wäre da noch ein Problem, ich weiß delays sind immer ganz scheiße für ein Reaktionsspiel und für Werteaufnahme bzw. Buttons/Taster im Normalfall (//Buttonfreigabe), falls euch da Alternativen einfallen, bitte posten! Bin natürlich offen für andere Verbesserungen am Programm!
Verkabelung/Vernetzung ist denke ich mal dem Code zu entnehmen...
Springt einfach zu den entsprechenden Stellen im Code, die in Klammern hinter dem Problem stehen und dann STRG + F, habe die mit // an die entsprechende Stelle geschrieben.
Danke für eure Antworten!
MFG Alex
So mein Code, hier:
Code:
#define BLYNK_PRINT DebugSerial
#include <SoftwareSerial.h>
SoftwareSerial DebugSerial(2, 3); // RX, TX
#include <BlynkSimpleStream.h>
char auth[] = "UnFNS1fIbvFVX8QGBWDoBKah3aWND6dn";
#include <LiquidCrystal.h>
LiquidCrystal lcd(22, 23, 26, 27, 25, 24);
const int led1 = 13;
const int led2 = 12;
const int led3 = 10;
const int led4 = 11;
const int Speaker = 9;
const int Button1 = 2;
const int Button2 = 3;
const int Button3 = 4;
const int Button4 = 5;
const int Start = 6;
bool Freigabe = false;
bool Auswertung = false;
bool Ende = false;
int randomdelay;
unsigned long timeSpieler1;
unsigned long timeSpieler2;
unsigned long timeSpieler3;
unsigned long timeSpieler4;
unsigned long time;
void setup()
{
  DebugSerial.begin(9600);
  Serial.begin(9600);
  Blynk.begin(Serial, auth);
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(Speaker, OUTPUT);
  pinMode(Button1, INPUT);
  pinMode(Button2, INPUT);
  pinMode(Button3, INPUT);
  pinMode(Button4, INPUT);
  pinMode(Start, INPUT);
}
void loop()
{
  Blynk.run();
  delay(2000);
  if (digitalRead(Start) == HIGH) {
    Serial.println("Das Spiel wurde gestartet, wartet bis alle LED's leuchten, dann drückt euren Buzzer, sobald er freigegeben ist.");
    Serial.println(" Viel Spaß! :D ");
    delay(2000);
    digitalWrite(led1, HIGH); //Spielerei
    delay(100);
    digitalWrite(led1, LOW);
    digitalWrite(led2, HIGH);
    delay(100);
    digitalWrite(led2, LOW);
    digitalWrite(led3, HIGH);
    delay(100);
    digitalWrite(led3, LOW);
    digitalWrite(led4, HIGH);
    delay(100);
    digitalWrite(led4, LOW);
    digitalWrite(led1, HIGH);
    delay(100);
    digitalWrite(led1, LOW);
    delay(300);
    digitalWrite(led4, HIGH);
    delay(100);
    digitalWrite(led4, LOW);
    digitalWrite(led3, HIGH);
    delay(100);
    digitalWrite(led3, LOW);
    digitalWrite(led2, HIGH);
    delay(100);
    digitalWrite(led2, LOW);
    digitalWrite(led1, HIGH);
    delay(100);
    digitalWrite(led1, LOW);
    delay(300);
    digitalWrite(led1, HIGH);
    digitalWrite(led3, HIGH);
    delay(100);
    digitalWrite(led1, LOW);
    digitalWrite(led3, LOW);
    delay(100);
    digitalWrite(led2, HIGH);
    digitalWrite(led4, HIGH);
    delay(100);
    digitalWrite(led2, LOW);
    digitalWrite(led4, LOW);
    delay(100);
    delay(300);
    digitalWrite(led2, HIGH);
    digitalWrite(led4, HIGH);
    delay(100);
    digitalWrite(led2, LOW);
    digitalWrite(led4, LOW);
    delay(100);
    digitalWrite(led1, HIGH);
    digitalWrite(led3, HIGH);
    delay(100);
    digitalWrite(led1, LOW);
    digitalWrite(led3, LOW);
    randomdelay = random(3000, 13000); //alle leuchten
    delay(randomdelay);
    Freigabe = true;
    digitalWrite(led1, HIGH);
    digitalWrite(led2, HIGH);
    digitalWrite(led3, HIGH);
    digitalWrite(led4, HIGH);
  }
  while (Freigabe == true) { //Buttonfreigabe
    digitalRead(Button1);
    digitalRead(Button2);
    digitalRead(Button3);
    digitalRead(Button4);
  }
  if (digitalRead(Button1) == HIGH && Freigabe == true) { //Buttonfreigabe
    Serial.println("Spieler 1 hat gedrückt!");
    Serial.println("Zeit: ");
    timeSpieler1 = millis();
    Serial.print(time);
  }
  if (digitalRead(Button2) == HIGH && Freigabe == true) {
    Serial.println("Spieler 2 hat gedrückt!");
    Serial.println("Zeit: ");
    timeSpieler2 = millis();
    Serial.print(time);
  }
  if (digitalRead(Button3) == HIGH && Freigabe == true) {
    Serial.println("Spieler 3 hat gedrückt!");
    Serial.println("Zeit: ");
    timeSpieler3 = millis();
    Serial.print(time);
  }
  if (digitalRead(Button4) == HIGH && Freigabe == true) {
    Serial.println("Spieler 4 hat gedrückt!");
    Serial.println("Zeit: ");
    timeSpieler4 = millis();
    Serial.print(time);
  }
}
if (timeSpieler1 < timeSpieler2 && timeSpieler1 < timeSpieler3 && timeSpieler1 < timeSpieler4 && Auswertung == true) { //Vergleich
  Serial.println ("Spieler 1 hat gewonnen!");
  Ende = true;
  digitalWrite(Speaker, HIGH);
  delay(500);
  digitalWrite(Speaker, LOW);
}
if (timeSpieler2 < timeSpieler1 && timeSpieler2 < timeSpieler3 && timeSpieler2 < timeSpieler4 && Auswertung == true) {
  Serial.println ("Spieler 2 hat gewonnen!");
  Ende = true;
  digitalWrite(Speaker, HIGH);
  delay(500);
  digitalWrite(Speaker, LOW);
  delay(500);
  digitalWrite(Speaker, HIGH);
  delay(500);
  digitalWrite(Speaker, LOW);
}
if (timeSpieler3 < timeSpieler1 && timeSpieler3 < timeSpieler2 && timeSpieler3 < timeSpieler4 && Auswertung == true) {
  Serial.println ("Spieler 3 hat gewonnen!");
  Ende = true;
  digitalWrite(Speaker, HIGH);
  delay(500);
  digitalWrite(Speaker, LOW);
  delay(500);
  digitalWrite(Speaker, HIGH);
  delay(500);
  digitalWrite(Speaker, LOW);
  delay(500);
  digitalWrite(Speaker, HIGH);
  delay(500);
  digitalWrite(Speaker, LOW);
}
if (timeSpieler4 < timeSpieler1 && timeSpieler4 < timeSpieler2 && timeSpieler4 < timeSpieler3 && Auswertung == true) {
  Serial.println ("Spieler 4 hat gewonnen!");
  Ende = true;
  digitalWrite(Speaker, HIGH);
  delay(500);
  digitalWrite(Speaker, LOW);
  delay(500);
  digitalWrite(Speaker, HIGH);
  delay(500);
  digitalWrite(Speaker, LOW);
  delay(500);
  digitalWrite(Speaker, HIGH);
  delay(500);
  digitalWrite(Speaker, LOW);
  delay(500);
  digitalWrite(Speaker, HIGH);
  delay(500);
  digitalWrite(Speaker, LOW);
}
if (Ende == true) {
  Freigabe = false;
  digitalWrite(led1, LOW);
  digitalWrite(led2, LOW);
  digitalWrite(led3, LOW);
  digitalWrite(led4, LOW);
}
} //Respekt an alle die bis hier gelesen haben :)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.07.2019, 16:44 (Dieser Beitrag wurde zuletzt bearbeitet: 19.07.2019 16:46 von hotsystems.)
Beitrag #2
RE: Reaktionsspiel funktioniert nicht, wie es sollte...
Antworten habe ich keine, erst mal Fragen.

Was für einen Arduino verwendest du ?
Wieso ist die serielle durch Blynk belegt, wo du doch dafür SoftwareSerial verwendest ?
Warum verwendest du die Pins D2 und D3 doppelt ?
Das kann nicht funktionieren.

Das ist, was mir auffiel.
Evtl. ist da noch mehr, was nicht richtig ist.
Muss ich noch mal schauen.

Und anstelle der delays musst du zwingend "BlinkWithoutDelay" einsetzen.
Dann geht es auch mit den Tasten im Sketch.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.07.2019, 16:49
Beitrag #3
RE: Reaktionsspiel funktioniert nicht, wie es sollte...
Das delay für ein Reaktionsspiel ungünstig ist, hast Du ja schon gemerkt. Also beschäftige Dich mit millis(). Verstehe dazu BlinkWithoutDelay und als Erkärung dazu die Nachtwächtererklärung und die Erklärung hier in "Tutorials und Literatur"

Hier hast Du erst mal eine sinnlose Endlosschleife gebaut, aus der Du nicht wieder raus kommst:
Code:
while (Freigabe == true) { //Buttonfreigabe
    digitalRead(Button1);
    digitalRead(Button2);
    digitalRead(Button3);
    digitalRead(Button4);
  }
digitalRead gibt einen Wert zurück, schließlich willst Du ja wissen, welcher Button gedrückt ist. Den solltest Du in jeweils einer Variablen speichern.
Du brauchst keine eigene Schleife, Du hast ja loop.
Deine Buttons sind nach +5V geschaltet? Du hast an jedem Button einen PullDownwiderstand?
Besser:
Code:
bool bu1,bu2,bu3,bu4, ausgeloest = false;

if (Freigabe) { //Buttonfreigabe
    bu1 = digitalRead(Button1);
    bu2 = digitalRead(Button2);
    bu3 = digitalRead(Button3);
    bu4 = digitalRead(Button4);
    if (bu1 || bu2 || bu3 || bu4) {
      Freigabe = false;
      ausgeloest = true;
    }
  }
  if (ausgeloest) {
    // Auswertung
    ausgeloest = false;
    delay(10); // zum Entprellen der Taster
  }

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.07.2019, 16:52 (Dieser Beitrag wurde zuletzt bearbeitet: 19.07.2019 16:56 von Stagneth.Alexander.)
Beitrag #4
RE: Reaktionsspiel funktioniert nicht, wie es sollte...
Hi,
Ich verwende den Arduino Uno. Das SoftwareSerial habe ich nicht selber eingefügt, also schon aber eben nur STRG + V - mäßig... Das scheint von Blynk in irgendeiner Weise genutzt zu werden, oder irre ich mich da? Hätte ansonsten noch alle AnalogPins für das SoftwareSerial frei... Habe aber gar keine dazugehörige Hardware für das SoftwareSerial, also keinen TLL USB Konverter.

Soll ich dieses BlynkWithoutDelays statt allen delays nutzen?

Okay, kann ich mir alles anschauen mit den Delays ersetzen und so weiter...
Aber vlt. war das nicht sichtbar genug, die Buttons sind keine Taster, sondern in der App, also Knöpfe auf meinem Touchscreen, die mit den digitalPins 2-5 verbunden sind.
Danke, werde mich damit mal beschäftigen!
Big Grin

"Manchmal muss man rennen, bevor man laufen kann." - Iron Man/Tony Stark
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.07.2019, 16:56
Beitrag #5
RE: Reaktionsspiel funktioniert nicht, wie es sollte...
(19.07.2019 16:52)Stagneth.Alexander schrieb:  Hi,
Ich verwende den Arduino Uno. Das SoftwareSerial habe ich nicht selber eingefügt, also schon aber eben nur STRG + V - mäßig... Das scheint von Blynk in irgendeiner Weise genutzt zu werden, oder irre ich mich da? Hätte ansonsten noch alle AnalogPins für das SoftwareSerial frei... Habe aber gar keine dazugehörige Hardware für das SoftwareSerial, also keinen TLL USB Konverter.

Soll ich dieses BlynkWithoutDelays statt allen delays nutzen?

Ich kenne dein Blynk nicht, dass sollen wir ja auch nicht.

Und ja, BlinkWithoutDelay musst du für jedes delay einbauen.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.07.2019, 16:57 (Dieser Beitrag wurde zuletzt bearbeitet: 19.07.2019 16:58 von Stagneth.Alexander.)
Beitrag #6
RE: Reaktionsspiel funktioniert nicht, wie es sollte...
Was bringen diese vertikalen Striche zwischen den bu1 und so weiter?

Alles gut, dass ist auch nicht schlimm. Ich meinte das nur erklärend, damit ihr vlt. das nachvollziehen könnt, weil das ja verwirrend ist.
Smile Big Grin

"Manchmal muss man rennen, bevor man laufen kann." - Iron Man/Tony Stark
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.07.2019, 16:59 (Dieser Beitrag wurde zuletzt bearbeitet: 19.07.2019 17:10 von hotsystems.)
Beitrag #7
RE: Reaktionsspiel funktioniert nicht, wie es sollte...
(19.07.2019 16:57)Stagneth.Alexander schrieb:  Was bringen diese vertikalen Striche zwischen den bu1 und so weiter?

Oha....da fehlen aber noch gewaltig die Grundlagen.

Z.B. Oder.

Und eine weitere Frage: was genau soll dein LCD-Display machen ?

Ich sehe nirgens eine Verwendung.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
19.07.2019, 17:11
Beitrag #8
RE: Reaktionsspiel funktioniert nicht, wie es sollte...
Ich habe mir jetzt die "Nachtwächtererklärung" durchgelesen, meine es verstanden zu haben, mal sehen ob es auch so ist.
P.S. ist einfach eine geniale Erklärung

"Manchmal muss man rennen, bevor man laufen kann." - Iron Man/Tony Stark
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
Wink Solar Roboter- Servo dreht nach Stopp nicht weiter Stagneth.Alexander 37 1.551 20.08.2019 14:15
Letzter Beitrag: geist4711
  myport nicht gefunden? - Arduino und Visual Studio Stagneth.Alexander 3 211 04.08.2019 17:38
Letzter Beitrag: Tommy56
  Atmega 328 Sketchl läuft auf UNO3, alleine auf Breadboard nicht delay 9 530 02.08.2019 15:03
Letzter Beitrag: hotsystems
Question Programm läuft nicht richtig CMeeep 22 1.411 04.07.2019 21:58
Letzter Beitrag: Franz54
  2 Sketche zusammenführen - korrelieren nicht Nicolai 11 1.057 24.05.2019 11:04
Letzter Beitrag: Nicolai
  Bedingung wird nicht wiederholt ausgeführt Lite 16 1.293 29.03.2019 05:11
Letzter Beitrag: Lite
  16er Relay schalten funktioniert nur bis 8 Otter 4 625 11.03.2019 16:04
Letzter Beitrag: Otter
  Gelöst ==> Arduino Nano, Kommunikation mit PC bringt nicht korrekten ASCII moehrle 4 692 02.03.2019 22:04
Letzter Beitrag: hotsystems
  Typecasting oder nicht? Batucada 1 505 19.02.2019 18:51
Letzter Beitrag: Tommy56
  Switch erkennt eine Phase nicht DonSonora 27 2.078 30.01.2019 22:24
Letzter Beitrag: MicroBahner

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste