mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Schalter mit Arduino Programmieren


Autor: Caro (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

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

int switchState = 0; // actual read value from GESTE
int oldSwitchState = 0; // last read value from GESTE
int lightsOn = 0; // is the switch on = 1 or off = 0

int switch2State = 0; // actual read value from KIPP
int oldSwitch2State = 0; // last read value from KIPP
int lights2On = 0; // is the switch on = 1 or off = 0

void setup() {
  pinMode (FWSPEED, OUTPUT);
  pinMode (FWSTOPP, OUTPUT);
  pinMode (BWSPEED, OUTPUT);
  pinMode (BWSTOPP, OUTPUT);
  pinMode (KIPP, INPUT);
  pinMode (GESTE, INPUT);
  pinMode (FWEX, INPUT);
  pinMode (BWEX, INPUT);
}

void loop() {
  switchState = digitalRead(GESTE); // read the pushButton State
  if (switchState != oldSwitchState) // catch change
  {
    oldSwitchState = switchState;
    if (switchState == HIGH)
    {
      // toggle
      lightsOn = !lightsOn;
    }
  }

  if(lightsOn)
  {
     digitalWrite(FWSPEED, HIGH);   // set the LED on
   } 
  else if(FWEX == HIGH) {
      digitalWrite(FWSPEED, LOW);
      digitalWrite(FWSTOPP, HIGH);   
    }

  switch2State = digitalRead(KIPP); // read the pushButton State
  if (switch2State != oldSwitch2State) // catch change
  {
    oldSwitch2State = switch2State;
    if (switch2State == HIGH)
    {
      // toggle
      lights2On = !lights2On;
    }
  }

  if(lights2On)
  {
     digitalWrite(BWSPEED, HIGH);// set the LED on
   } 
  else if(BWEX == HIGH) {
      digitalWrite(BWSPEED, LOW);
      digitalWrite(BWSTOPP, HIGH);
   }    
}


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
Autor: MJF (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

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

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

Gruß

Markus

: Bearbeitet durch Moderator
Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Caro (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Caro (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Formatierer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
#defines
verwendet. Variablen schreibt man in C klein oder
zumindest gross/klein.
[/Meckermodus]

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.