Go Down

Topic: Quiz Buzzersystem für 8 Spieler (Read 396 times) previous topic - next topic

takriol

Apr 03, 2020, 01:37 pm Last Edit: Apr 03, 2020, 02:35 pm by takriol Reason: Habe den Code eingefügt
Hallo, ich bin neu hier und auch recht unerfahren was das Programmieren von Arduinos angeht.

Ich habe mir vorgenommen ein Quiz mit Buzzern für 8 Spieler zu bauen. Bzw. gebaut ist es schon, zumindest so weit das ich testen kann, und dabei kam jetzt heraus das mein Programm nicht so funktioniert wie ich es gerne hätte. Ich habe es unten angehängt, mit Sicherheit könnt ihr mir da so einige Probleme und Ungereimtheiten zeigen. :D

Es sollte später so ablaufen, dass ich eine Frage stelle und wer die Antwort weiß buzzert. Damit eindeutig entschieden werden kann wer schneller war, hat jeder Spieler eine LED die leuchtet, wenn er der erste war.
Über einen Taster der an 5V und RST angeschlossen ist starte ich die nächste Runde.
Zusätzlich soll ein Signalton für eine Sekunde erklingen wenn jemand buzzert.

Ich denke das sollte gut mit einem Nano realisierbar sein.

Code: [Select]
int p1 = 2; //Buzzer Spieler 1
int p2 = 3; //Buzzer Spieler 2
int p3 = 4; //Buzzer Spieler 3
int p4 = 5; //Buzzer Spieler 4
int p5 = 6; //Buzzer Spieler 5
int p6 = 7; //Buzzer Spieler 6
int p7 = 8; //Buzzer Spieler 7
int p8 = 9; //Buzzer Spieler 8
int l1 = A7; //LED Spieler 1
int l2 = A6; //LED Spieler 2
int l3 = A5; //LED Spieler 3
int l4 = A4; //LED Spieler 4
int l5 = A3; //LED Spieler 5
int l6 = A2; //LED Spieler 6
int l7 = A1; //LED Spieler 7
int l8 = A0; //LED Spieler 8
int peep = 13; //Pieper als Signalton

void setup() {
  pinMode(p1, INPUT); //Buzzer sind an Input
  pinMode(p2, INPUT);
  pinMode(p3, INPUT);
  pinMode(p4, INPUT);
  pinMode(p5, INPUT);
  pinMode(p6, INPUT);
  pinMode(p7, INPUT);
  pinMode(p8, INPUT); 
  digitalWrite(p1, LOW); //Startwert der Buzzer
  digitalWrite(p2, LOW);
  digitalWrite(p3, LOW);
  digitalWrite(p4, LOW);
  digitalWrite(p5, LOW);
  digitalWrite(p6, LOW);
  digitalWrite(p7, LOW);
  digitalWrite(p8, LOW);
  pinMode(l8, OUTPUT); //LEDs sind an Output
  pinMode(l7, OUTPUT);
  pinMode(l6, OUTPUT);
  pinMode(l5, OUTPUT);
  pinMode(l4, OUTPUT);
  pinMode(l3, OUTPUT);
  pinMode(l2, OUTPUT);
  pinMode(l1, OUTPUT);
  digitalWrite(l1, LOW); //LEDs sind zu beginn aus
  digitalWrite(l2, LOW);
  digitalWrite(l3, LOW);
  digitalWrite(l4, LOW);
  digitalWrite(l5, LOW);
  digitalWrite(l6, LOW);
  digitalWrite(l7, LOW);
  digitalWrite(l8, LOW);
  while (digitalRead(l1) == LOW && digitalRead(l2) == LOW && digitalRead(l3) == LOW && digitalRead(l4) == LOW && digitalRead(l5) == LOW && digitalRead(l6) == LOW && digitalRead(l7) == LOW && digitalRead(l8) == LOW){
  //solange kein Buzzer betätigt wurde soll weiter nach einem gedrückten Buzzer 'gesucht' werden
  if (digitalRead(p1) == HIGH){ //Wenn Spieler 1 buzzert leuchtet seine LED und das Programm pausiert, gleiches gilt für alle anderen Spieler
  digitalWrite(l1, HIGH);
  }
  else if (digitalRead(p2) == HIGH){
  digitalWrite(l2, HIGH);
  }
  else if (digitalRead(p3) == HIGH){
  digitalWrite(l3, HIGH);
  }
  else if (digitalRead(p4) == HIGH){
  digitalWrite(l4, HIGH);
  }
  else if (digitalRead(p5) == HIGH){
  digitalWrite(l5, HIGH);
  }
  else if (digitalRead(p6) == HIGH){
  digitalWrite(l6, HIGH);
  }
  else if (digitalRead(p7) == HIGH){
  digitalWrite(l7, HIGH);
  }
  else if (digitalRead(p8) == HIGH){
  digitalWrite(l8, HIGH);
  }
 if (l1 == HIGH || l2 == HIGH || l3 == HIGH || l4 == HIGH || l5 == HIGH || l6 == HIGH | l7 == HIGH || l8 == HIGH){ //Wenn ein Spieler buzzert piept es für eine Sekunde
    digitalWrite(peep, HIGH);
    delay(1000);
    digitalWrite(peep, LOW);
  }
  }
}

