HILFE Arduino Programm

Moin,

ich bin in der Ausbildung und muss ein Programm für die IdeenExpo schreiben.
Es soll einen Buzzer geben der das Spiel von 30sec startet, in dieser Zeit soll durch einen Zufallsgenerator eine der 3 Led’s angehen, diese lässt sich durch (Spieler1Taster1, Spieler2Taster1) ausschalten und eine zufällige andere Led soll angehen bis die Zeit abgelaufen ist.

Dieses Programm ist jetzt nur für den Abschnitt des Zufallsgenerators gedacht.

Ich habe schon mehrere Foren durchgeschaut aber kann nichts finden das mir hilft…

const int ledPin = 13;
const int Buzzer = 2;
const int Spieler1Taster1 = 3;
const int Spieler1Taster2 = 4;
const int Spieler1Taster3 = 5;
const int Spieler2Taster1 = 6;
const int Spieler2Taster2 = 8;
const int Spieler2Taster3 = 9;
const int Zufall1 = 10;
const int Zufall2 = 11;
const int Zufall3 = 12;

int taster = 0;
int letztertaster = 0;
int zufall = 0;
volatile int los = LOW; //Alle Variablen die über einen Interrupt gesteuert werden sollten als volatile bezeichnet werden.
void setup() {
// Angeben welche Pins ein und Ausgabe sind
randomSeed(millis());

pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);

attachInterrupt(0, start, RISING); //DigitalPin 2 ist der Interrupt-Pin 0 also statt Pin9, Pin2 einstecken. Dieser Pin wird dauerhaft überwacht…
}

void loop() {

if (los==HIGH) { //Wenn Knopf gedrückt wurde…

for (int q=0;q<3;q++) {
zufall = random(3)+1;
switch (zufall) {

break;
case 1: // Zahl anzeigen
digitalWrite(10, HIGH); // set the LED on
digitalWrite(11, LOW); // set the LED off
digitalWrite(12, LOW); // set the LED off
break;

case 2: // Zahl anzeigen
digitalWrite(10, LOW); // set the LED off
digitalWrite(11, HIGH); // set the LED on
digitalWrite(12, LOW); // set the LED off
break;

case 3: // Zahl anzeigen
digitalWrite(10, LOW); // set the LED off
digitalWrite(11, LOW); // set the LED off
digitalWrite(12, HIGH); // set the LED on
break;

};

}
los = LOW; //Variable für den nächsten Knopfdruck vorbereiten

}
}
void start()
{
los = !los;
}

Danke schonmal im Vorraus für eure Tipps, Hilfe

Aha!

  1. Was ist deine Frage? Hast du die vergessen?
  2. Warum ist “los” int, und nicht bool?

beginner458: Danke schonmal im Vorraus für eure Tipps, Hilfe

Mit dem Zufall ist das auf einem Mikrocontroller so eine Sache: Der hat einen Pseudo-Zufallszahlengenerator eingebaut. Zwar sind die damit erzeugten Zufallszahlen einigermaßen zufällig verteilt, ABER: Der Startwert des Zahlengenerators ist nach jedem Reset oder Neustart des Programms nach dem Power-On derselbe, und wenn Du nicht aufpaßt, bekommst Du JEDES MAL nach einem Reset im Spielverlauf GENAU DIESELBEN "Zufallszahlen. In jeder Runde exakt dieselbe Abfolge.

Bei interaktiven Spielen läßt sich das leicht vermeiden und ein "wirklich zufälliger Ablauf" dadurch erzielen, dass Du den "ZEITPUNKT DER ERSTEN NUTZERAKTION" zum Initialisieren des Pseudo-Zufallszahlengenerators verwendest, also beispielsweise den Zeitpunkt des ersten Tastendrucks im Spiel in Mikrosekunden.

Selbst ein geübter Spieler wird es wohl kaum schaffen, in mehreren Spielrunden nacheinander einen Knopf in genau derselben Mikrosekunde zu drücken, deshalb machst Du am besten das nach jedem "Reset" des Controllers:

  • direkt beim ersten Tastendruck randomSeed(micros)); // Zufallszahlengenerator initialisieren

Und Du beginnst ERST NACH dem ersten Tastendruck mit dem Generieren von Zufallszahlen, die dann wirklich zufällig sind und nicht immer in derselben Ablauffolge kommen.

Außerdem würdest Du Dir, wenn mit dem ersten Tastendruck eine Spieldauer beginnen soll, den Zeitpunkt merken müssen, zum Beispiel als unsigned long in Millisekunden seit Reset:

unsigned long startZeit=millis(); // beim ersten Buzzern Zeit merken

Dann kannst Du später im Spiel jederzeit feststellen, wie lange das Spiel schon läuft, bzw. ob die Spieldauer abgelaufen ist:

if (millis()-startZeit>=30000) ... // testen auf Ablauf der 30-Sekunden-Spieldauer im Spiel

Code bitte in Code Tags </> einschließen.

Wozu hat ein Arduino ein EEPROM? Darin kann man die letzte “seed” für den Randomgenerator speichern, beim nächsten Start auslesen, erhöhen und zurückschreiben.

Den Interrupt braucht es überhaupt nicht, den Taster kann man auch Pollen. So wie das momentan programmiert ist, ist es reine Glückssache, was das Programm beim Drücken der Starttaste macht.

Für das Ein-/Auschalten reicht eine LED Pin-Nummer, die also zwischen 10 und 12 liegt. Dazu eine Variable, in der die gerade eingeschaltete LED gespeichert ist. Beim Wechseln diesen Ausgang abschalten, neu würfeln, Pin-Numer merken und einschalten.

Stichworte: random(min,max), randomSeed

So wie das momentan programmiert ist, ist es reine Glückssache, was das Programm beim Drücken der Starttaste macht.

Das ist doch hier auch gewünscht! Prellzahl als Unterstützung des RandomGenerators ist für die praktische Anwendung doch ok, oder?

beginner458: eine der 3 Led's angehen, diese lässt sich durch (Spieler1Taster1, Spieler2Taster1) ausschalten

Rückfrage zu Deiner Ablaufbeschreibung: Sind die Taster1 Tastendrücke der beiden Spieler alternativ? Oder kumulativ?

Also reicht es aus, wenn einer der beiden Spieler seinen eigenen Taster1 drückt, damit die LED aus- und eine andere oder dieselbe nach dem Zufallsprinzip wieder angeht?

Oder müssen erst BEIDE Spieler ihren eigenen Taster1 jeweils einmal drücken, und erst wenn der zweite Spieler seinen Taster1 gedrückt hat, geht es weiter?

Bonusfrage: Warum hat jeder der beiden Spieler drei Taster (insgesamt sechs Tastschalter), wenn im gesamten Spielablauf immer nur Taster1 von jedem Spieler verwendet wird (insgesamt zwei Tastschalter)?

michael_x: Prellzahl als Unterstützung des RandomGenerators ist für die praktische Anwendung doch ok, oder?

Was nützt die Prellzahl, wenn das Spiel dann nicht startet?