Neuling hat Fragen

Hallo Gemeinde,

ich bin neu hier und habe Probleme mit meiner Steuerung, die ihr hoffentlich lösen könnt.

Und zwar, wollte ich eine Garagentorsteuerung programmieren. Das funktioniert soweit auch ganz gut, aber die Steuerung läuft nur solange ich den taster an meiner Fernbedienung gedrückt halte.

Ich habe es schon mit der steuerung vom Tutorial mit dem Taster versucht, aber das funktioniert auch nicht.

Ich bitte um Hilfe

So wird dir keiner helfen! Du solltest schon deinen Schaltplan, Sketch etc deiner Fragestellung hinzufügen

ok und wie füge ich meinen Sketch hinzu das man den scrollen kann?

Oben links, wo du den Text eingibst, das < / > Zeichen anklicken und Sketch einfügen.

Um Bilder einfügen, musst du auf REPLY klicken und dann unten steht da was von Attachment.....

Du kannst auch die Library ClickButton und OneButton mal ausprobieren.

int ZTL=0; //Zugmagnet Tor links
int MTLA=1; //Motor Tor links auf
int HMTL=2; //Haltemagnet Tor links
int MTLZ=3; //Motor Tor links zu
int ZTR=4; //Zugmagnet Tor rechts
int MTRA=5; //Motor Tor rechts auf
int HMTR=6; //Haltemagnet Tor rechts
int MTRZ=7; //Motor Tor rechts zu
int ETLA=8; //Endschalter Tor links auf
int ETLZ=9; //Endschalter Tor links zu
int ETRA=10; //Endschalter Tor rechts auf
int ETRZ=11; //Endschalter Tor recht zu
int TA=A0; //Tor Auf Taster
int TZ=A1; //Tor zu Taster
int tasterstatus=0;

void setup() 
{
  pinMode (ZTL, OUTPUT);
  pinMode (MTLA, OUTPUT);
  pinMode (HMTL, OUTPUT);
  pinMode (MTLZ, OUTPUT);
  pinMode (ZTR, OUTPUT);
  pinMode (MTRA, OUTPUT);
  pinMode (HMTR, OUTPUT);
  pinMode (MTRZ, OUTPUT);
  pinMode (TA, INPUT);
  pinMode (TZ, INPUT);
  pinMode (ETLA, INPUT);
  pinMode (ETLZ, INPUT);
  pinMode (ETRA, INPUT);
  pinMode (ETRZ, INPUT);
}


void loop()
{
  tasterstatus=analogRead (TA);
  if ((tasterstatus==HIGH)&&(ETLZ==HIGH));
  {
    digitalWrite (ZTL, HIGH);
    delay (1000);
    digitalWrite (MTLA, HIGH);
    delay (5000);
    digitalWrite (ZTL, LOW);
  }
  digitalWrite (HMTL, HIGH);
  if (ETLA == HIGH);
  {
    digitalWrite (MTLA, LOW);
    digitalWrite (ZTR, HIGH);
    delay (1000);
    digitalWrite (MTRA, HIGH);
    delay (5000);
    digitalWrite (ZTR, LOW);
  }
  digitalWrite (HMTR, HIGH);
  if (ETRA == HIGH);
  {
    digitalWrite (MTRA, LOW);
  }
  tasterstatus=analogRead (TZ);
  if ((tasterstatus==HIGH)&&(ETRA==HIGH));
    {
    digitalWrite (HMTR, LOW);
    delay (1000);
    digitalWrite (MTRZ, HIGH);
    delay (1000);
    digitalWrite (ZTR, HIGH);
  }
  if (ETRZ == HIGH);
  {
    delay (200);
    digitalWrite (ZTR, LOW);
    delay (200);
    digitalWrite (MTRZ, LOW);
  }
  if (ETRZ == HIGH);
  {
    digitalWrite (HMTL, LOW);
    delay (1000);
    digitalWrite (MTLZ, HIGH);
    delay (1000);
    digitalWrite (ZTL, HIGH);
  }
  if (ETLZ == HIGH);
  {
    delay (200);
    digitalWrite (ZTL, LOW);
    delay (200);
    digitalWrite (MTLZ, LOW);
  }
}

ah ok

Also halte ich den Tor auf Taster gedrückt läuft das Programm aber sobald ich loslasse stoppt es

