Ich programmiere das Spiel Roulette und auf Tasterdruck soll eine Zahl zwischen 1 und 6 geschrieben werden, auf Tasterdruck passiert aber nichts

int LED1=1;
int LED2=2;
int LED3=3;
int LED4=4;
int LED5=5;
int LED6=6;
int Taster=7;
int x;

void setup(){
pinMode(Taster, INPUT_PULLUP);
Serial.begin(9600);
randomSeed(analogRead(A1));
}
void loop(){
digitalRead(Taster);

if(Taster==0){
x=random(1,7);
Serial.println(x);
}

}

Und jetzt bitte nochmal langsam und ausführlich, mit Code in Code Tags </> damit er lesbar bleibt.

Dann stelle eine Frage, die sich beantworten läßt. Bislang kann ich nur sagen, daß Roulette Zahlen zwischen 0 und 36 kennt.

Hallo, was meinst du mit diesen Code Tags? Ich bin nämlich neu hier, tut mir leid.

grafik

Das ist eine schlechte Wahl wenn die serielle Schnittstelle verwendet wird.

digitalRead(Taster);

Du verwechselst den Pin und die Zustands-Variable

Willkommen im Forum! Damit einem schnell und mit geringem Aufwand geholfen werden kann, gibt es ein paar Regeln, die man sich anschauen und einhalten sollte, um Frust (bei Dritten und sich selbst :wink: ) zu vermeiden.

a) Code/Sketche bitte zwischen "Code-Tags" posten. Das Ergebnis sieht dann so aus wie hier:

int LED1=1;
int LED2=2;
int LED3=3;
int LED4=4;
int LED5=5;
int LED6=6;
int Taster=7;
int x;

void setup(){
pinMode(Taster, INPUT_PULLUP);
Serial.begin(9600);
randomSeed(analogRead(A1));
}
void loop(){
digitalRead(Taster);

if(Taster==0){
x=random(1,7);
Serial.println(x);
}

}

Es lässt sich besser lesen und deutlich einfacher kopieren und analysieren.

Übrigens noch besser, wenn man vorher in der IDE automatisch formatieren lässt:

int LED1 = 1;
int LED2 = 2;
int LED3 = 3;
int LED4 = 4;
int LED5 = 5;
int LED6 = 6;
int Taster = 7;
int x;

void setup() {
  pinMode(Taster, INPUT_PULLUP);
  Serial.begin(9600);
  randomSeed(analogRead(A1));
}
void loop() {
  digitalRead(Taster);

  if (Taster == 0) {
    x = random(1, 7);
    Serial.println(x);
  }

}

Der einfachste Weg dazu ist, in der Arduino IDE den Sketch markieren, mit dem Menüpunkt "Automatische Formatierung"

image

formatiert und dann mit dem Menüpunkt "Für Forum kopieren" über die Zwischenablage in den Post einfügen:

image

Alternativ kann man die Code-Tags im Editor erzeugen, indem man diese Schaltfläche anklickt und den Sketch zwischen den Tags einfügt:
image

Letztlich kann man auch

[code] vor den Sketch

und

[/code] hinter den Sketch

schreiben ...

b) Die Aufgabenstellung ausreichend im Post beschreiben:

  • Hardware-Aufbau
  • Gewünschtes Ergebnis

