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.
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.
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 ...
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.
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
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.