Und wofür machst du in deinem Sketch "analogRead" ?
Obwohl du nur nach HIGH bzw. LOW abfragst.

Hättest du den besser dokumentiert, wüssten wir warum du es machst.

weil ich meine Taster an den Analog eingängen abfrage und wenn ich da digitalRead mache startet gar nichts

Batman86:
weil ich meine Taster an den Analog eingängen abfrage und wenn ich da digitalRead mache startet gar nichts

Falsch, du kannst auch analog Eingänge mit "digitalRead" abfragen.
Nur solltest du für jeden Input auch eine eigene "tasterstatus-variable" nehmen.
Das ist dann einfach übersichtlicher.

Ich danke dir ja für deine Hilfe, aber kannst du es auch mal verständlich erklären (mit beispielen) wenn ich 2x "int tasterstatus" eingebe kommt als Fehlermeldung "redefinition in tasterstatus"

Batman86:
Ich danke dir ja für deine Hilfe, aber kannst du es auch mal verständlich erklären (mit beispielen) wenn ich 2x "int tasterstatus" eingebe kommt als Fehlermeldung "redefinition in tasterstatus"

Eine eigene heißt "tasterstatus_1" und "tasterstatus_2", aber besser wäre einen Namen zu verwenden, der mehr über die Funktion aussagt, das ist verständlicher. Z.B. "status_Tor_auf" und "status_Tor_zu" o.ä. und du weißt in einem Jahr noch, was es bedeutet.

Und dann zu deinem eigentlichen Problem.
Woher weiß dein Sketch, wann denn das Tor zu ist.

Wie ich schon schrieb, ohne Dokumentation ganz schwierig.

Jetzt hab ich ihn noch mal überarbeitet, hoffe es hilft

int ZTL=0; //Zugmagnet Tor links an Pin 0
int MTLA=1; //Motor Tor links auf an Pin 1
int HMTL=2; //Haltemagnet Tor links an Pin 2
int MTLZ=3; //Motor Tor links zu an Pin 3
int ZTR=4; //Zugmagnet Tor rechts an Pin 4
int MTRA=5; //Motor Tor rechts auf an Pin 5
int HMTR=6; //Haltemagnet Tor rechts an Pin 6
int MTRZ=7; //Motor Tor rechts zu an Pin 7
const int ETLA=8; //Endschalter Tor links auf an Pin 8
const int ETLZ=9; //Endschalter Tor links zu an Pin 9
const int ETRA=10; //Endschalter Tor rechts auf an Pin 10
const int ETRZ=11; //Endschalter Tor recht zu an Pin 11
int TA=A0; //Tor Auf Taster an Pin A0
int TZ=A1; //Tor zu Taster an Pin A1
int tasterstatus_TA=0;
int tasterstatus_TZ=0;


void setup() 
{
 pinMode (ZTL, OUTPUT);
 pinMode (MTLA, OUTPUT);
 pinMode (HMTL, OUTPUT);
 pinMode (MTLZ, OUTPUT);
 pinMode (ZTR, OUTPUT);
 pinMode (MTRA, OUTPUT);
 pinMode (HMTR, OUTPUT);
 pinMode (MTRZ, OUTPUT);
 pinMode (TA, INPUT);
 pinMode (TZ, INPUT);
 pinMode (ETLA, INPUT);
 pinMode (ETLZ, INPUT);
 pinMode (ETRA, INPUT);
 pinMode (ETRZ, INPUT);
}


