Rechnen mit dem Arduino

Hallo zusammen.

Ich möchte eine Apertur bauen, bei der zwei zufällige Zahlen zwischen 1 und 20 ausgelost, und anschließend miteinander verrechnet werden. Hierzu habe ich nun den Arduino Uno mit einem I2C Display und einem Tastenfeld verbunden.

Nun habe ich gleich zwei Probleme.

Zum einen weiß ich leider nicht, wie ich in meinem Programm mit dem Tastenfeld ein "Ergebnis" eingeben kann, dass bis zu drei Stellen hat.

Das andere Problem ist, dass ich nun schonmal eine einfachere Version programmiert habe, mir allerdings immer angezeigt wird, dass das Ergebnis falsch ist, auch wenn ich das richtige eingebe.

Unten habe ich einmal das verlinkt, was ich bis jetzt schon habe.
Würde mich über Lösungen meiner Probleme und auch Verbesserungsvorschläge am Programm sehr freuen.

Danke schonmal im Voraus!

Test_zufall.ino (4.69 KB)

Und was für eine Hausaufgabe ist das ?

Und setze deinen Sketch bitte direkt ins Forum.
Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Dann können alle den Sketch besser lesen.
Auch die mobilen User.

Setze Deinen Sketch bitte in Codetags (</>-Button oben links im Forumseditor), dann ist er für alle fut lesbar.

Für die Eingabe hast Du 2 Möglichkeiten:

  1. Du gibst immer 3 Ziffern mit führender 0 ein
  2. Du nimmst ein Zeichen auf Deinem Tastenfeld, das keine Ziffer ist (z.B. '#') und benutzt das als Kennzeichen, dass Du fertig mit der Eingabe bist (wie auf dem PC.

Pseudocode:

int zahl = 0;
...

// im loop:
char c = eingabeTastenfeld();
if (c == '#') {
  // Zahl ist eingegeben
  // mache etwas mit der Zahl
  zahl = 0;  // zurücksetzen
}
else {
  // Ziffer
  int z = c - '0'; // um vom Zeichen zur Ziffer zu kommen
  zahl = zahl * 10 + z; // So wie wenn Du eine Zahl schrittweise betrachtest
}
...

Fehlerhafte Tasten (alles außer # und Ziffern) werden nicht abgefangen

Gruß Tommy

Hi

Kleiner Tip:
Gewöhne Dir an, sinnvolle Kommentare zu schreiben.

delay(4000);       // es wird 5 Sekunden gewartet

Hier passt was nicht (ausnahmsweise meine ich nicht das delay() ... aber Ja, Das ist auch böse)

Auch 'sieht' der geneigte Quellcode-Leser die 16 und die 2 bei der Initialisierung des Display
Dann muß nicht im Kommentar drin stehen, daß Das ein 16x2 Display ist (spätestens, wenn's auf 40x4 aufgepumpt wird, passt wieder Nichts - Größe des Display in Zeichen x Spalten sagt genau das Gleiche, ist aber 'universaler'.

Zwischen allen Befehlen eine Leerzeile ... wem's gefällt ...

In der IDE STRG+T drücken - damit wird der Sketch eingerückt (auch prima um Klammerfehler zu finden)

Sinnvoller als der Kommentar zum LCD '// Display 1 als lcd1 benannt, die Adresse angegeben „0x3F“ und' wäre die Zahlenwurst auseinander zu bringen - was bedeutet welche Zahl??
Das ab nun 'lcd1' Dein LCD ist und im I²C-Bus auf die Adresse 0x3F hört, ist jedem Leser klar - die Zahlenwurst aber wohl selbst eingesessenen Proggern hier nicht.
(Wobei es einen ganzen Wust der LiquidCrystal_I2C gibt und/oder Diese verschiedene Aufrufarten unterstützt)

Die Quelle der verwendeten Libs solltest Du auch für Dich mithalten - in einem halben Jahr wird dieser Sketch nicht mehr kompilieren, da eine der LIBs in einer neueren Version vorliegt und dieser Aufruf ersatzlos gestrichen wurde.

Soll erst Mal reichen - zumindest hast Du viele Kommentare drin - und dieses Mal sogar in Muttersprache ... Träne wegwisch :wink:

MfG

Anstelle des Textes würde ich mir die Variablen c und d ausgeben lassen.

Aus der Beschreibung: "char getKey()"

Daher enthält pressedKey = myKeypad.getKey(); den gedrückten Buchstaben, beispielsweise "1". Als Zahl ist das 49 oder 0x31. Siehe #2.

postmaster-ino:
In der IDE STRG+T drücken - damit wird der Sketch eingerückt (auch prima um Klammerfehler zu finden)

Das Blöde an Strg-T ist, dass eigene Formatierungen gnadenlos zerstört werden.

Wer z. B. sowas macht:

switch(...)
{
  case 1:  bla; blubb; break;
  case 2:  blaa; blubbbb; break
  default: break;
}

hat nach Strg-T das Vergnügen, so etwas erneut formatieren zu müssen.

Kann man derlei Zeug nicht irgendwie schützen?!

Gruß

Gregor

gregorss:
Kann man derlei Zeug nicht irgendwie schützen?!

Ja, in dem man selbst so formatiert, daß Strg-T überflüssig ist :wink:

nach Strg-T das Vergnügen, so etwas erneut formatieren zu müssen

Du meinst sicher einzeilige Liste mehrerer Anweisungen incl. break; nach case :

Bei mir nicht... ( IDE 1.8.3 ). Da werden nur ein paar Leerzeichen eingefügt, damit es schöner aussieht.
Bleibt alles einzeilig.

Aber generell ist natürlich ^T nicht so komfortabel wie andere Formatierer (z.B. in Eclipse). Muss ja auch zum Rest (Pseudo "Syntax-Highlighting" ) passen :slight_smile:

michael_x:
Du meinst sicher einzeilige Liste mehrerer Anweisungen incl. break; nach case :

Ich meine alle möglichen „eigenen“ Formatierungen, um Code kompakt zu gestalten. Je nach Geschmack und Anforderung an die Lesbarkeit packe ich zum Beispiel auch mal ein if mitsamt else in eine einzelne Zeile. Sowas kann ich nach Strg-T jedes mal wieder hinbiegen. Deshalb benutze ich Strg-T so gut wie nie.

Gruß

Gregor

Hi

Dagegen habe ich ja nun auch Nichts ;).
Vll. als Workarround Speichern, STRG-T, fehlerhafte Klammer suchen, Laden, Klammer im eigenen Code anpassen.

Aber hier darf Jeder Seinen Code so präsentieren, wie Er mag - nur ob Ihm dann geholfen wird, steht wo anders :wink:
(und ich glaube Dir, daß Dein Code auch ohne STRG-T lesbar formatiert ist)

Habe selber ja das Auto-Speichern beim Kompilieren abgestellt (hat mir ein/zwei ... Dutzend ... Mal Einiges zerlegt ... 'gerade Mal was probieren' ... und schon war der Sketch auf der Platte nahezu jungfräulich) - kA, ob Das ein Workarround für mich selber wäre :confused:

MfG