Alten Zustand eines Pins Abfragen (Arduino)

Gast #5175621
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
Persönliche Seite #5175658
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
}
Gast #5175674
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
}
Gast #5175714
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.
Gast #5175718
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)
Gast #5176316
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
}
Angehängte Dateien:
Gast #5176395
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
}
Gast #5176401
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)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren