Hi Zusammen, ich möchte eine +Flanke eines Arduino Pins (A5) erkennen. Ich habe folgenden Ansatz: if((digitalRead(A5)==HIGH)&(alte_zustand==LOW)){ .....…......CODE........ } Den aktuellen Zustand auslesen ist kein Problem. Doch wie kann ich den alten Zustand auslesen? Für Hilfe wäre ich echt Dankbar. MfG
Malaps schrieb: > Doch wie kann ich den alten Zustand auslesen? Den wirst du dir wohl vorher merken müssen....
1 | if((digitalRead(A5)==HIGH)&(alte_zustand==LOW)){ |
2 | alte_zustand=digitalRead(A5) |
3 | .....…......CODE........ |
4 | }
|
Gruss Chregu
1 | if ((digitalRead(A5) == HIGH) & (alte_zustand == LOW)) |
2 | {
|
3 | alte_zustand = digitalRead(A5) |
4 | .....…......CODE........ |
5 | }
|
Das macht nicht das, was hier gewünscht ist. Und das liegt am bitweisen UND &, das statt des logischen UND && verwendet wird. Und prinzipiell könnte sich der Zustand an A5 zwischen den beiden Aufrufen von digitalRead geändert haben, und dann funktionierts auch nicht.
1 | aktueller_zustand = digitalRead(A5); |
2 | |
3 | if ((aktueller_zustand == HIGH) && (alte_zustand == LOW)) |
4 | {
|
5 | alte_zustand = aktueller_zustand; |
6 | .....…......CODE........ |
7 | }
|
1 | bool erkenneFlanke(const bool value) |
2 | {
|
3 | static bool merker = true; // default, wg. Pullup |
4 | if(merker == value) return false; // kein Flankenwechsel |
5 | merker = value; |
6 | if(value) return true; // positiver Flankenwechsel |
7 | return false; // negativer Flankenwechsel |
8 | }
|
9 | |
10 | |
11 | |
12 | void setup() |
13 | {
|
14 | Serial.begin(9600); |
15 | Serial.println(""); |
16 | pinMode(5,INPUT_PULLUP); |
17 | }
|
18 | |
19 | void loop() |
20 | {
|
21 | if(erkenneFlanke(digitalRead(5))) Serial.println("positive Flanke erkannt."); |
22 | }
|
Oder so: if(erkenneFlanke(digitalRead(5))) Serial.println("Start Mittelstürmer"); MfG Paul
Malaps schrieb: > Den aktuellen Zustand auslesen ist kein Problem. > Doch wie kann ich den alten Zustand auslesen? Der Pin hat von sich aus kein Gedächnis, d.h. du kannst nur den aktuellen Stand auslesen. Woher sollt er auch wissen, wie alt der /alte Zustand/ sein soll. Das muss du programmieren, indem du dir den aktuellen Zustand immer bis zur nächsten Abfrage in einer Variablen merkst.
Paul B. schrieb: > Oder so: > if(erkenneFlanke(digitalRead(5))) Serial.println("Start > Mittelstürmer"); > > MfG Paul
1 | bool erkenneFlanke(const bool value) |
2 | {
|
3 | static bool merker = true; // default, wg. Pullup |
4 | if(merker == value) return false; // kein Flankenwechsel |
5 | return merker = value; |
6 | }
|
So besser, für den Stürmer? (spart ganze 2 Byte Flash ein)
Arduino F. schrieb: > So besser, für den Stürmer? Der Coach sagt: Ja. > (spart ganze 2 Byte Flash ein) Die können in der Endphase eines Spiels entscheidend sein. :) MfG Paul
Hallo zusammen, ich habe jetzt eine Flanke in meinen Sketch eingebaut. Die Flanke funktioniert schon mal gut, jedoch an der falschen Stelle. Wie ihr im folgenden Vidio sehen könnt, sagt die Flanke dem Servo das er sich erst dann drehen soll, wenn die Lichtschranke(TCRT5000) das Ende des Produktes passiert. Ich möchte jedoch das sich der Servo dreht, wenn die Lichtschranke den Anfang des Produktes passiert. Wie müsste ich den Sketch dann umändern? MfG ---------------------------------------- Vidio Link: https://1drv.ms/v/s!AoQMYjP_6k8dl2oc21S1ywDSTPCp ------------------------------------------------------------ CODE ------------------------------------------------------------
1 | #include <AFMotor.h> |
2 | #include <Servo.h> |
3 | Servo servo1; |
4 | |
5 | bool erkenneFlanke(const bool value) |
6 | {
|
7 | static bool merker = true; |
8 | if(merker == value) return false; |
9 | merker = value; |
10 | if(value) return true; |
11 | return false; |
12 | }
|
13 | |
14 | void setup() { |
15 | servo1.attach(10); |
16 | pinMode(A1,INPUT); |
17 | |
18 | Serial.begin(9600); |
19 | Serial.println(""); |
20 | pinMode(A1,INPUT_PULLUP); |
21 | }
|
22 | |
23 | void loop() { |
24 | |
25 | if(erkenneFlanke(digitalRead(A1))){ |
26 | servo1.write(30); |
27 | delay(100); |
28 | servo1.write(60); |
29 | delay(100); |
30 | }
|
31 | |
32 | }
|
:
Bearbeitet durch Moderator
Malaps schrieb: > Wie müsste ich den Sketch dann umändern? Du wirst die Flankenauswertung invertieren müssen.
Malaps schrieb: > Wie müsste ich den Sketch dann umändern? Rufus Τ. F. schrieb: > invertieren Vielleicht so: Malaps schrieb: > if(value) return true; if(!value) return true;
Ich habe jetzt if(!value) return true; geschrieben. Nach über tragen des Sketches: Der Servo dreht sich jetzt nach passieren des Anfangs und nach passieren des Endes ,des Produktes. Er soll sich nur am Anfang drehen. MfG --------------------------------------- CODE ---------------------------------------
1 | #include <AFMotor.h> |
2 | #include <Servo.h> Servo servo1; |
3 | |
4 | bool erkenneFlanke(const bool value) |
5 | {
|
6 | static bool merker = true; |
7 | if(merker == value) return false; |
8 | merker = value; |
9 | if(!value) return true; |
10 | return false; |
11 | }
|
12 | |
13 | void setup() { |
14 | servo1.attach(10); |
15 | pinMode(A1,INPUT); |
16 | Serial.begin(9600); |
17 | Serial.println(""); |
18 | pinMode(A1,INPUT_PULLUP); |
19 | }
|
20 | |
21 | void loop() { |
22 | if(erkenneFlanke(digitalRead(A1))){ |
23 | servo1.write(30); |
24 | delay(100); |
25 | servo1.write(60); |
26 | delay(100); |
27 | }
|
28 | }
|
:
Bearbeitet durch Moderator
Nee passt doch passt doch die Empfindlichkeit des Sensors war falsch eingestellt. Jetzt macht er es. if(!value) return true; klappt einwand frei. Vielen vielen Dank. Ihr seid Stark. MfG
Malaps schrieb: > Der Servo dreht sich jetzt nach passieren des Anfangs und nach passieren > des Endes ,des Produktes. > Er soll sich nur am Anfang drehen. Dann nimm dir mal einen ganz konventionellen Zettel und lege dir eine Tabelle mit den Zuständen an. Dann dürfte klarer werden, wie du das formulieren musst. p.s. Wenn du deinen Code übersichtlicher formatieren möchtest, drücke in der Arduino IDE mal die Tastenkombination Ctrl+T (Menü Werkzeuge - Automatische Formatierung)
Malaps schrieb: > --------------------------------------- > CODE > --------------------------------------- Bitte Bedienungsanleitung direkt über der Texteingabebox lesen und die passenden [c]-Tags verwenden...
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.