Kann mir jemand bei diesem Code weiterhelfen?

Hey, ich bin noch relativ neu im Bereich Arduino etc. und komme bei folgendem nicht weiter.

Die Aufgabe besteht darin folgende Schaltung aufzubauen und zu programmieren:

Mein bisheriger Ansatz sieht so aus:

const int red = 5; //Pin Zuweisung
const int green = 6;
const int Taster = 9;

int highscore = 0; //Variable für den Highscore

void setup(){

pinMode(red, OUTPUT);
pinMode(green, OUTPUT);
pinMode(Taster, INPUT_PULLUP);

Serial.begin(9600);

}

void loop(){

//rote LED geht für 3 Sekunden an
digitalWrite(red, HIGH);
delay(3000);
digitalWrite(red, LOW);

//rote LED aus und grün geht an
digitalWrite(green, HIGH);

//Variablen für die verschiedenen Werte
int anzahl = 0;
int zustand = digitalRead(Taster);
int ende = millis() + 10000;

do {
delay(1);
int neuerZustand = digitalRead(Taster);
if (zustand != neuerZustand){
anzahl = anzahl+1;
zustand = neuerZustand;
}while(millis() < ende);
}

digitalWrite(green, LOW);

if(anzahl > highscore){

highscore = anzahl;
Serial.println("Neuer Highscore!");
}else{ Serial.println("Kein Highscore"); }

Serial.println(anzahl);
delay(5000);
}

Ab dem Blau eingekreisten Teil wird es jedoch ein bisschen Chaotisch und ich bin mir nicht sicher wie ich das korrekt machen soll. Daher wäre es super wenn mir jemand helfen könnte und dabei auch auf die Fehler eingehen könnte, sprich diese erläutert :]

Schonmal Danke im Voraus.

Ich behaupte, das führt ins Versagen!

  • int ist signed
  • int dürfte zu klein sein
  • +1000 kann/wird zu einem Überlauf führen

Tipp: Die "Nachtwächter Erklärung" lesen

1 Like

do {

Ach, ist ja noch ein Einstieg vorher - ich bin davon ausgegangen, das der umrandete Teil dein loop sein soll... Nagut.

Aber so umfanngreich ist es nicht.

const int red = 5; ist gut weil DU schon const genommen hast, ich würde die als byte deklarieren.

int highscore = 0; kannst Du mit dem HS negativ werden? Nein? Dann mach daraus ein unsigned int.
Das dann auch bei allen anderen Zahlen.

int zustand - Zustand (und auch alle anderen Zustand-Vars) soll nur zwei Werte annehmen. Dafür reicht ein bool

Das mit den Millis und der nachwächtergeschichte hast Du schon.

Ich würde das aber gänzlich anders bauen.
Schau Dir dazu switch / case: an.
Das geht dann auch ohne delay() und wenn Dir eine Zusatzaufgabe gestellt wird, zwischenzeitlich noch was anderes zu machen kannst Du das einbauen ohne den Code umschreiben zu müssen.

Kleine Nachtlektüre für den Anfang:
https://www.arduinoforum.de/code-referenz
Dort das pdf runterladen und einfach nur durchlesen. Dann weisst Du wo Du das wichtigste findest :wink:

1 Like
  1. Die IDE bietet die Möglichkeit, Programmtext mittels Strg+t zu formatieren.
  2. Die Forensoftware bietet die Möglichkeit, Programmtext mit code-Tags einzubinden.

Bitte nutze beide Möglichkeiten!

Du hast Dich bei den Klammern vertan, besser so:

  do 
  {
    delay(1);
    bool neuerZustand = digitalRead(Taster);
    if (zustand != neuerZustand) 
    {
      anzahl = anzahl + 1;
      zustand = neuerZustand;
    }
  } while (millis() < ende);

Zusammen mit den anderen Hinweise funktioniert Dein Programm :slightly_smiling_face:

1 Like

Danke, hat mir sehr weitergeholfen und das Programm funktioniert nun super :]

PS: Das mit dem Formatieren war nicht beabsichtigt, hatte es auch eigentlich anderst formatiert aber beim kopieren wurde es scheinbar alles an den Rand gedrückt aber danke für die Hinweise :]

