Benötige hilfe beim Programmieren

Hallo,
seit kurzem habe ich einen Arduino (3-4 Tage) und bin schon fleißig am Programmieren. Derzeit arbeite ich an einem Zähler. Eine Siebensegmentanzeige soll die Zahlen 0 - 9 anzeigen; eine Zahl nach jedem Knopfdruck. Aber es scheitert am Programm, da ich keine ahnug habe wie das gehen soll. Im Anhang ist meine Verkabelung und das Programm.

KNOPFTEST.ino (1.25 KB)

So ganz schlimm sieht das ja gar nicht aus.
Ein erster Punkt, der mir ins Auge springt: Wenn du die COUNT in der if-Bedingung auswertest, musst du zwei Gleichheitszeichen setzen.
Zweiter Punkt: Die else-bedingung sorgen quasi augenblicklich dafür, dass die LEDs ausgehen. Die bessere Herangehensweise wäre in dem Fall, für jede Ziffer jedes einzelne Segmente entsprechend High oder Low zu setzen -kein else, ausschließlich 7 digitalWrite();
Wenn das läuft, kann weiter optimiert werden...

Danke,
hab es so umgeschrieben das nun zwei Gleichheitszeichen verwendet werden, jedoch habe ich keine ahnung wie ich else wegbekomme. Ich hab versucht das else durch delay ersetzt aber das geht auch nicht. Außerdem schreibt mir der Serial Monitor nur eine 2 aus.

KNOPFTEST.ino (1.28 KB)

if (COUNT = 1)

Die Sache mit den zwei Gleichheitszeichen gilt hier natürlich auch.

C ist schon eine Trick- und Fallenreiche Sprache.
Diese Anweisung ist völlig legal:

  • Setze COUNT auf 1 und arbeite dann den folgenden Anweisungsblock ab, da der Wert > 0 ist.

Im übrigen ist ein Sketch der Taster nur alle 10 Sekunden einmal einliest, nicht optimal.

Fabijan:
jedoch habe ich keine ahnung wie ich else wegbekomme. Ich hab versucht das else durch delay ersetzt aber das geht auch nicht.

Indem Du es einfach ersatzlos weglässt:

....
  if (COUNT==1)
  {
       digitalWrite(LED1, LOW);
       digitalWrite(LED2, LOW);
       digitalWrite(LED3, HIGH);
       digitalWrite(LED4, LOW);
       digitalWrite(LED5, LOW);
       digitalWrite(LED6, HIGH);
       digitalWrite(LED7, LOW);
    }
    if (COUNT==2)
....

Fabijan:
Außerdem schreibt mir der Serial Monitor nur eine 2 aus.

Mehr gibst Du ja auch nicht aus :wink: :

 Serial.println(KNOPF);

Du hast das else rausgenommen, lässt die geschweiften Klammern aber stehen. Diese sind damit nicht Teil der Anweisungen, die auf in if-Block liegen.

Also besser so als kurzer Codeauszug:

if (COUNT==1){
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);
  digitalWrite(LED3, HIGH);
  digitalWrite(LED4, LOW);
  digitalWrite(LED5, LOW);
  digitalWrite(LED6, HIGH);
  digitalWrite(LED7, LOW);

Und das dann für alle einzelnen Ziffern.

[edit] Da war jemand schneller...

Ihr solltet die schließende } Klammer nicht unterschlagen.

Gruß Tommy

Ja, ja, die geschweiften Klammern ...
Da fehlt noch was wesentliches: Die ganze for-Schleife muss in einen Klammerblock:

      for (int COUNT = 1; COUNT<10;COUNT++ )
      {
          delay(1000);
          if (COUNT == 1)
          {
               .....
           }

          if (COUNT == 2)
          {
               .....
           }
       } // Ende der for-Schleife

MicroBahner:
Da fehlt noch was wesentliches: Die ganze for-Schleife muss in einen Klammerblock:

Gut aufgepasst!

Ist alles geändert worden! Jedoch taucht jetz beim Knopfdruck für einen kurzen moment eine 1 auf, dann dauerhaft eine 3.

KNOPFTEST.ino (1.21 KB)

Na ja, das ist doch das, was Du programmiert hast. Die delays hast Du wesentlich verkürzt, deshalb die 1 nur für einen kurzen Moment. Bei count == 2 dürften die Ausgaben eine '3' erzeugen, und dann , wenn count größer als 2 ist passiert ja nichts mehr ...

