• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Hilfe bei Arduino Programm

zaubi01

Geocacher
Hallo in die Runde,

mir geht es ähnlich wie Ranger, ich bin ein Arduino-Neuling und würde diesen Thread gerne nutzen, um das Problem bei meinem Cache einmal zu schildern:

Bei meinem Cache geht es darum, dass der Cacher einige Fragen beantworten soll, die ihm im Display angezeigt werden. Dazu gibt es je Frage vier Antwortmöglichkeiten (A bis D) und vier Drucktaster. Drückt er den korrekten Taster geht es weiter zur nächsten Frage. In der letzten Runde werden die KOs zur nächsten Station angezeigt. Soweit funktioniert alles korrekt.

Probleme gibt es, wenn der Cacher den falschen Antworttaster drückt, oder zu lange wartet (jede Frage hat eine individuelle Antwortzeit).
In der anl. Datei hatte ich ursprünglich folgendes vorgesehen:
Bei falscher Antwort sinngemäß: "Deine Antwort war falsch. Bitte drücke Taste A, um neu zu beginnen."
Bei Zeitablauf: "Die Zeit ist abgelaufen, es geht automatisch wieder los."

Das hat so aber nie 100% korrekt funktioniert. Bei falscher Antwort und Druck auf Taste A kam wieder der gleiche Text, also: "Deine Antwort ist falsch, bitte drücke Taste A" und beim Zeitablauf ging es zwar automatisch los, aber eben nicht am Start, sondern wieder mit dem Text: "Die Zeit ist abgelaufen, .....".
Die Cacher kamen also aus dieser Schleife nicht mehr heraus.

Ich habe mir so beholfen, dass ich die Antworten der wrong-message und der timeout-message abgeändert habe in: "Das war die falsche Antwort (bzw. du warst zu langsam), bitte schalte das Gerät aus und beginne nochmal von vorn."

Das klappt auch in der Praxis (den Cache gibt es seit fünf Jahren), und ich hatte mich längst damit abgefunden.
Aber als ich diesen Thread und die fachkundigen Hilfen gelesen habe, hat das doch wieder meinen Ehrgeiz geweckt, das besser zu machen.

Wenn also jemand eine Idee hat, wie ich die beiden oben beschriebenen Probleme lösen kann, wäre ich sehr dankbar.

Viele liebe Grüße und schon mal vielen Dank im Voraus

zauberer_01
 

Anhänge

  • Geocache Arduino.txt
    6,7 KB · Aufrufe: 17

capoaira

Geomaster
Moin,
ich kann dir zwar keine fachkundige Hilfe geben (was Arduino/C++ angeht, bin auch nur Anfänger), aber würde an deiner Stelle zwei globale bools setzten

C-ähnlich:
bool isAnswerWrong = false;
bool isTimeOut = false;

und dann beim Auswerten des Buttos danach auswerten:
C-ähnlich:
if (pressedButton != -1) {
      // Hier Fehler abfangen
      if (pressedButton == 0 && (isAnswerWrong || isTimeOut)) {
         questionIndex = 0;
         isAnswerWrong = false;
         isTimeOut = false;
     // Ab hier dein Code
      } else if (question->isCorrectAnswer(pressedButton)) {
        // correct answer
        questionIndex++;
        question->showCorrectMsg();
        continue;
      }
      else {
        // wrong answer
        showWrongMessage();
        isAnswerWrong = true; // Hier Flag setzten
        continue;
      }
    }

    question->printTime();

    if (question->timeout()) {
      showTimeoutMessage();
      isTimeOut = true; // Flag setzten
      continue;
    }
  }

Ich habe den Rest vom Code nur überflogen, evtl. musst du etwas mehr zum Neustart machen, als nur den questionIndex wieder auf 0 zu setzten, aber ich denke, dass das so funktionieren könnte – habe es aber nicht getestet, also keine Garantie.
 

schatzi-s

Geowizard
Spannend, Du arbeitest mit Objekten und Pointern, greifst ueber Methoden auf die Attribute zu, aber stellst so eine Frage? Meine Sketche sind genau umgekehrt ;-)

Grundsaetzlich: Zunaechst sollten die Teile, die nur am Anfang zur Initialisierung benoetigt werden ins Setup() (fiel mir hier speziell bei Startup() auf).

