Immernoch Probleme mit Klappe

Hallo Leute,

habe mein Programm jetzt nochmal umgeschrieben um es ein wenig übersichtlicher zu gestalten und vielleicht den Fehler zu finden, leider erfolglos.

Es sieht aus als würde er die ersten if Anweisungen noch durchlaufen und der Motor dreht auch, aber dann ist Schluss. Bei Licht geht Garnichts.

ich verzweifle bald!!!!! :confused: :confused:

#include <Stepper.h>
int SPU = 2048;
Stepper Motor (SPU, 3, 5, 4, 6); //Motor erh?lt Pins 8-11
int eingang = A0; //
int sensorWert = 0; //Variable für den Sensorwert mit 0 als Start
int LEDgruen = 9;
int LEDrot = 8 ;
int Sensoroben = 11 ; //Sensor oben
int Sensorunten = 12 ; //Sensor unten

void setup ()
{
  Motor.setSpeed (5); //Motorgeschwindigkeit
  Serial.begin (9600); //serieller Monitor
  pinMode (LEDgruen, OUTPUT); //LED auf Ausgang
  pinMode (LEDrot, OUTPUT);
}
void loop ()
{
  {

    Sensoroben = digitalRead(Sensoroben);
    Sensorunten = digitalRead(Sensorunten);
    sensorWert = analogRead(eingang);
    Serial.print ("LichsensorWert=");
    Serial.println (sensorWert);
  }

  if
  (analogRead(sensorWert) <= 150)
    if ( digitalRead(Sensoroben) == LOW)
      if (digitalRead(Sensorunten) == HIGH)
      {
        Motor.step (4100);
      }




  if
  (analogRead(sensorWert) >= 151)
    if ( digitalRead(Sensorunten) == LOW)
      if (digitalRead(Sensoroben) == HIGH)
      {
        Motor.step (-4100);
      }



  if
  (digitalRead(Sensorunten) == LOW )
    if ( analogRead(sensorWert) <= 150)
      if (digitalRead(Sensoroben) == HIGH)
      {
        digitalWrite(LEDrot, HIGH);
      }



  if
  (digitalRead(Sensoroben) == LOW)
    if ( analogRead(sensorWert) >= 151)
      if (digitalRead(Sensorunten) == HIGH)
      {
        digitalWrite(LEDgruen, HIGH);
      }


  else


  digitalWrite(LEDgruen, HIGH);
  delay(1000);
  digitalWrite(LEDgruen, LOW);
  digitalWrite(LEDrot, HIGH);
  delay(1000);
  digitalWrite(LEDrot, LOW);

Warum musst Du dazu einen neuen Thread aufmachen?

Gruß Tommy

Hallo,

@tommy stimmt,

wahrscheinlich hat er den alten icht mehr gefunden.

und wir sollen Ihn jetzt suchen, wir wissen doch auch nicht mehr um was es geht.

Nein weil es mir rein um das Programm oben geht ob das soweit ok ist?

Der Fehler könnte ja auch in meinem Aufbau stecken deswegen will ich erstmal sicher gehen das das Programm soweit passt

Hallo,

eigendlich wollte ich Dir nicht antworten, denn wie viele andere sicher auch bin ich ebenfalls der Meinung das gehört in den alten Post, schliesslich geht es um das gleiche Thema.

Beim Überarbeiten des Programms hast Du jede Menge Fehler eingebaut , es gibt Klammern die können so nicht sein, da wundert es mich nicht das die If nicht funktionieren. Der Komplette Teil mit den Anweisungen PinMode fehlt. Fang doch einfach mal kleiner an und schau dir nochmal an wie man Eingänge deffiniert, so geht das jedenfalls nicht. Irgendwas hast Du anscheinend nicht verstanden.

Bittte beim nächsten Versuch wieder in dem alten Post

Heinz.

Biber1983:
Nein weil es mir rein um das Programm oben geht ob das soweit ok ist?

Kannst du denn bitte deinen Sketch in der IDE mittels STRG+T besser formatieren.
Dann wird dieser auch besser lesbar.
Du kannst den Sketch im Startpost austauschen.

Hallo HotSystem!

danke für den Hinweis ich hoffe jetzt ist es besser.

Ok, ohne jetzt großartig den Sketch auf Funktionsfähigkeit zu prüfen, habe ich die Klammern mal richtig (hoffe ich) gestellt.
Bei mir kompiliert er fehlerfrei.

#include <Stepper.h>
int SPU = 2048;
Stepper Motor (SPU, 3, 5, 4, 6); //Motor erh?lt Pins 8-11
int eingang = A0; //
int sensorWert = 0; //Variable für den Sensorwert mit 0 als Start
int LEDgruen = 9;
int LEDrot = 8 ;
int Sensoroben = 11 ; //Sensor oben
int Sensorunten = 12 ; //Sensor unten


void setup ()
{
  Motor.setSpeed (5); //Motorgeschwindigkeit
  Serial.begin (9600); //serieller Monitor
  pinMode (LEDgruen, OUTPUT); //LED auf Ausgang
  pinMode (LEDrot, OUTPUT);

  pinMode (Sensoroben, Input);  //diese beiden fehlten bei dir
  pinMode (Sensorunten, Input);
}

void loop ()
{
//  Sensoroben = digitalRead(inputSensoroben);
//  Sensorunten = digitalRead(inputSensorunten);
  sensorWert = analogRead(eingang);
  Serial.print ("LichsensorWert=");
  Serial.println (sensorWert);
  if (analogRead(sensorWert) <= 150) {
    if ( digitalRead(Sensoroben) == LOW)
      if (digitalRead(Sensorunten) == HIGH)
        Motor.step (4100);
        
  }

  if (analogRead(sensorWert) >= 151) {
    if ( digitalRead(Sensorunten) == LOW)
      if (digitalRead(Sensoroben) == HIGH)
        Motor.step (-4100);
        
  }
  
  if (digitalRead(Sensorunten) == LOW ) {
    if ( analogRead(sensorWert) <= 150)
      if (digitalRead(Sensoroben) == HIGH)
        digitalWrite(LEDrot, HIGH);
  }
  
  if (digitalRead(Sensoroben) == LOW) {
    if ( analogRead(sensorWert) >= 151)
      if (digitalRead(Sensorunten) == HIGH)
        digitalWrite(LEDgruen, HIGH);
  }
  else
  {
    digitalWrite(LEDgruen, HIGH);
    delay(1000);
    digitalWrite(LEDgruen, LOW);
  }
}

2 x pinModes fehlten. Evtl. brauchst du da noch Pullup- oder Pulldown-Widerstände

Änderung nach Schubser von Rentner.

Hallo,

was soll :
Sensoroben = digitalRead(Sensoroben);
Sensorunten = digitalRead(Sensorunten);

und zwei Zeilen später

if ( digitalRead(Sensoroben) == LOW)
if (digitalRead(Sensorunten) == HIGH)
Motor.step (4100);

das is nix

oben wird die variable sensoroben überschrieben und dadurch unten warscheinlich der falsche pin gelesen.

zurück auf Anfang wenn dann so

bool S_oben = digitalRead(Sensoroben);
bool s_unten = digitalRead(Sensorunten);

if ( s_oben) == LOW)
if (s_unten) == HIGH)
Motor.step (4100);

