Forum: Mikrocontroller und Digitale Elektronik Was stimmt an diesem Code nicht?


von Simon N. (ardi)


Lesenswert?

Hi,
ich habe an meinem Arduino einen Schlater und 3 LEDs angebunden. Wenn 
ich den Knopf drücke soll die erste LED starten, wenn ich den nochmal 
drücke die zweite und die dritte beim dritten drücken.
Wenn ich aber es teste und auf den Knopf drücke, dann geht die erste LED 
an und nach dem drücken wieder aus und nochmal drücken das gleiche.
Was ist hier falsch:
1
void setup(){
2
  pinMode(13, OUTPUT);
3
  pinMode(12, OUTPUT);
4
  pinMode(11, OUTPUT);
5
  pinMode(2, INPUT);
6
  Serial.begin(9600);
7
}
8
9
void loop(){
10
 int counter=0;
11
12
 int schalter=digitalRead(2);
13
 Serial.println(schalter, DEC);
14
 
15
 if(schalter==HIGH){
16
   counter++;
17
 }
18
 if(counter==0){
19
   digitalWrite(13, LOW);
20
   digitalWrite(12, LOW);
21
   digitalWrite(11, LOW);
22
 }
23
 if(counter==1){
24
   digitalWrite(13, HIGH);
25
   digitalWrite(12, LOW);
26
   digitalWrite(11, LOW);
27
 }
28
 if(counter==2){
29
   digitalWrite(13, HIGH);
30
   digitalWrite(12, HIGH);
31
   digitalWrite(11, LOW);
32
 }
33
 if(counter==3){
34
   digitalWrite(13, HIGH);
35
   digitalWrite(12, HIGH);
36
   digitalWrite(11, HIGH);
37
 }  
38
 if(counter==4){
39
   counter=0;
40
 }
41
 
42
  
43
}
Danke und Gruß

von Flo G. (phlo)


Lesenswert?

Du setzt mit
1
int counter=0;

in jedem Schleifendurchlauf den counter wieder auf 0. D.h. er kann gar 
nie höher als 1 werden. Heißt: Die Initialisierung von counter ins setup 
verschieben!

Grüße

von MÖÖP (Gast)


Lesenswert?

Der Counter in deiner Loop wird immer wieder auf "0" gesetzt ... immer 
und immer wieder ...

von Axel R. (Gast)


Lesenswert?

Da ist kein Schleifendurchlauf. Nur weil die Routine "loop()" heisst?
Der macht das alles einmal und resettet evtl. Beim nächsten Druck ist er 
dann wieder bei eins.
Oder ist das beim aruninio anders? bestimmt doert der Name der Funktion 
deren Verhalten ;))

von Thomas H. (pcexperte) Benutzerseite


Lesenswert?

Simon Name schrieb:

> void loop(){
>  int counter=0; <--- !!!!!!!!
>

Weil bei jedem Durchlauf deiner Hauptschleife counter auf 0 gesetzt 
wird.

Schreibe das int counter=0; mal in die void setup().

Gruß
Thomas

von Flo G. (phlo)


Lesenswert?

Axel R. schrieb:
> Oder ist das beim aruninio anders? bestimmt doert der Name der Funktion
> deren Verhalten ;))

Auch wenns für die Hardcore-C-Frickler meistens gewöhnungsbedürftig ist: 
Ja. Macht auch Sinn. Siehe auch 
http://de.wikipedia.org/wiki/Konvention_vor_Konfiguration

von Axel R. (Gast)


Lesenswert?

Das "int counter=0;" dort falsch steht, kommt ja noch hinzu

von Simon N. (ardi)


Lesenswert?

Ok danke, das hat schon geholfen.
Nur jetzt ist es so der Ablauf
1.Druck: LED 1 und 2 gehen an
2. Druck: während dem Drücken gehen alle LEDs an und nach dem Drücken 
sind alle aus
3.Druck: während dem Drücken gehen wieder alle an und danach ist die 
erste LED an
4. Druck: beim Drücken geht sind LED1 und 2 an und danach ist die erste 
an
5. Druck: alle sind an
6. Druck: dritte geht aus
7.Druck: alle gehen beim Drücken an und danch sind alle wieder aus