void loop(){
}

HotSystems

Hallo,
ich sehe kein Programm, sondern nur Bilder.

Einen Sketch als Bild hier rein zu hängen, ist die schlechteste Idee.

Setze den Sketch bitte in Code-Tags.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.

Dazu den Sketch markieren und die Schaltfläche klicken, oder [ code] davor und [ / code] dahinter ohne Leerzeichen.


Damit wird dieser für alle besser lesbar, auch für mobile Geräte. Das kannst du auch noch nachträglich machen.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

my_xy_projekt

Moin,

Du schreibst, was Du willst, aber nicht, was jetzt passiert.
Vielleicht kommst Du dann selbst drauf, wo es klemmt.

Bitte mach Dich mal schlau, was setup() und was loop() machen und wie die funktionieren.

Quote
Über einen Taster der an 5V und RST angeschlossen ist starte ich die nächste Runde.
Dafür ist RST aber nicht gedacht.

takriol

Danke erstmal. Wie weiß ich denn was das Programm macht?
Der Hauptunterschied zwischen setup() und loop() ist doch das loop() ständig neu ausgeführt wird oder nicht?
Ist RST nicht der Resetpin?

Ja, die Taster liegen zwischen Pin uns 5V. Habe keine externen Widerstände.

MicroBahner

#4
Apr 03, 2020, 03:44 pm Last Edit: Apr 03, 2020, 03:47 pm by MicroBahner
Neben dem, was schon geschrieben wurde, noch ein paar grundsätzliche Bemerkungen:

- Die Pins A6 und A7 des Nano sind reine Analog-Eingänge. Die kannst Du nicht als Digitale Ausgänge nutzen.

- Was bezweckst Du mit diesen Anweisungen:
Code: [Select]
digitalWrite(p1, LOW); //Startwert der Buzzer
...
Der Startwert ergibt sich aus der angeschlossenen Hardware.