Heinz

Heinz du hast Recht.

Das kommt von dem Mist, wenn der TO einfach einen neuen Thread anfängt, dann hat man den Vorgang nicht mehr auf dem Schirm.

Ich hatte dem TO das schon im letzten Thread gepostet, jetzt im "Tiefschlaf" übersehen, ändere es oben gleich.

Edit:
Habe die zwei Zeilen entfernt.

ok danke
werde es am WE mal ausprobieren
P.S.:PullDown habe ich als Wiederstände auf dem Steckbrett verbaut.

So, habe es jetzt doch noch geschafft mich heute hinzusetzen und das Programm nochmal komplett zu zerlegen und einzeln aufzuspielen. Soweit klappt alles aber ein Punkt macht mich stutzig.

Wenn der "Offen" Taster betätigt ist und es ist Hell leuchtet die grüne Diode(soweit richtig)
Wenn der Taster "Zu" betätigt ist und es ist dunkel, leuchtet die rote (soweit auch richtig) .Nur Blinkt hier das Grüne noch mit. Das verstehe ich jetzt nicht . Kann mir das jemand erklären?
Motor Pins habe ich neu definiert, da der Stepper nur in eine Richtung gedreht hat.

P.S.: ja das nächste mal hänge ich es an den alten Post.

#include <Stepper.h>
int SPU = 2048;
Stepper Motor (SPU, 2, 4, 3, 5) ;//Motor erh?lt Pins 2-5
int eingang = A0; //
int sensorWert = 0; //Variable für den Sensorwert mit 0 als Start
int LEDgruen = 9;
int LEDrot = 8 ;
int Sensoroben = 12 ; //Sensor oben
int Sensorunten = 11 ; //Sensor unten