void loop()
{
 digitalRead(TA);
 if ((tasterstatus_TA==HIGH)&&(ETLZ==HIGH))    //wenn Taster gedrückt und Endschalter Tor links zu aktiviert ist, dann
{                                              
   digitalWrite (ZTL, HIGH);                   //Zugmagnet Tor links anziehen
   delay (1000);                               //warte 1sek
   digitalWrite (MTLA, HIGH);                  //starte Motor Tor links auf
   delay (5000);                               //warte 5sek
   digitalWrite (ZTL, LOW);                    //Zugmagnet Tor links abfallen
 }
 else                                          //wenn nicht, dann
 {
   digitalWrite (ZTL, LOW);                    //Zugmagnet Tor links AUS
   digitalWrite (MTLA, LOW);                   //Motor Tor links auf AUS
 }
 if (ETLA == HIGH)                             //wenn Endschalter Tor links auf aktiviert ist, dann
 {                                             
   digitalWrite (HMTL, HIGH);                   //Haltemagnet Tor links anziehen
   digitalWrite (MTLA, LOW);                   //Motor Tor links abschalten
   digitalWrite (ZTR, HIGH);                   //Zugmagnet Tor rechts anziehen
   delay (1000);                               //warte 1sek
   digitalWrite (MTRA, HIGH);                  //starte Motor Tor rechts Auf
   delay (5000);                               //warte 5sek
   digitalWrite (ZTR, LOW);                    //Zugmagnet Tor rechts abfallen
 }
 else                                          //wenn nicht, dann
 {
 digitalWrite (MTLA, HIGH);                    //Motor Tor links auf AN
 digitalWrite (ZTR, LOW);                      //Zugmagnet Tor rechts AUS
 digitalWrite (MTRA, LOW);                     //Motor Tor rechts AUS
 }
 if (ETRA == HIGH)                             //wenn Endschalter Tor rechts auf aktiviert ist, dann
 {                                             
   digitalWrite (HMTR, HIGH);                  //Haltemagnet Tor rechts anziehen                                            
   digitalWrite (MTRA, LOW);                   //Motor Tor rechts abschalten
 }
 else                                          //wenn nicht, dann
 {
   digitalWrite (HMTR, LOW);                   //Haltemagnet Tor rechts AUS
   digitalWrite (MTRA, HIGH);                  //Motor Tor rechts AN
 }
 digitalRead(TZ);
 if ((tasterstatus_TZ==HIGH)&&(ETRA==HIGH))    //wenn Taster gedrückt und Endschalter Tor rechts auf aktiviert ist, dann
 {                                             
   digitalWrite (HMTR, LOW);                   //Haltemagnet Tor rechts AUS
   delay (1000);                               //warte 1sek
   digitalWrite (MTRZ, HIGH);                  //starte Motor Tor rechts zu 
   delay (1000);                               //warte 1sek
   digitalWrite (ZTR, HIGH);                   //Zugmagnet Tor rechts anziehen
 }
 else                                          //wenn nicht, dann
 {
   digitalWrite (HMTR, HIGH);                  //Haltemagnet Tor rechts AN
   digitalWrite (MTRZ, LOW);                   //Motor Tor rechts zu AUS
   digitalWrite (ZTR, LOW);                    //Zugmagnet Tor rechts AUS
 }
 if (ETRZ == HIGH)                             //wenn Endschalter Tor rechts zu aktiviert ist, dann
 {                                             
   delay (200);                                //warte 0,2sek
   digitalWrite (ZTR, LOW);                    //Zugmagnet Tor rechts abfallen
   delay (400);                                //warte 0,4sek
   digitalWrite (MTRZ, LOW);                   //stoppe Motor Tor rechts zu
 }
 else
 {
   digitalWrite (ZTR, HIGH);                    //Zugmagnet Tor rechts AN
   digitalWrite (MTRZ, HIGH);                   //Motor Tor rechts zu AN
 }
 if (ETRZ == HIGH)                             //wenn Endschalter Tor rechts zu aktiviert ist, dann
 {                                             
   digitalWrite (HMTL, LOW);                   //Haltemagnet Tor links abfallen
   delay (1000);                               //warte 1sek
   digitalWrite (MTLZ, HIGH);                  //starte Motor Tor links zu 
   delay (1000);                               //warte 1sek
   digitalWrite (ZTL, HIGH);                   //Zugmagnet Tor links anziehen
 }
 else                                          //wenn nicht, dann
 {
   digitalWrite (HMTL, HIGH);                  //Haltemagnet Tor links angezogen
   digitalWrite (MTLZ, LOW);                   //Motor Tor links zu AUS
   digitalWrite (ZTL, LOW);                    //Zugmagnet Tor links AUS
 }
 if (ETLZ == HIGH)                             //wenn Endschalter Tor links zu aktiviert ist, dann
 {                                             
   delay (200);                                //warte 0,2sek
   digitalWrite (ZTL, LOW);                    //Zugmagnet Tor links abfallen
   delay (200);                                //warte weitere 0,2sek
   digitalWrite (MTLZ, LOW);                   //und schalte Motor Tor links aus
 }
 else                                          //wenn nicht, dann
 {                                             
   digitalWrite (ZTL, HIGH);                   //Zugmagnet Tor links anziehen
   digitalWrite (MTLZ, HIGH);                   //Motor Tor links zu AN
 }
}