An Deinem Programm ist zu erkennen, dass Dir noch ganze Reihe grundlegender Kenntnisse bzgl. der Anwendung eines Arduino-Prozessors fehlen. Hier ein paar Beispiele dazu:

  • Eine der LEDs (LED1) verwendet den selben Pin, der intern für die serielle Schnittstelle eingesetzt wird (siehe auch Post #5 von @wno158). Im aktuellen Sketch steuerst Du keine LED an, insofern ist das (noch) kein Problem.
  • In der loop() wird mit digitalRead(Taster) zwar der aktuelle Status des Pins ausgelesen, jedoch keiner Variablen zugewiesen. Das Ergebnis der Abfrage "verpufft" sozusagen ... Die Variable "Taster" als Argument von digitalRead() erhält nämlich nicht das Ergebnis der Abfrage, sondern zeigt dem Compiler auf, an welchem Pin des Arduino der Taster angeschlossen sein sollte.
  • Da "Taster=7" gesetzt ist, ist das Ergebnis der if-Abfrage "(Taster==0)" immer falsch, denn 7 ist ungleich Null.

Da ich vermute, dass Du das Programmieren erlernen willst, empfehle ich Dir, diese hervorragende PDF herunterzuladen, zu lesen und Stück für Stück auszuprobieren:

https://www.arduinoforum.de/referenz.php

Die meisten Deiner jetzigen Probleme wirst Du danach lächelnd beseitigen können :wink:

Wie bereits gesagt:

Du mußt den vom Taster ausgelesenen Wert in einer Variable speichen und diese im IF kontrollieren oder das Auslesen des Taster-Pins im IF machen.

Also

StatusTaster =  digitalRead(Taster);
if ( Statustaster == 0)

oder

if ( digitalRead(Taster) == 0)

Außerdem sollte Pin 1 nicht verwendet werden da daran die serielle Schnittstelle hängt.

Damit die einzelnen LEDs einfach angesteuert werden können und kein Speghetticode daraus wird sollten für die LED-Pins in einer Array-Variablen abgespeichert werden.

Außerdem solltest Du daran denken statt der einfachen LED LED mit Controller wie die WS2812 zu verwenden.

Grüße Uwe

Probiere mal den Code:

  int LED1=2;
  int LED2=3;
  int LED3=4;
  int LED4=5;
  int LED5=6;
  int LED6=7;
  int Taster = 8;
  int x;

void setup() {
  pinMode(Taster, INPUT_PULLUP);
  Serial.begin(9600);
  randomSeed(analogRead(A1));
}
void loop() {
  if (digitalRead(Taster)  == 0) {
    x = random(1, 7);
    Serial.println(x);
  }

}

Dein Code funktioniert nicht, weil bei der Codezeile:

digitalRead(Taster);

zwar der Taster ausgelesen wird, das Ergebnis jedoch nicht abgespeichert wird.
und bei der Codezeile:

if (Taster  == 0)

wird überprüft, ob die Variable Taster den wert 0 hat.
(in diesem Fall hat sie den Wert 7).
(Siehe Codezeile:

int Taster = 7;

)

Du konntest auch das Programm so schreiben:

  int LED1=1;
  int LED2=2;
  int LED3=3;
  int LED4=4;
  int LED5=5;
  int LED6=6;
  int Taster = 7;
  int x;
  int w;

void setup() {
  pinMode(Taster, INPUT_PULLUP);
  Serial.begin(9600);
  randomSeed(analogRead(A1));
}
void loop() {
  w = digitalRead(Taster);
  
  if (w  == 0) {
    x = random(1, 7);
    Serial.println(x);
  }

}

Ich hoffe ich konnte helfen.
Gruß Frenik

Hallo gustav87
Hier kommt ein einfaches Beispiel für dein Roulettespiel.
Zur Zeit ist das Beispiel auf fünf Leds begrenzt. Es lassen sich einfach die weiteren Leds hinzufügen ohne den Sketch dafür zu ändern.

// add more LEDs if required 
constexpr byte LedPins[] {8,9,10,11,12}; 
constexpr byte ButtonPin {A0}; 
void setup() {
  for (auto LedPin:LedPins) pinMode(LedPin,OUTPUT); 
  pinMode(ButtonPin,INPUT_PULLUP);
  
}
void loop() {
  if (digitalRead(ButtonPin)) {
    for (auto LedPin:LedPins) digitalWrite(LedPin,LOW); 
    digitalWrite (LedPins[random(0,sizeof(LedPins))],HIGH); 
    delay (50);
  }
}

Ich wünsche einen geschmeidigen Tag und viel Spass beim Programmieren in C++.

Eine sehr elegante Lösung und deshalb auch gleich mal hier zum Anschauen:

https://wokwi.com/projects/333720171386503763

Und natürlich auch zum Ausprobieren kleiner Änderungen :wink:

Schreibt man in der loop()

if (!digitalRead(ButtonPin)) { ...

so "würfelt" der Sketch nur solange, wie die Taste gedrückt wird. Man könnte auch auf Tastendruck eine Zufallszeit generieren und den Sketch dann für diese Zeit "würfeln" lassen ... Der Fantasie sind keine Grenzen gesetzt (anders als dem verfügbaren RAM :wink: ).

(Kleiner Tipp für Wokwi: Wenn man den Mauszeiger bei gedrückter Taste von der Taste wegzieht, bleibt der Taster im betätigten Zustand ...)

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.