[Arduino C] LEDs flackern auf

  • C

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Manawyrm.

    [Arduino C] LEDs flackern auf

    Hallo,

    ich habe mit dem Arduino einen Würfel gemacht:

    Es hat 7 LEDs (Das sind die Würfelpunkte) und
    einen roten Knopf.

    Ich will das wenn ich auf den Knopf drücke, eine Zufallszahl zwischen 1 und 6 generiert wird und sie mir dann mithilfe der LEDs anzeigt.

    Soweit so gut, aber wenn ich mit diesem Code (den ich selber geschrieben habe)

    C-Quellcode

    1. // Deklaration der Pins
    2. const int led1 = 13;
    3. const int led2 = 12;
    4. const int led3 = 11;
    5. const int led4 = 10;
    6. const int led5 = 9;
    7. const int led6 = 8;
    8. const int led7 = 7;
    9. const int button = 6;
    10. // Deklarationen
    11. int buttonState = 0;
    12. int number;
    13. //-------------------------------------------------------------
    14. // void ledclear()
    15. // Void zum Ausschalten aller LEDs
    16. void ledclear()
    17. {
    18. digitalWrite(led1,LOW);
    19. digitalWrite(led2,LOW);
    20. digitalWrite(led3,LOW);
    21. digitalWrite(led4,LOW);
    22. digitalWrite(led5,LOW);
    23. digitalWrite(led6,LOW);
    24. digitalWrite(led7,LOW);
    25. }
    26. //------------------------------------------------------------
    27. // void shownumber()
    28. // Void zum Anzeigen der Würfelzahl
    29. void shownumber(int zahl)
    30. {
    31. if(zahl == 1) // Wenn Zahl ist 1 ...
    32. {
    33. ledclear();
    34. digitalWrite(led7,HIGH);
    35. }
    36. if(zahl == 2) // Wenn Zahl ist 2 ...
    37. {
    38. ledclear();
    39. digitalWrite(led3,HIGH);
    40. digitalWrite(led4,HIGH);
    41. }
    42. if(zahl == 3) // Wenn Zahl ist 3 ...
    43. {
    44. ledclear();
    45. digitalWrite(led3,HIGH);
    46. digitalWrite(led4,HIGH);
    47. digitalWrite(led7,HIGH);
    48. }
    49. if(zahl == 4) // Wenn Zahl ist 4 ...
    50. {
    51. ledclear();
    52. digitalWrite(led1,HIGH);
    53. digitalWrite(led3,HIGH);
    54. digitalWrite(led4,HIGH);
    55. digitalWrite(led6,HIGH);
    56. }
    57. if(zahl == 5) // Wenn Zahl ist 5 ...
    58. {
    59. ledclear();
    60. digitalWrite(led1,HIGH);
    61. digitalWrite(led3,HIGH);
    62. digitalWrite(led4,HIGH);
    63. digitalWrite(led6,HIGH);
    64. digitalWrite(led7,HIGH);
    65. }
    66. if(zahl == 6) // Wenn Zahl ist 6 ...
    67. {
    68. ledclear();
    69. digitalWrite(led1,HIGH);
    70. digitalWrite(led2,HIGH);
    71. digitalWrite(led3,HIGH);
    72. digitalWrite(led4,HIGH);
    73. digitalWrite(led5,HIGH);
    74. digitalWrite(led6,HIGH);
    75. }
    76. }
    77. //--------------------------------------------------------------------------------
    78. void setup() // Die Void wird nur einmal ausgeführt
    79. { // Anfang der void setup()
    80. pinMode(led1,OUTPUT);
    81. pinMode(led2,OUTPUT);
    82. pinMode(led3,OUTPUT);
    83. pinMode(led4,OUTPUT);
    84. pinMode(led5,OUTPUT);
    85. pinMode(led6,OUTPUT);
    86. pinMode(led7,OUTPUT);
    87. pinMode(button,INPUT);
    88. //--------------------------
    89. shownumber(1);
    90. delay(1000);
    91. shownumber(2);
    92. delay(1000);
    93. shownumber(3);
    94. delay(1000);
    95. shownumber(4);
    96. delay(1000);
    97. shownumber(5);
    98. delay(1000);
    99. shownumber(6);
    100. delay(2000);
    101. ledclear();
    102. //--------------------------
    103. } // Ende der void setup()
    104. // void loop() ist eine Schleife, die nach der void setup() ausgeführt wird.
    105. void loop()
    106. { // Anfang der void loop()
    107. while(true)
    108. {
    109. buttonState = digitalRead(button);
    110. if(buttonState == HIGH)
    111. {
    112. break;
    113. }
    114. }
    115. number = random(1,7);
    116. shownumber(number);
    117. } // Ende der void loop()
    118. // ENDE des Programms Wuerfel


    auf den Knopf drücke flackern die LED's auf und es wird entweder eine 2 oder eine 4 angezeigt.

    Warum?

    Freue mich auf Antworten.

    MFG

    Alex-Digital :D
    Weil du in der Loop nicht wartest, bis der Button wieder losgelassen wird!
    Das Teil ist ja flott und direkt fertig, generiert und zeigt dann gleich die nächste Zahl.

    ein weiteres Problem ist die Tatsache, dass der Arduino keine Zufallszahlen bekommen kann.
    Wie auch? Du kannst allerdings tricksen, indem du als Seed beim Generieren der Zufallszahl einen AnalogRead(pinhier) auf einen leeren Pin machst.
    Dies funktioniert über den Befehl RandomSeed.
    Dieser hängt dann in der Luft und nimmt alles auf, was gerade so im Umkreis ist. Sollte sich ganz gut nutzen lassen^^

    Außerdem, wie ist der Knopf angeschlossen?
    Er sollte direkt zwischen Pin und Masse (GND) hängen.
    Weiterhin muss unbedingt nach dem Schalten des Eingangspins als Eingang ein digitalWrite(button, HIGH); gemacht werden, um den internen Pull-Up Widerstand zu aktivieren.

    Eins noch: Es existiert ein Konstrukt namens SwitchCase! ;)
    Moment: Pins werden zum Schalten auf Masse gezogen. Du musst also in der Abfrage prüfen, ob der Pin == LOW ist!
    Außerdem würde ich Variablen wie buttonState lokal in der Sub definieren.
    RAM-Speicher ist ein kostbares Gut auf einem AVR! (nur 2kB!)

    Gruß,
    Manawyrm

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Manawyrm“ ()

    Ich hab in der Zwischenzeit noch ein paar Änderungen vorgenommen.
    Diese bitte auch Beachten.

    Wichtig ist vorallem der Hinweis zu dem Ändern des Pins -> HIGH/LOW.

    Du kannst also einfach while (digitalRead(button) == LOW){} machen!

    EDIT: Noch nen Einfall: Du könntest die Zustände der LEDs in ein Array packen und dieses direkt in das passende Portregister schreiben =)

    Gruß,
    Manawyrm

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Manawyrm“ ()