Forum: Mikrocontroller und Digitale Elektronik Alten Zustand eines Pins Abfragen (Arduino)


von Malaps (Gast)


Lesenswert?

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

von Einer K. (Gast)


Lesenswert?

Malaps schrieb:
> Doch wie kann ich den alten Zustand auslesen?
Den wirst du dir wohl vorher merken müssen....

von Christian M. (Gast)


Lesenswert?

1
if((digitalRead(A5)==HIGH)&(alte_zustand==LOW)){
2
alte_zustand=digitalRead(A5)
3
...........CODE........
4
}

Gruss Chregu

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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
}

von Einer K. (Gast)


Lesenswert?

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
}

von Paul B. (paul_baumann)


Lesenswert?

Oder so:
if(erkenneFlanke(digitalRead(5)))  Serial.println("Start 
Mittelstürmer");

MfG Paul

von Malaps (Gast)


Lesenswert?

Gut ich probiere mal beide Varianten.
MfG

von Malaps (Gast)


Lesenswert?

Nochmal vielen Dank

von Wolfgang (Gast)


Lesenswert?

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.

von Einer K. (Gast)


Lesenswert?

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)

von Paul B. (paul_baumann)


Lesenswert?

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

von Malaps (Gast)


Angehängte Dateien:

Lesenswert?

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
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Malaps schrieb:
> Wie müsste ich den Sketch dann umändern?

Du wirst die Flankenauswertung invertieren müssen.

von Einer K. (Gast)


Lesenswert?

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;

von Malaps (Gast)


Lesenswert?

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
von Malaps (Gast)


Lesenswert?

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

von Wolfgang (Gast)


Lesenswert?

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)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.