- Das hier ist sinnfrei:
Code: [Select]
if (l1 == HIGH || l2 == HIGH ...Du vergleichst die Pinnummern mit HIGH/LOW. Aber du willst wohl eher den Status am Pin vergleichen. Ob ein Buzzer gedrückt wurde, machst Du aber besser mit einem Flag.

- Du solltest dich mal ganz dringend mit Arrays beschäftigen.

- Wenn Du keine externen Widerstände hast, musst Du die Taster zwischen PIN und Gnd anschließen. Den Pin mit INPUT_PULLUP initiieren, und die die Taster als LOW-aktiv abfragen.

- Um zu wissen, was das Programm macht, musst Du serielle Ausgaben einfügen, und das am ser. Monitor verfolgen.
Gruß, Franz-Peter

noiasca

#5
Apr 03, 2020, 03:46 pm Last Edit: Apr 03, 2020, 03:46 pm by noiasca
aktiviere Serial.begin(115200);

bau dir überall Serial.print Ausgaben ein, damit du siehst was dein Programm tut.

Entweder aktivierst die internen Pullups und schließt gegen Masse, oder du brauchst externe Pulldowns.
Schau dir Tutorials an, wie man Buttons anschließt und ausliest.
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

gregorss

Dafür ist RST aber nicht gedacht.
Das ist hier doch vollkommen wurscht. Es erfüllt seinen Zweck.

Gruß

Gregor
Der Rest ist einfach. (michael_x)

takriol

Ja, ich bin gerade etwas erschlagen von den vielen Dingen die ich noch vor mir habe.
Das mit dem Serial.begin(115200) und Serial.print läuft irgendwie auch nicht so recht. Da kommt nur der Fehler, dass es einen Fehler beim Hochladen gab, aber kein Fehlercode oder sowas.

noiasca

dann geb' ich dir noch etwas Zeit.

https://www.arduino.cc/en/Tutorial/DigitalReadSerial das wäre ein ganz einfaches Beispiel so wie es von Arduino kommt...

Kannst das nachbauen, hochladen und testen?
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

takriol

Danke, sowas ähnliches mit ner LED zwischen 5V und Taster hatte ich schon als Video gefunden, das zu adaptieren hat aber wie gesagt nicht geklappt.

michael_x

Quote
schon als Video gefunden, das zu adaptieren hat aber wie gesagt nicht geklappt.
Ein Video das zeigt wie toll etwas ist, ist manchmal nicht als Bauanleitung gedacht, sondern will zeigen, dass der Video-Ersteller stolz drauf ist, was er hingekriegt hat.

Eine Fehlerbeschreibung die nur besagt dass etwas nicht klappt, ruft oft noch nicht mal Beileidsbekundungen hervor.

Das bisherige zeigt mir nicht, dass du die Voraussetzungen hingekriegt hast:
1 Taster - 1 Buzzer - Taste gedrückt: Buzzer tönt 1 sec
( Wenn das klappt, wissen wir, dass du einen Taster und den Buzzer richtig anschließen kannst, und brauchen dir nichts von Pulldown-Widerständen erzählen. )
Dann kannst du einen zweiten Taster und 2 LED anschließen und den Sketch erweitern.
Wenn der nicht genau tut was du willst, kannst du erzählen was genau passiert und wir sehen weiter
(wenn du Glück hast, erklärt dir jemand warum genau das passiert was du programmiert hast).
Wenn nicht: Geht denn wenigstens der vorige Sketch noch (erste Taste gedrückt: Buzzer tönt 1 sec) ?

Noch ein Tip:
Wenn die LED auch nur solange leuchten soll wie der Buzzer tönt (1 sec) und egal ist, was währenddessen und danach passiert, kannst du dir das Ganze mit einem delay(1000); ganz einfach machen; selbst wenn du schon irgendwo gelesen hast, dass delay nicht gut ist wenn in einem Sketch Taster erfasst werden sollen. (Das Taster erfassen wird bei dir dann absichtlich verhindert, und nur die erste LED leuchtet 1 Sekunde lang)

Wenn du es komplizierter haben willst (z.B. der Buzzer trötet 1 sec, aber die LED bleibt an, bis der Quizmaster sie zurücksetzt) wird es natürlich komplizierter.

Die Fleißarbeit mit 8 Tastern brauchst du erst anzufangen, wenn du das mit zweien hingekriegt hast und noch Spaß an der Sache hast. (Das wäre jedenfalls meine Vorgehensweise)


MicroBahner

Die Fleißarbeit mit 8 Tastern brauchst du erst anzufangen, wenn du das mit zweien hingekriegt hast und noch Spaß an der Sache hast. (Das wäre jedenfalls meine Vorgehensweise)
Und wenn Du dir vorher die Fleißarbeit machst, und dich ein wenig mit Arrays beschäftigst, ist die Erweiterung auf 8 Tasten dann noch nichtmal eine Fleißarbeit ;)
Gruß, Franz-Peter

noiasca

#12
Apr 05, 2020, 10:34 pm Last Edit: Apr 05, 2020, 10:36 pm by noiasca
@takriol: Ich hoffe deine Recherchen haben was ergeben.
Wenn nicht, meinen Vorschlag und eine Erklärung dazu findest du auf meiner Seite.

how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

takriol

@noiasca Danke erstmal für die umfangreiche Hilfe, ich habe zwischendurch mal ein bisschen Abstand von dem Projekt genommen. Aber jetzt habe ich wieder Lust bekommen das mal endlich fertig zu machen. Dein Sketch lässt sich bei mir leider nicht kompilieren. error: too many arguments to function 'void noTone(uint8_t)'

postmaster-ino

Hi

Dann wird der Kompiler wohl damit Recht haben.
noTone() wünscht NUR den Pin, wo der Ton eben abgeschaltet werden soll - was übergibst Du sonst noch Alles?

MfG
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

Go Up