OK scheinbar klappt es doch noch nicht ganz. Sobald das Spiel startet funktioniert der durchlauf 3x und dann nicht mehr. Sprich ab dem 4. Durchlauf sieht es so aus:

LED Rot geht an für ein paar sekunden
LED grün geht für einen mini augenblick an (blinkt also nur ganz kurz) und dann geht es so von vorne los also man hat gar keine zeit den Taster zu drücken. Ich habe jz mal versucht aus allen Antworten hier die Lösungen raus zu picken aber scheinbar hab ich was falsch gemacht hehe.

Der Code sieht aktuell wie folgt aus:

> const byte red = 2; //Pin Zuweisung
> const byte green = 3;
> const byte Taster = 9;
> 
> unsigned int highscore = 0; //Variable für den Highscore
> 
> 
> 
> void setup() {
> 
>   pinMode(red, OUTPUT);
>   pinMode(green, OUTPUT);
>   pinMode(Taster, INPUT_PULLUP);
> 
>   Serial.begin(9600);
> 
> }
> 
> void loop() {
> 
>   //rote LED geht für 3 Sekunden an
>   digitalWrite(red, HIGH);
>   delay(3000);
>   digitalWrite(red, LOW);
> 
>   //rote LED aus und grün geht an
>   digitalWrite(green, HIGH);
> 
>   //Variablen für die verschiedenen Werte
>   unsigned int anzahl = 0;
>   unsigned int zustand = digitalRead(Taster);
>   unsigned int ende = millis() + 10000;
> 
>   do
>   {
>     delay(1);
>     bool neuerZustand = digitalRead(Taster);
>     if (zustand != neuerZustand)
>     {
>       anzahl = anzahl + 1;
>       zustand = neuerZustand;
>     }
>   } while (millis() < ende);
> 
>   digitalWrite(green, LOW);
> 
>   if (anzahl > highscore) {
> 
>     highscore = anzahl;
>     Serial.println("Neuer Highscore!");
>   } else {
>     Serial.println("Kein Highscore");
>   }
> 
>   Serial.println(anzahl);
>   delay(5000);
> }

Danke für die Rückmeldung :slightly_smiling_face:

Du kannst Deinen ersten Beitrag noch ändern und die code-Tags [code]Dein Programm [/code] einfügen.

Hier nochmal zum veranschaulichen was nach dem 3. Durchlauf passiert (Habs mal auf YT hochgeladen weil man hier keine Videos anhängen kann, hoffe das passt) :

Wer soll sich denn das antuen? Warum hast Du da > vorne dran?
Und was von dem, was Dir mitgeteilt wurde hast Du denn umgesetzt?
NICHTS!
Der Taster ist noch immer kein bool, das millis()gedöhns noch immer hingerotzt.
Ganz ehrlich?
Ich fühl mich angesichts #3 verarscht.
Und ja, die Lösung liegt genau da.

Konstruktive Kritik ist was anderes :wink:, musst es dir ja nicht antuen (Die > kamen wohl weil ich mich bei der formatierung im forum verklickt habe). Wenn du Probleme hast kannst du gerne jederzeit gehen anstatt dich gleich aufzuregen. Der sinn hinter so einer Frage in einem Frageforum ist nicht, Neueinsteiger anzumaulen weil sie Fehler machen die ihnen evtl. nicht bewusst sind. Die meisten dieser Befehle & Variablen habe ich bisher noch nicht kennengelernt also muss ich halt ein bisschen rumprobieren. Soweit habe ich versucht alles aus deinem Text einzubauen (die const ints sind jetzt als byte deklariert, dass mit dem unsigned habe ich dann eben evtl. missverstanden falls es nicht bei allen unten stehen soll und das mit dem bool hab ich wohl überlesen. Und da ich dann lieber auf den höflichen Text von agmue eingehe und es damit versuche anstatt mir einen seitenlangen Thread über ein Nachtwächter code durchzulesen aus dem ich weniger schlau werde ist das mit den millis wohl immernoch da, korrekt. Also anstatt direkt so blöd zu kommen könntest du auch einfach versuchen einen Gegenvorschlag zu bringen oder in einem normaleren Ton erklären, was ich falsch gemacht habe :]

1 Like

