Moin
Gibt es eine elegantere Lösung um Anweisungen wie if und elwe if
auszuführen. Ich will nämlich lins am arduino auslesen und falls eine
Spannung anliegt soll das was in der if Anweisung steht ausgeführt
werden. Das hab ich so so gemacht.
While (diesdas > 1)
If(digitalRead(pin1 == HIGH)){
//tu etwas
}
Else if(digitalRead (pin2 == HIGH)){
//tu etwas anderes
}
Und so geht das bei mir mit 20 anderen pins weiter. Es sollen so lange
diese pins anlusgelesen werden bis die Bedingung in der while schleife
nicht mehr stimmt.
Gibt es dafür elegantere Lösungen oder kann es hierbei zu komplikationen
kommen?
Chris D. schrieb: > Ich will nämlich lins am arduino auslesen Was sind lins? Ist das ein spezielles Arduino Shield? Sagt dir "switch" und "case" etwas?
Und das sagt mir etwas. Wie läuft das mit dem case und so ab? Läuft das so ähnlich wie diese else ifs dauernd bis man etwas drückt?
Wenn man alle portpins nacheinander durchgehen will, nimmt man ein for Schleife. In der Schleife braucht man dann nur eine if Abfrage.
switch/case wird hierbei nicht helfen, damit kann man nur eine Variable auf verschiedene Werte abfragen: int x = f();
1 | switch(x) |
2 | {
|
3 | case 1: |
4 | do_something(); |
5 | break; |
6 | |
7 | case 2: |
8 | do_something_else(); |
9 | break; |
10 | |
11 | default:
|
12 | do_nothing(); |
13 | }
|
Dies entspricht in etwa:
1 | if(x == 1) |
2 | do_something(); |
3 | else if(x == 2) |
4 | do_something_else(); |
5 | else
|
6 | do_nothing(); |
Warum liest Du nicht erst einmal die Ports komplett ein und prüfst danach welche Pins gesetzt sind oder nicht. Das funktioniert allerdings nur dann, wenn die Ports komplett für Deine Anwendung reserviert sind. Bspw. so:
1 | if ( a=PINx ) { /* Prüft ob irgend ein Pin gesetzt ist, also NICHT 0 ist*/ |
2 | |
3 | for(i=0; i < 8; i++ ){ |
4 | if ( a & ( 1 << i)){ /* Einzelne Pins abfragen*/ |
Port schrieb: Wenn man alle portpins nacheinander durchgehen will, nimmt man ein for Schleife. In der Schleife braucht man dann nur eine if Abfrage. Wichtig is aber das kein pin ausversehen durch zu kurzen tastendruck übersehen wird. Wie würde diese for schleife dann aussehen?? Und wie kommt man in die auszuführenden befehle??
Chris D. schrieb: > Wichtig is aber das kein pin ausversehen durch zu kurzen tastendruck > übersehen wird. Wie würde diese for schleife dann aussehen?? > Und wie kommt man in die auszuführenden befehle?? Dann nimmt man Interrupts.
Chris D. schrieb: > Wichtig is aber das kein pin ausversehen durch zu kurzen tastendruck > übersehen wird. Ich fürchte, du überschätzt deine Drückgeschwindigkeit. Wie lang ist denn dein kürzester Tastendruck?
BattMan schrieb: > if ( a & ( 1 << i)){ /* Einzelne Pins abfragen*/ Zur weiteren Veranschaulichung:
1 | if ( a & ( 1 << i)){ /* Einzelne Pins abfragen*/ |
2 | |
3 | switch(i){ |
4 | |
5 | case: 0: Tue_etwas(); /* PIN Nr. 0 ist gesetzt */ |
6 | break; |
7 | usw... |
BattMan schrieb: > case: 0: Tue_etwas(); /* PIN Nr. 0 ist gesetzt */ Schreibfehler von mir: Richtig ist:
1 | case 0: Tue_etwas(); /* PIN Nr. 0 ist gesetzt */ |
Der Doppelpunkt nach dem case war falsch!
Warum willst du überhaupt eine andere Lösung? Ein Programm soll funktionieren und es soll einfach und verständlich sein. Damit man bei einem Fehler sofort sieht, was man ändern muss. So gesehen ist das Programm ideal. Natürlich kann sich heraus stellen, das es nicht so einfach geht, dass du z.B. einen Tastenentprellung in einer Interruptroutine brauchst. Aber warum anders machen, wenn es funktioniert? P.S. Beispiele für elegante Lösungen findest du recht einfach. Suche nach umfangreichen Open-Source-Projekten, an denen nur 1 oder 2 Leute arbeiten.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.