Du hast eine Endlosschleife, die bereits innerhalb einer Endlosschleife (loop()) abgearbeitet wird. Sie kuemmerst sich um das Setzen der aktuellen Frage, die Tastaturabfrage und die Fehlerbehandlung ... das waere mir zu viel, daher wuerde ich das Ganze umstellen:

In Pseudopseudocode:

aktuelleFrage auf 1 setzen,
Begruessung auf Bildschirm schreiben
Wiederhole // zum Verarbeiten der Fragen
Stelle Frage auf Bildschirm dar
allesok = false
Wiederhole // fuer die Eingabe
WarteAufTaste
Bis Taste gedrueckt oder Timeout
Wenn Timeout
FehlerausgabeTimeout
sonstwenn falscheAntwort
FehlerausgabeFalscheAntwort
sonst
allesOk = true
aktuelleFrage++
bis nicht allesok oder aktuelleFrage > MaxFragen
wenn aktuelleFrage > MaxFragen
AusgabeAllesrichtigUndEnde
exit (0)

exit(0) ist nur wichtig, wenn das Ganze in der Loop Schleife steht, da das Spiel sonst von vorne beginnen wuerde (was vielleicht auch nicht schlecht ist).
wenn das Ganze aus dem Setup() aufgerufen wird, wird es nur einmal durchlaufen und man braucht das Programm nicht so zu beenden

Ich habe mal ein aehnliches Quiz programmiert
https://www.geocaching.com/geocache/GC5KY7F
das laeuft allerdings mit Touchscreen und Ton und stellt auch Bilder dar. Programmtechnisch ist der Hauptunterschied jedoch, dass der Cacher zwar auch nur 4 Fragen gestellt bekommt, aber die zufaellig aus einem Pool von deutlich mehr Fragen ausgewaehlt werden. Das waere vielleicht auch eine Option fuer Dich? Es ist spannender, wenn beim zweiten Versuch nicht die selben Fragen kommen.
 

schatzi-s

Geowizard
kurzes Update, da ich gestern kurz (?) unkonzentriert war: Natuerlich muss das Ganze in der Loop laufen, schliesslich soll es ja so lange laufen, bis der Cacher alles richtig beantwortet, bzw. aufgegeben hat :)
 
OP
Z

zaubi01

Geocacher
Hallo zusammen,
vielen Dank schon mal für eure Hinweise.

Ich habe mal ein aehnliches Quiz programmiert
https://www.geocaching.com/geocache/GC5KY7F
das laeuft allerdings mit Touchscreen und Ton und stellt auch Bilder dar. Programmtechnisch ist der Hauptunterschied jedoch, dass der Cacher zwar auch nur 4 Fragen gestellt bekommt, aber die zufaellig aus einem Pool von deutlich mehr Fragen ausgewaehlt werden. Das waere vielleicht auch eine Option fuer Dich? Es ist spannender, wenn beim zweiten Versuch nicht die selben Fragen kommen.
Schade, leider etwas zu weit weg für einen kurzen Besuch, klingt echt toll. (y)
Das mit dem Fragenpool hatte ich auch erst überlegt, mich dann aber bewusst dagegen entschieden. Ich wollte es den Cachern nicht zu schwer machen und außerdem zwei der Fragen immer dabei haben. Desweiteren ist dort, wo diese ZS steht die Möglichkeit von vor-Ort-Fragen begrenzt. Aber interessant, dass wir da denselben Gedankengang hatten.

Ich werde mal schauen, ob ich die Muße finde, die ZS abzubauen und das Coding zu verändern. :unsure:
Für einen möglichen neuen Arduino-Cache nehme ich mir das aber als guten Vorsatz mit auf den Weg. :D

Vielen Dank nochmals.
 

schatzi-s

Geowizard
Dass nur ein Teil der Fragen zufaellig sein soll, hatte ich mir anhand Deiner Fragen schon gedacht.
Wobei eine Kombination aus zufaelligen und garantierten vorkommenden Fragen natuerlich kein Problem waere. Zur Not kann man auch einfach die Reihenfolge wechseln. Moeglichkeiten gibt es viele :)
Abbauen und umprogrammieren? Hast Du die Hardware nicht auch noch als Backup zuhause?

200km sind fuer den einen Cache vielleicht etwas viel, aber es gibt hier ja noch andere schoene Dosen und der Tourismus boomt in Bremen auch unter Nicht-Cachern ;-)
 
Oben