Forum: Mikrocontroller und Digitale Elektronik Schalter mit Arduino Programmieren


von Caro (Gast)


Lesenswert?

Hallo,
ich bin eine Arduino-Anfängerin und habe folgendes Problem.
Ich möchte mit dem Arduino einen Aktor steuern der über einen 
Gestensensor in die eine Richtung fährt und über einen anderen Schalter 
in die andere Richtung fährt und jeweils einen Endschalter besitzt.

Das System sieht folgendermaßen aus:
-Gestensensor wird ausgelöst --> Aktor fährt in Richtung1 --> 
Endstoppschalter1 wird ausgelöst --> Aktor bleibt stehen --> Schalter 
wird ausgelöst --> Aktor fährt zurück in Richtung2 --> Endstoppschalter2 
wird ausgelöst --> Aktor bleibt stehen

ich habe mir folgenden Code gefunden und für meine Anwendung 
umgeschrieben. Aber leider Funktioniert er nicht.

1
int FWSPEED = 12;     // fährt in Richtung 1
2
int FWSTOPP = 11;     // bleibt in Richtung1 stehen
3
int BWSPEED = 10;     // fährt in Richtung 2
4
int BWSTOPP = 9;      // bleibt in Richtung2 stehen
5
int KIPP = 6;         // Kippschalter
6
int GESTE = 5;        // Gestensensor
7
int FWEX = 4;         // externer Endstopp FW
8
int BWEX = 3;         // externer Endstopp BW
9
10
int switchState = 0; // actual read value from GESTE
11
int oldSwitchState = 0; // last read value from GESTE
12
int lightsOn = 0; // is the switch on = 1 or off = 0
13
14
int switch2State = 0; // actual read value from KIPP
15
int oldSwitch2State = 0; // last read value from KIPP
16
int lights2On = 0; // is the switch on = 1 or off = 0
17
18
void setup() {
19
  pinMode (FWSPEED, OUTPUT);
20
  pinMode (FWSTOPP, OUTPUT);
21
  pinMode (BWSPEED, OUTPUT);
22
  pinMode (BWSTOPP, OUTPUT);
23
  pinMode (KIPP, INPUT);
24
  pinMode (GESTE, INPUT);
25
  pinMode (FWEX, INPUT);
26
  pinMode (BWEX, INPUT);
27
}
28
29
void loop() {
30
  switchState = digitalRead(GESTE); // read the pushButton State
31
  if (switchState != oldSwitchState) // catch change
32
  {
33
    oldSwitchState = switchState;
34
    if (switchState == HIGH)
35
    {
36
      // toggle
37
      lightsOn = !lightsOn;
38
    }
39
  }
40
41
  if(lightsOn)
42
  {
43
     digitalWrite(FWSPEED, HIGH);   // set the LED on
44
   } 
45
  else if(FWEX == HIGH) {
46
      digitalWrite(FWSPEED, LOW);
47
      digitalWrite(FWSTOPP, HIGH);   
48
    }
49
50
  switch2State = digitalRead(KIPP); // read the pushButton State
51
  if (switch2State != oldSwitch2State) // catch change
52
  {
53
    oldSwitch2State = switch2State;
54
    if (switch2State == HIGH)
55
    {
56
      // toggle
57
      lights2On = !lights2On;
58
    }
59
  }
60
61
  if(lights2On)
62
  {
63
     digitalWrite(BWSPEED, HIGH);// set the LED on
64
   } 
65
  else if(BWEX == HIGH) {
66
      digitalWrite(BWSPEED, LOW);
67
      digitalWrite(BWSTOPP, HIGH);
68
   }    
69
}


Ich bin mir ziehmlich sicher, dass die beiden else if- Funktionen 
wahrscheinlich der Fehler sind. aber ich weiß nicht wie ich es anders 
schreiben könnte. Das Programmieren ist auch echt Neuland für mich! Ich 
wäre sehr dankbar, wenn mir jemand helfen könnte.

Viele Grüße
Caro

: Bearbeitet durch Moderator
von MJF (Gast)


Lesenswert?

Hallo,

ohne genau das Programm zu verstehen, fallen mir die beiden 
if-Bedingungen
1
  else if(FWEX == HIGH) {
2
      digitalWrite(FWSPEED, LOW);
3
      digitalWrite(FWSTOPP, HIGH);
4
    }
und
1
  else if(BWEX == HIGH) {
2
      digitalWrite(BWSPEED, LOW);
3
      digitalWrite(BWSTOPP, HIGH);
4
   }
auf.

FWEX und BWEX sind die Nummern von Eingangspins. Um ihren Zustand 
abzufragen, must Du eine Abfrage der Pins durchführen:

statt
1
FWEX == HIGH
verwende
1
digitalRead(FWEX)==HIGH

Gruß

Markus

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


Lesenswert?

Caro schrieb:
> Aber leider Funktioniert er nicht.
Wie stellst du das fest?
Was erwartest du und was erhältst du statt dessen?

Zu dem hier:
> if (FWEX == HIGH)
FWEX wurde definiert als Variable mit dem Wert 4:
> int FWEX = 4;
Als was ist HIGH definiert?
Und dann: kann HIGH jemals den gleichen Wert wie FWEX (also 4) bekommen?

Formatierer schrieb im Beitrag #4691518:
> Wie sonst soll das ein Schwein entziffern können ....
Da war wohl ein Buchstabendreher bei den Tags. Der Slash muss vor das 
"c". Mit dem "Vorschau"-Button kann man das vor dem Absenden nochmal 
kontrollieren...

: Bearbeitet durch Moderator
von Caro (Gast)


Lesenswert?

Ja danke Markus, das digitalRead habe ich auf jeden Fall vergessen 
gehabt.

Ich habe an meinem Arduino die jeweiligen Schalter und die Ausgaben mit 
LEDs gesteckt. Und dann sehe ich ja wenn ich die Schalter drücke ob es 
so funktioniert wie ich dass gedacht habe.

Okay, sorry das wusste ich nicht. Ist auch das erste mal, dass ich auf 
einem Forum unterwegs bin.

von Caro (Gast)


Lesenswert?

Ich glaube ich feile liebe noch ein bisschen an dem Code und melde mich 
dann wieder.
Tut mir leid wenn ich eure Zeit gestohlen habe, das wollte ich wirklich 
nicht.

von Formatierer (Gast)


Lesenswert?

Caro schrieb:
> int FWSPEED = 12;     // fährt in Richtung 1
> int FWSTOPP = 11;     // bleibt in Richtung1 stehen
> int BWSPEED = 10;     // fährt in Richtung 2
> int BWSTOPP = 9;      // bleibt in Richtung2 stehen
> int KIPP = 6;         // Kippschalter
> int GESTE = 5;        // Gestensensor
> int FWEX = 4;         // externer Endstopp FW
> int BWEX = 3;         // externer Endstopp BW

[Meckermodus}
Es ist nicht Pflicht aber sehr guter Style wenn man die
Grossschreibung nur für Konstanten und
1
#defines
verwendet. Variablen schreibt man in C klein oder
zumindest gross/klein.
[/Meckermodus]

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.