So, diesmal ohne > und schön formatiert, damit du es dir ggf. auch antuen kannst. Der Taster (z. 31) ist jetzt mit bool deklariert (ich denke mal der ganz oben muss ja nur byte bleiben als zuweisung für den Pin). Das millis() gedöhns steht immernoch drin aber jetzt mit ner long vars weil ich nicht dahinter komme wie ich das sonst machen soll (darauf könntest du gerne eingehen, um dem Neuling zu helfen :smiley: ).

const byte red = 2; //Pin Zuweisung
const byte green = 3;
const byte Taster = 9;

unsigned int highscore = 0; //Variable für den Highscore



void setup() {

  pinMode(red, OUTPUT);
  pinMode(green, OUTPUT);
  pinMode(Taster, INPUT_PULLUP);

  Serial.begin(9600);

}

void loop() {

  //rote LED geht für 3 Sekunden an
  digitalWrite(red, HIGH);
  delay(3000);
  digitalWrite(red, LOW);

  //rote LED aus und grün geht an
  digitalWrite(green, HIGH);

  //Variablen für die verschiedenen Werte
  unsigned int anzahl = 0;
  bool zustand = digitalRead(Taster);
  unsigned long ende = millis() + 10000;

  do
  {
    delay(1);
    bool neuerZustand = digitalRead(Taster);
    if (zustand != neuerZustand)
    {
      anzahl = anzahl + 1;
      zustand = neuerZustand;
    }
  } while (millis() < ende);

  digitalWrite(green, LOW);

  if (anzahl > highscore) {

    highscore = anzahl;
    Serial.println("Neuer Highscore!");
  } else {
    Serial.println("Kein Highscore");
  }

  Serial.println(anzahl);
  delay(5000);
}

Hallo
beschreibe in einfachen Worten und Sätzen wie die Funktion wirken soll und das ganz einfach.

Also grundlegend wurde die Aufgabe glaube ich Flipper Schaltung genannt.

Die Funktion besteht darin:

  • Am Anfang leuchtet die rote LED für einige Sekunden.
  • Sobald die grüne angeht soll man den Taster so oft drücken wie man kann.
  • Nachdem die grüne LED aus ist wird der Highscore im Monitor angezeigt bzw. die nachricht dass er nicht erreicht wurde und die Schaltung beginnt von vorne. (Siehe auch obiges Bild zum Ablaufplan)

Hoffe das hilft dir :]

const byte red = 2; //Pin Zuweisung
const byte green = 3;
const byte Taster = 9;

//Variablen für die verschiedenen Werte
unsigned int anzahl = 0;
bool zustand = false;
bool neuerZustand = false;
const unsigned long umlaufzeit = 10000;
unsigned long startzeit = 0;
unsigned int highscore = 0; //Variable für den Highscore

void setup() {
  Serial.begin(9600);
  pinMode(red, OUTPUT);
  pinMode(green, OUTPUT);
  pinMode(Taster, INPUT_PULLUP);
}

void loop() {
  //rote LED geht für 3 Sekunden an
  digitalWrite(red, HIGH);
  delay(3000);
  digitalWrite(red, LOW);

  //rote LED aus und grün geht an
  digitalWrite(green, HIGH);

  //Variablen für die verschiedenen Werte
  anzahl = 0;
  zustand = digitalRead(Taster);
  startzeit = millis();
  do
  {
    delay(1);
    neuerZustand = digitalRead(Taster);
    if (zustand != neuerZustand)
    {
      anzahl = anzahl + 1;
      zustand = neuerZustand;
    }
  } while (millis() - startzeit < umlaufzeit);

  digitalWrite(green, LOW);

  if (anzahl > highscore) {

    highscore = anzahl;
    Serial.println("Neuer Highscore!");
  } else {
    Serial.println("Kein Highscore");
  }

  Serial.println(anzahl);
  delay(5000);
}
1 Like

Danke für die Rückmeldung. Jetzt verstehe ich auch endlich was du meintest :]

Ab dem 4. Durchlauf

... geht es schief, wenn ende noch nicht als unsigned long definiert war...

Könntest ja mal das neu festgelegte ende auf Serial ausgeben, um zu sehen, dass es jedesmal um 18000 größer wird.

Dass es nach 49 Tagen Dauerbetrieb wieder Probleme gibt, sollte bei dieser "Anwendung" egal sein...

1 Like

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