void setup ()
{
  Motor.setSpeed (5); //Motorgeschwindigkeit
  Serial.begin (9600); //serieller Monitor
  pinMode (LEDgruen, OUTPUT); //LED auf Ausgang
  pinMode (LEDrot, OUTPUT);

  pinMode (Sensoroben, INPUT);  //diese beiden fehlten bei dir
  pinMode (Sensorunten, INPUT);
}

void loop ()
{

  sensorWert = analogRead(eingang);
  Serial.print ("LichsensorWert=");
  Serial.println (sensorWert);


  if (analogRead(sensorWert) <= 150) {
    if ( digitalRead(Sensoroben) == LOW)
      if (digitalRead(Sensorunten) == HIGH)
        Motor.step (2050);
  }

  if (analogRead(sensorWert) >= 151) {
    if ( digitalRead(Sensorunten) == LOW)
      if (digitalRead(Sensoroben) == HIGH)
        Motor.step (-2050);

  }

  if (digitalRead(Sensorunten) == LOW ) {
    if ( analogRead(sensorWert) <= 150)
      if (digitalRead(Sensoroben) == HIGH)
        digitalWrite(LEDrot, HIGH);

  }
  if (digitalRead(Sensoroben) == LOW) {
    if ( analogRead(sensorWert) >= 151)
      if (digitalRead(Sensorunten) == HIGH)
        digitalWrite(LEDgruen, HIGH);

  }

  else
  {
    digitalWrite(LEDgruen, HIGH);
    delay(1000);
    digitalWrite(LEDgruen, LOW);
    digitalWrite(LEDrot, HIGH);
    delay(1000);
    digitalWrite(LEDrot, LOW);
  }


}

Weil das immer noch drin steht?

    digitalWrite(LEDgruen, HIGH);
    delay(1000);
    digitalWrite(LEDgruen, LOW);

Gruß Tommy

Ja aber das ist in der else Anweisung am Schluss. Dann müssten ja beide blinken oder

Biber1983:
Ja aber das ist in der else Anweisung am Schluss. Dann müssten ja beide blinken oder

Hallo,

Der else Zweig bringt lediglich zuerst die grüne led für eine Sekunde zum aufleuchten und dann die rote led für eine Sekunde.

millis() ist die Lösung.
Beispiel: BlinkWithoutDelay

Grüße,
Donny

Nur das ich das jetzt richtig verstehe:

wenn er offen ist ,soll nur das grüne LED leuchten, wenn die Klappe zu ist nur das rote.

Klappe offen>> Grün leuchtet durchgehen

Klappe zu >> Rot leuchtet durchgehend und grün blinkt

Warum ist das so und lässt sich das ohne delay überhaupt lösen???

Es sieht ja so aus als würde er von der >if< Anweisung (Klappe zu rot) direkt in die >else< springen und beide ausführen, oder???

Wenn die Pulldown-Widerstände richtig angeschlossen sind, blinkt die grüne LED im else Zweig. Was die rote macht, hängt vom Rest ab: ohne delay nach digitalWrite (LedRot, LOW); kann es sein, dass man dies gar nicht sieht, und die rote LED dauerhaft leuchtet.

Ja wenn es in den else Zweig springt ist das auch so das beide blinken.

Das Problem ist das das grüne auch blinkt, wenn nur das rote durchgehend leuchten soll , also in diesem if zweig:

}

if (digitalRead(Sensorunten) == LOW ) {
if ( analogRead(sensorWert) <= 150)
if (digitalRead(Sensoroben) == HIGH)
digitalWrite(LEDrot, HIGH);

}

Immer wenn Sensoroben HIGH ist, blinkt es

  if (digitalRead(Sensoroben) == LOW) 
  {
     / /  weitere Prüfungen
  }
  else 
  { 
     // Blinken
  }

so hast du es programmiert

Okay also mein Fehler. SHit

Wollte das er geschlossen rot leuchtet und offen grün. Nur wenn etwas nicht stimmt soll er blinken.