Probleme mit Klappe

Hallo Leute,

wollte jetzt mal selbst versuchen eine Hühnerklappe zu programmieren und bin kläglich gescheitert.
Könnte mal jemand über mein Programm schauen und mir erklären wo mein Denkfehler ist?
Hänge da jetzt schon mehrere Tage fest und habe schon alles mögliche probiert, mir geht es nicht darum das mir jemand ein Programm fertig schreibt(Könnte ich auch Downloaden) , ich will nur Wissen was ICH in meinem Programm falsch mache. Die Klappe hat 2 Taster(oben und unten). Wenn der Sensor Licht misst und die Türe geschlossen ist(unterer Taster High) soll der Stepper 2 Umdrehungen machen. umgekehrt das selbe. Die LED´s sollen die Position anzeigen und bei Problemen blinken.

Ich hoffe ihr könnt mir helfen.

#include <Stepper.h> //Stepper Bibliothek 
int SPU = 2048; 
Stepper Motor (SPU, 3,5,4, 6); //Motor erh?lt Pins 8-11 
int sensorWert = A0; // 
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(sensorWert); 
 Serial.print ("LichsensorWert="); 
Serial.println (sensorWert); 
   
if
  ((analogRead(sensorWert) <= 150) && ( digitalRead(Sensoroben) == LOW)&&( digitalRead(Sensorunten)==HIGH)) {//wenn der SensorWert ?ber 100 ist und T?re Unten... 
  //delay(3600000)  
  Motor.step (4100); 
  
}  
  
  else 
  if
  
    ((analogRead(sensorWert) >= 151)  && ( digitalRead(Sensorunten) == LOW) && (digitalRead(Sensoroben)==HIGH)) {//Wenn der Sensorwert unter 100 ist und T?r oben... 
      Motor.step (-4100); 
    }
  
    else 
    if
 
        
        ((digitalRead(Sensorunten)==LOW )&&( analogRead(sensorWert)<= 150)&& (digitalRead(Sensoroben)==HIGH)) {
          digitalWrite(LEDrot,HIGH); 
      }
        else 
        if
 
          
            ((digitalRead(Sensoroben)==LOW)&&( analogRead(sensorWert) >= 151) && (digitalRead(Sensorunten)==HIGH)) {
            digitalWrite(LEDgruen,HIGH); 
          }

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

Könntest du noch beschreiben, was aktuell nicht funktioniert ?

Natürlich Entschuldigung.
Die LED´s blinken ständig nur, so als ob er das vorherige alles einfach überspringen würde obwohl ich die Schalter,Lichtquelle, etc... betätige.

Welche Pulldown-Widerstände hast Du an den Tasterpins angeschlossen?

Gruß Tommy

Ok... ein Fehler ist deine Bezeichnung der Pins und Variablen.
Die musst du unterschiedlich bezeichnen.

ÄÄÄÄ ok Shit

Fehler Nr.1 gefunden.

Danke

Biber1983:
ÄÄÄÄ ok Shit

Fehler Nr.1 gefunden.

Danke

War mal ein Anfang.
Wenn du den aktualisierten Sketch reinstellst, sehen wir weiter.

Und bitte die Frage von Tommy noch beantworten.

wie meinst du unterschiedlich bezeichen?

Und Pull Down habe ich total vergessen.

Ja, z.B.

byte Sensoroben = 11 ;    //Sensor oben
byte Sensorunten = 12 ;    //Sensor unten

bool posOben = false;
bool posUnten = false;


posOben = digitalRead(Sensoroben);
posUnten = digitalRead(Sensorunten);

usw.

Und dein Aufbau der if-Abfrage ist auch sehr unübersichtlich.

Das würde ich so abhandeln,
Pseudocode:

  if (valSensor <= 150)
  {
    if (!posOben && posUnten)
    {
      Motor.step (4100);
    }

    if // andere Abfrage
  }

  if (valSensor >= 151)
  {
    // usw.
  }

Also pulldown sind 10K Widerstände drin

Wegen dem Programm schaue ich gerade noch

Ich scheitere (wiedermal) am Programm.
mit bool habe ich noch garnicht gearbeitet und das andere Hilft mir gerade auch nicht weiter

Biber1983:
Ich scheitere (wiedermal) am Programm.
mit bool habe ich noch garnicht gearbeitet und das andere Hilft mir gerade auch nicht weiter

Dann Google doch mal.
Ist nicht viel anders wie int.
Braucht nur weniger Speicher.

Wenns nicht geht, nimm int.

Ein wenig lernen und mitarbeiten solltest du schon.

eine Frage hätte ich noch:
in dem Pseudocode oben von Hotsystem stehen mehrere if´s nacheinander, ich dachte es darf nur beim ersten "if" ,und dann muss es "if else" heissen?

Wieso darf ?
Wenn du Werte in die Abfrage schreibst, geht das auch so.
Ich hätte es gern ausführlicher gemacht, aber mobil ist das alles sehr umständlich.

Tut mir leid ich habe das so verstanden:

if()
mach das

else if()
mach das

else if()
mach das

elfe