Und nun mein Gedanke:
WAS???
Kann mir jemand helfen?

von Axel R. (Gast)


Lesenswert?

http://arduino.cc/de/Reference/Loop
Ach du kack..
Na - da bin ich raus. Mit sowas will ich nichts zu tun haben ;)

von Flo G. (phlo)


Lesenswert?

Was sagt denn die Ausgabe deines Serial.print? Vielleicht auch mal den 
Counter damit ausgeben...

von Mike M. (mikeii)


Lesenswert?

Bleib cool,

statt in der main()
1
while(1){
2
3
// schöne Sachen machen
4
5
}
ham die bei sich im Hintegrund wohl
1
while(1){
2
3
loop();
4
5
}

Soll den Einsteigern wohl ne Hilfe sein

von Axel R. (Gast)


Lesenswert?

war ja nicht soo bierernst zu nehmen. Natürlich lese ich hier weiter mit 
:)
Die kommen aber auch auf Ideen. Wenn der geneigte arduino-User dann mal 
umsteigt, blickt er nicht mehr durch!"
Die Umgebung ( processing.org ) finde ich aber ganz nett, muss ich 
erlich zugeben. Ich habe da mit JAVA bissschen was veranstaltet. Geht 
1A!
Zurück zum Thema...

von Dietrich L. (dietrichl)


Lesenswert?

Simon Name schrieb:
> WAS???

Ist die Taste entprellt? Sonst ist das Ergebnis eher zufällig, zumindest 
nicht genau reproduzierbar.

Simon Name schrieb:
> if(schalter==HIGH){
>    counter++;

Außerdem wird nicht gewartet, bis der Taster wieder losgelassen wird. 
Also müssten beim Halten der Taste die LEDs durchlaufen.

Aber vielleicht sind in den Arduino-Funktionen noch geheimnisvolle 
Eigenschaften versteckt, die das verhindern ...

Gruß Dietrich

von Helfender (Gast)


Lesenswert?

Solange der Schalter gedrückt ist, zählt er immer wieder
und wieder hoch. Daher sind alle LEDs an.
Wenn du ihn los lässt, dann bleibt er zufällig auf dem letzten
Wert stehen.

Vielleicht solltest du nach dem Drücken und Setzen der LEDs
warten, bis der Schalter wieder losgelassen wird.

Nächstes Problem könnte dann das Prellen des Schalters sein...

von Axel R. (Gast)


Lesenswert?


von Charles. K (Gast)


Lesenswert?

Normalerweise reicht ein static vor der Deklaration. Dann wird die 
Variable nur einmal initialisiert (zumindest in C).
Also:
[c]void loop(){
 static int counter=0;
...[c]

Trotzdem denke ich auch, dass etwas gegen das Tastenprellen gemacht 
werden muß.


Gruß,
Charles

von Mike M. (mikeii)


Lesenswert?

Ist das beim Arduino nicht schon von der Bibliothek aus entprellt? Kann 
mir nicht vorstellen, dass ein Anfänger das kann/weiß

von Charles. K (Gast)


Lesenswert?

Ich bin kein Arduino-Experte, aber da digitalRead nur den Zustand eines 
Ports zurück gibt, kann die Funktion nicht wissen, ob ein Taster oder 
etwas anderes angeschlossen ist. Ich habe auch ein Beispiel-Code zum 
entprellen gefunden: http://www.arduino.cc/en/Tutorial/Switch

von Axel R. (Gast)


Lesenswert?

> Ich habe auch ein Beispiel-Code zum
entprellen gefunden: http://www.arduino.cc/en/Tutorial/Switch

Ach nee, Du auch?
Beitrag "Re: Was stimmt an diesem Code nicht?"

von Arduino (Gast)


Lesenswert?

Es gibt auch eine Library mit der benötigten Funktionalität.

http://playground.arduino.cc//Code/Bounce

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.