soll dein Tor in Totmannschaltung laufen? Was geben die Endschalter für ein Signal bei Betätigung (High oder Low)?

"HIGH" sind schließkontakte

Wenn ich mir mal nur diesen Code-Schnipsel anschaue:

 if ((digitalRead(TA)==HIGH)&&(ETLZ==HIGH))    //wenn Taster gedrückt und Endschalter Tor links zu angezogen, dann
 {                                             
    digitalWrite (ZTL, HIGH);                   //Zugmagnet Tor links anziehen
    delay (1000);                               //warte 1sek
    digitalWrite (MTLA, HIGH);                  //starte Motor Tor links auf
    delay (5000);                               //warte 5sek
    digitalWrite (ZTL, LOW);                    //Zugmagnet Tor links abfallen
  }
  else                                          //wenn nicht, dann
  {
    digitalWrite (ZTL, LOW);                    //Zugmagnet Tor links AUS
    digitalWrite (MTLA, LOW);                   //Motor Tor links auf AUS
  }

dann schaltest Du den Motor nach 6 Sekunden wieder aus, wenn da der Auf-Taster nicht mehr gedrückt ist. Ist das Tor da noch nicht auf, erreicht es nie den Endschalter. Ist es dann aber schon auf, ist es voll gegen den Endschalter gefahren.

So eine Steuerung ist übrigends ein klassischer Fall für eine State-Machine ;-))
Delays sind in so einer Steuerung auch suboptimal, da Du während der Zeit keine Endschalter abfragen kannst. Und Endschalter sollten immer mit höchster Prio abgefragt werden ( oder schaltet der Endschalter den Motor auch HW-mäßig aus ? )

Batman86:
"HIGH" sind schließkontakte

Schließkontakt bedeutet nicht automatisch 'HIGH'. Das kommt drauf an, wie das ganze verdrahtet ist.

#11

Vergessen wie man Code einfügt?

OneButton angeschaut?

MicroBahner:
Wenn ich mir mal nur diesen Code-Schnipsel anschaue:

 if ((digitalRead(TA)==HIGH)&&(ETLZ==HIGH))    //wenn Taster gedrückt und Endschalter Tor links zu angezogen, dann

{                                           
    digitalWrite (ZTL, HIGH);                  //Zugmagnet Tor links anziehen
    delay (1000);                              //warte 1sek
    digitalWrite (MTLA, HIGH);                  //starte Motor Tor links auf
    delay (5000);                              //warte 5sek
    digitalWrite (ZTL, LOW);                    //Zugmagnet Tor links abfallen
  }
  else                                          //wenn nicht, dann
  {
    digitalWrite (ZTL, LOW);                    //Zugmagnet Tor links AUS
    digitalWrite (MTLA, LOW);                  //Motor Tor links auf AUS
  }



dann schaltest Du den Motor nach 6 Sekunden wieder aus, wenn da der Auf-Taster nicht mehr gedrückt ist. Ist das Tor da noch nicht auf, erreicht es nie den Endschalter. Ist es dann aber schon auf, ist es voll gegen den Endschalter gefahren.

So eine Steuerung ist übrigends ein klassischer Fall für eine State-Machine ;-))
Delays sind in so einer Steuerung auch suboptimal, da Du während der Zeit keine Endschalter abfragen kannst. Und Endschalter sollten immer mit höchster Prio abgefragt werden ( oder schaltet der Endschalter den Motor auch HW-mäßig aus ? )

wieso schaltet der Motor nach 6sek wieder aus?

hast du pulldown Widerstände verbaut?

Batman86:
wieso schaltet der Motor nach 6sek wieder aus?

Wenn deine 2 delays abgelaufen sind, wird dein loop() ja wieder von vorne gestartet ( mir ist auf die Schnelle nichts aufgefallen, dass danach noch etwas kommt, was den Ablauf anhält ). Ist der Taster dann nicht mehr gedrückt kommst Du in den else-Zweig, und da wird der Motor abgeschaltet.