also das es nur beim ersten"if" heißen darf, dann weiter mit "else if" und am schluss nur "else".

oder ist das falsch??

Du kannst beides machen.
Sicher gibt es einen Grund, wenn du " if else" nutzen musst, den kann ich dir leider nicht nennen.
Aber es kommt sicher jemand vorbei, der es genau begründen kann.

Du kannst beides machen.

if (a) mach_a();
if (b) mach_b();

mach_b() wird ausgeführt wenn b true ist, egal ob vorher mach_a() dran kam oder nicht.

if (a) mach_a();
else if (b) mach_b();
else mach_nix();

es wird genau 1 Funktion ausgeführt, entweder mach_a() oder mach_b() oder mach_nix().
( Priorität a vor b: Wenn a true ist, wird b gar nicht mehr geprüft )

Hi

Wenn die eine IF-Abfrage geschlossen ist, kannst Du natürlich eine neue IF da drunter setzen.

if (farbe==blau){
   digitalWrite(ledblau,HIGH);
} else {
  digitalWrite(ledblau,LOW);
}

if (uhrzeit>1200){
  if (anzeige==0) {
    serial.println("12:00");
    anzeige=1;
  }
}else{
   anzeige=0;
}

Nicht sonderlich sinnvoll, aber zwei eigenständige IF untereinander.

Da Deine Klappe Licht-Abhängig ist, würde ich Das auch so programmieren:

//Pseudocode
... lese Sensoren ein ...
if (Helligkeit>=Schwellwert){
  if (klappezu==geschlossen){
    stepper.run(richtung_auf);
  }
}else{ //Helligkeit kleiner oder gleich der Schwelle
  if (klappeauf!=geschlossen){
    stepper.run(Richtung_zu);
  }
}

Dabei musst Du aber ggf. mithalten, ob die Klappe nicht schon VOR dem Ende der Drehung offen/geschlossen ist.
Wenn's nur das aller erste Anfahren ist, wo 'kein Mensch weiß, wie der Stepper steht', würde ich 'so lange fahren, bis AUF erreicht' - bzw. 'so lange fahren, bis ZU erreicht' - begrenzt duerch eine Step-Anzahl, Die ca. eine Umdrehung 'Luft' gewährt.

Sollte Dir Mal einer der Klappen-Sensoren 'verloren' gehen (hörte schon Einiges über Hühner ...), dreht der Stepper nicht die nächsten zwei Stunden und wickelt den Seilzug zu einem schönen Knoten zusammen, sondern bleibt nach 'Zu + eine Umdrehung' stehen.

MfG

ok super danke
ich werde jetzt einfach mal versuchen alles nach und nach umzusetzen und sollte es klappen sag ich euch Bescheid.

Danke für eure Hilfe

Hallo Leute,

erstmal nochmal danke für eure Hilfe. Habe lange überlegt in welchem Forum ich mich anmelde .Gibt ja leider auch genug wo man nur blöd angemacht wird und keine Hilfe bekommt.

Hier war bis jetzt alles top, also nochmal danke.

Habe jetzt mal ein wenig mit “bool” herumprobiert. Leider findet man recht wenig deutschsprachige Infos dazu. Ich bin zwar des englischen mächtig, allerdings hackt es bei Fachausdrücken leider noch.

Anbei mein Programm. Irgendwie ist (immernoch) der Wurm drin.

Wo liegt mein Fehler?

Beim Hochladen dreht er manchmal und manchmal leuchtet nur die rote Diode . ich komm nicht drauf.

#include <Stepper.h> //Stepper Bibliothek 
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 ; 
byte Sensoroben = 11 ;    //Sensor oben
byte Sensorunten = 12 ;    //Sensor unten
bool posOben = false;
bool posUnten = false;

  
void setup () 
{ 
Motor.setSpeed (5); //Motorgeschwindigkeit 
Serial.begin (9600); //serieller Monitor 
pinMode (LEDgruen, OUTPUT); //LED auf Ausgang 
pinMode (LEDrot, OUTPUT); 
 } 
  void loop () 
{ 
  
posOben = digitalRead(Sensoroben);
posUnten = digitalRead(Sensorunten);
sensorWert = analogRead(eingang); 
Serial.print ("LichsensorWert="); 
Serial.println (sensorWert); 




 if (sensorWert<= 150)
  {
    if (!posOben && posUnten)
    {
      Motor.step (4100);
    }
  }

 if (sensorWert >= 151)
  {
    if(posOben && !posUnten)
    {
      Motor.step (-4100);
    }     
  }
  
 if (sensorWert <= 150)
  {
    if (posOben && !posUnten)
    {
      digitalWrite(LEDgruen,HIGH);
    }
  }
 if (sensorWert >= 150)
  {
    if (!posOben && posUnten)
    {
      digitalWrite(LEDrot,HIGH);
    }
  }
else
  {
    digitalWrite(LEDgruen,HIGH); 
    delay(1000); 
    digitalWrite(LEDgruen,LOW); 
    digitalWrite(LEDrot,HIGH); 
    delay(1000); 
    digitalWrite(LEDrot,LOW);
  }
}