Alles funktioniert bis auf, dass es nicht bei jedem Knopfdruck eine Zahl weiter geht sondern alle durchgeht.

KNOPFTEST.ino (3.56 KB)

Fabijan:
Alles funktioniert bis auf, dass es nicht bei jedem Knopfdruck eine Zahl weiter geht sondern alle durchgeht.

Weil du das so programmiert hast. Wenn du auf Knopfdruck weiterzählen willst, musst du nicht die for-Schleife starten, sondern deine Variable COUNT um eins erhöhen.

Fabijan:
Alles funktioniert bis auf, dass es nicht bei jedem Knopfdruck eine Zahl weiter geht sondern alle durchgeht.

Das macht doch die for-Schleife. Wenn Du das nicht willst, ist die for-Schleife der falsche Ansatz und überflüssig. Du musst dann stattdessen das Hochzählen von COUNT selbst machen ( jetzt verstehe ich auch, weshalb das vorher nicht im for(..) stand ). Es fehlt dann nur noch eine if-Abfrage, ob COUNT die 9 erreicht hat, und wieder auf 0 gesetzt werden muss. Also etwa so:

   if (digitalRead(KNOPF)==1)
    {
        COUNT++:
        if ( COUNT >9 ) COUNT = 1; // auf Überlauf testen

        if (COUNT == 1)
        {
            digitalWrite(LED1, LOW);
            digitalWrite(LED2, LOW);
            digitalWrite(LED3, HIGH);
            digitalWrite(LED4, LOW);
            digitalWrite(LED5, LOW);
            digitalWrite(LED6, HIGH);
            digitalWrite(LED7, LOW);
       
            delay(100);

        }
        if (COUNT==2)

         ......
    }

In der einfachen Form darfst Du aber immer nur ganz kurz drücken, sonst läuft es wieder durch.

Und das dann für alle einzelnen Ziffern.

Oder besser gleich einen tabellengesteuerten Encoder

const byte segments[10] = {

// Segmente
//     1  
// 2      3
//    4  
// 5      6 
//    7
//
//     7654321
     0b1110111 , // 0
     0b0100100 , // 1
     0b1011101 , // 2
     0b1101101 , // 3
     0b0101110 , // 4
     0b1101011 , // 5
     0b1111011 , // 6
     0b0100101 , // 7
     0b1110111 , // 8
     0b1101111 }; // 9

const byte LEDPins[7] = { 
//   1   2   3   4   5   6   7  Segment
    12, 11, 13, 10,  6,  8,  7 };  // Pin

byte count;

void loop() {
// Je loop - Durchlauf um eins hochzählen ( 0 .. 9 ) und 2 sec warten
  count++;
  if (count>9) count=0;
  display(count);
  delay(2000); 
}

void display(byte value) {
  // setzt die 7 Segmente HIGH oder LOW, damit value ( 0 .. 9 ) angezeigt wird
  for ( byte i=0;i < 7 i++) {
     digitalWrite(LEDPins[i], bitRead(segments[value], i)); 
  }
}

ungetestet

michael_x:
Oder besser gleich einen tabellengesteuerten Encoder

Alles schön und gut. Aber glaubst Du nicht, dass Du damit einen Einsteiger, der den Arduino gerademal seit 4 Tagen hat, etwas überforderst?

Vielen dank, alles funktioniert jetzt. Hänge schon den ganzen Tag daran.

KNOPFTEST.ino (3.56 KB)

Supi :slight_smile: :slight_smile:
Dann kann's ja jetzt weitergehen. Viel Spaß noch.
Und wenn's wieder ein Problem gibt ... Du weist ja 8)

Code sieht jetzt okay aus, unstimmig ist das Zurücksetzen von COUNT auf 0, obwohl gar keine Null angezeigt werden kann.
Das delay in den jeweiligen Anzeigeblöcken erfüllt auch keinen Sinn, stört (derzeit) aber praktisch nicht.
Ansonsten ist ungewöhnlich, dass du vorab Namen für die Pins vergibst, diese aber nicht für die pinMode-Zuweisung verwendest.

glaubst Du nicht, dass Du damit einen Einsteiger, der den Arduino gerademal seit 4 Tagen hat, etwas überforderst?

Ich habe mich absichtlich aus der "Knopf"-Verarbeitung rausgehalten, und gebe dir natürlich recht :wink:

Denke aber, dass wenn bei Fabijan der Spass anhält, er irgendwann von 10 mal 7 digitalWrite kopieren und editieren vielleicht auf was anderes umsteigen möchte.