Steuerung funktioniert nicht

Hallöchen Liebe Leute.

Ich hoffe das ich euch mit diesem Post nicht den Tag versaue, denn ich persönlich habe ein bischen daran zu knacken grade. Denn ich bin bezwungen mich mit der Thematik auseinander zu setzen, auch wenn ich vorher nicht wirklich was mit Microcontrolern zu tun hatte. Dementsprechend hoffe ich das ihr mir weiter helfen könnt.

In dem folgenden Bild sehr ihr den Plan nachdem verdrehtet wurde.

http://www.directupload.net/file/d/3944/uq4os6xj_jpg.htm

In den Folgenden 2 Bildern sieht es zwar noch leicht wirr aus aber es ist dennoch nach dem oben gezeigten Plan verdrehtet.

http://www.directupload.net/file/d/3944/4qta37n7_jpg.htm

http://www.directupload.net/file/d/3944/luxhzdjl_jpg.htm

PIN 1 soll dann dafür sorgen das die geplante Anlage eingeschaltet werden soll. Dies allerdings ohne Interrupt Befehl.

PIN 2 liest den schließer Kontakt aus und löst dann einen Interrupt Befehl aus, dieser soll später unsere Anlage auf start zurück setzen

PIN 3 liest den schließer Kontakt aus und soll das laufende Programm unterbrechen / stoppen

PIN 18 liest den schließer Kontakt aus und soll das laufende Programm unterbrechen / stoppen

PIN 19 liest den schließer Kontakt aus und soll das laufende Programm unterbrechen / stoppen

PIN 7 / liest den schließer Kontakt aus

PIN 10 / liest den schließer Kontakt aus

PIN 12 / liest den schließer Kontakt aus

PIN 13 / liest den schließer Kontakt aus

PIN 14 / liest den schließer Kontakt aus

PIN 16 / liest den schließer Kontakt aus

PIN 17 / liest den schließer Kontakt aus

PIN 49 /ansteuerung Relaikantakt IN1

PIN 47 /ansteuerung Relaikantakt IN2

PIN 45 /ansteuerung Relaikantakt IN3

PIN 43 /ansteuerung Relaikantakt IN4

PIN 41 /ansteuerung Relaikantakt IN5

PIN 39 /ansteuerung Relaikantakt IN6

PIN 37 /ansteuerung Relaikantakt IN7

soo... und jetzt mein geschriebener Text dazu... habe den schon zich mal geändert und bin grade echt durch... also bitte lüncht mich nicht T.T

#define pin_Einschalten                                     1

#define pin_EndschalterKontaktLinksGeschlossen             13

boolean EndschalterKontaktLinksGeschlossen;

#define pin_WasserpumeEIN                                  41  // geht auf Relaiskarte K5(IN5)
#define pin_StartAntriebRechtslaufEIN                      45  // geht auf Relaiskarte K3(IN3)(AUF vom SiemansAntrieb)
#define pin_MagnetFuerSchwammeinheitErreicht               7
#define pin_BetaetigenSchwammeinheitVor                    39  // geht auf Relaiskarte K6(IN6)(Spindelmotoren)
#define pin_MagnetFuerWischerLinksErreicht                 10
#define pin_BetaetigenWischerLinksVor                      49 // geht auf Relaiskarte K1(IN1)
#define pin_BetaetigenSchwammeinheitZurueck                37  // geht auf Relaiskarte K7(IN7)(Spindelmotoren)
#define pin_EndschalterKontaktRechtsGeschlossen            12

boolean WasserpumeEIN;
boolean StartAntriebRechtslaufEIN;
boolean MagnetFuerSchwammeinheitErreicht;
boolean BetaetigenSchwammeinheitVor;
boolean MagnetFuerWischerLinksErreicht;
boolean BetaetigenWischerLinksVor;
boolean BetaetigenSchwammeinheitZurueck;
boolean EndschalterKontaktRechtsGeschlossen;

#define pin_StartAntriebLinkslaufEIN                        43  //geht auf Relaiskarte K4(IN4)(AUF vom SiemansAntrieb)
#define pin_MagnetFuerWischerRechtsErreicht                 14
#define pin_BetaetigenWischerRechtsVor                      47 // geht auf Relaiskarte K2(IN2)

boolean StartAntriebLinkslaufEIN;
boolean MagnetFuerWischerRechtsErreicht;
boolean BetaetigenWischerRechtsVor;

#define pin_EndschalterSchwammeinheitVor                    16
#define pin_EndschalterSchwammeinheitZurueck                17

boolean EndschalterSchwammeinheitVor;
boolean EndschalterSchwammeinheitZurueck;

#define ja false
#define nein true

boolean START = nein;

void setup()
{ 
 pinMode (pin_Einschalten, INPUT);

 pinMode (pin_EndschalterKontaktLinksGeschlossen, INPUT);

 pinMode (pin_WasserpumeEIN, OUTPUT);
 pinMode (pin_StartAntriebRechtslaufEIN, OUTPUT);
 pinMode (pin_MagnetFuerSchwammeinheitErreicht, INPUT);
 pinMode (pin_BetaetigenSchwammeinheitVor, OUTPUT);
 pinMode (pin_MagnetFuerWischerLinksErreicht, INPUT);
 pinMode (pin_BetaetigenWischerLinksVor, OUTPUT);
 pinMode (pin_EndschalterKontaktRechtsGeschlossen, INPUT);
 pinMode (pin_BetaetigenSchwammeinheitZurueck, OUTPUT);

 pinMode (pin_StartAntriebLinkslaufEIN, OUTPUT);
 pinMode (pin_MagnetFuerWischerRechtsErreicht, INPUT);
 pinMode (pin_BetaetigenWischerRechtsVor, OUTPUT);

 pinMode (pin_EndschalterSchwammeinheitVor, INPUT);
 pinMode (pin_EndschalterSchwammeinheitZurueck, INPUT);

 attachInterrupt (0,RESET,FALLING);                                    // PIN 2 
 attachInterrupt (1,LichtschrankeNichtUnterbrochen,FALLING);           // PIN 3
 attachInterrupt (5,WasserbehaelterLeer,FALLING);                      // PIN 18
 attachInterrupt (4,RevisierkontaktNichtUnterbrochen,FALLING);         // PIN 19
}

void Einschalten()
{
START = ja;
}

void RESET()
{
 digitalWrite (WasserpumeEIN, HIGH);
 digitalWrite (BetaetigenSchwammeinheitVor, HIGH);
 delay (100);
 digitalWrite (BetaetigenSchwammeinheitZurueck, LOW);
  if (EndschalterSchwammeinheitZurueck==1)
   {
     (BetaetigenSchwammeinheitZurueck, HIGH);
   } 
 digitalWrite (BetaetigenWischerLinksVor, HIGH);
 digitalWrite (BetaetigenWischerRechtsVor, HIGH);
 digitalWrite (StartAntriebLinkslaufEIN, LOW);
}[code]

[/code]

void LichtschrankeNichtUnterbrochen()
{
 START = nein;
}

void WasserbehaelterLeer()
{
 START = nein;
}

void RevisierkontaktNichtUnterbrochen()
{
 START = nein;
}


//***********************************************************************************
//   Hauptprogramm
//***********************************************************************************

void loop()
{ 
if(START==0)
 {
   EndschalterKontaktLinksGeschlossen  = digitalRead(pin_EndschalterKontaktLinksGeschlossen);
   EndschalterKontaktRechtsGeschlossen  = digitalRead(pin_EndschalterKontaktRechtsGeschlossen);
  {
     if(EndschalterKontaktLinksGeschlossen==true && EndschalterKontaktRechtsGeschlossen==false)
       {
          ReinigungsrichtungRechts();
       }
      else
      {
      if(EndschalterKontaktLinksGeschlossen==false && EndschalterKontaktRechtsGeschlossen==true)
       {
           ReinigungsrichtungLinks();
       } 
      }
   }
 }
}

void ReinigungsrichtungRechts()
{
 digitalWrite (WasserpumeEIN, LOW);
 delay (4000);
 digitalWrite (StartAntriebRechtslaufEIN, HIGH);
  do
   {
     MagnetFuerSchwammeinheitErreicht = digitalRead(pin_MagnetFuerSchwammeinheitErreicht);
   } while (MagnetFuerSchwammeinheitErreicht==false);
 digitalWrite (BetaetigenSchwammeinheitVor, LOW);
   if (EndschalterSchwammeinheitVor==FALLING)
    {
      (BetaetigenSchwammeinheitVor,HIGH);
    } 
  do
   {
     MagnetFuerWischerLinksErreicht = digitalRead(pin_MagnetFuerWischerLinksErreicht);
   } while (MagnetFuerWischerLinksErreicht==false);
 digitalWrite (BetaetigenWischerLinksVor, LOW);
  do
   {
     MagnetFuerSchwammeinheitErreicht = digitalRead(pin_MagnetFuerSchwammeinheitErreicht);
   } while (MagnetFuerSchwammeinheitErreicht==true);
 digitalWrite (BetaetigenSchwammeinheitZurueck, LOW);
 digitalWrite (WasserpumeEIN, HIGH);
   if (EndschalterSchwammeinheitZurueck==FALLING)
    {
      (BetaetigenSchwammeinheitZurueck,HIGH);
    } 
  do
   {
     MagnetFuerWischerLinksErreicht = digitalRead(pin_MagnetFuerWischerLinksErreicht);
   } while (MagnetFuerWischerLinksErreicht==false);
 digitalWrite (BetaetigenWischerLinksVor, HIGH);
  do
  {
    EndschalterKontaktRechtsGeschlossen = digitalRead(pin_EndschalterKontaktRechtsGeschlossen);
  } while (EndschalterKontaktRechtsGeschlossen==false);
  digitalWrite (StartAntriebRechtslaufEIN, HIGH);
}

void ReinigungsrichtungLinks()
{
 digitalWrite (WasserpumeEIN, HIGH);
 delay (4000);
 digitalWrite (StartAntriebLinkslaufEIN, HIGH);
  do
   {
     MagnetFuerSchwammeinheitErreicht = digitalRead(pin_MagnetFuerSchwammeinheitErreicht);
   } while (MagnetFuerSchwammeinheitErreicht==false);
 digitalWrite (BetaetigenSchwammeinheitVor, HIGH);
  do
   {
     MagnetFuerWischerRechtsErreicht = digitalRead(pin_MagnetFuerWischerRechtsErreicht);
   } while (MagnetFuerWischerRechtsErreicht==false);
 digitalWrite (BetaetigenWischerRechtsVor, HIGH);
  do
   {
     MagnetFuerSchwammeinheitErreicht = digitalRead(pin_MagnetFuerSchwammeinheitErreicht);
   } while (MagnetFuerSchwammeinheitErreicht==false);
 digitalWrite (BetaetigenSchwammeinheitZurueck, HIGH);
 digitalWrite (WasserpumeEIN, LOW);
  do
   {
     MagnetFuerWischerRechtsErreicht = digitalRead(pin_MagnetFuerWischerRechtsErreicht);
   } while (MagnetFuerWischerRechtsErreicht==false);
 digitalWrite (BetaetigenWischerRechtsVor, LOW);
  do
  {
    EndschalterKontaktLinksGeschlossen = digitalRead(pin_EndschalterKontaktLinksGeschlossen);
  } while (EndschalterKontaktLinksGeschlossen==false);
  digitalWrite (StartAntriebLinkslaufEIN, LOW);
}

Ich denke ich habe Fehler mit den boolean Werten gemacht, weis es aber nicht genau, hat wer eine oder am besten mehrere Lösungsideen sofern die Muße dafür da ist?

LG, Sven

Schon mal was von CODE TAGs gehört? Wenn Ja bitte benutze sie, wenn nein, benutze sie trotzdem. ;) Grüße Uwe

[EDIT]ok, hab die TAGs selbst hinzugefügt.[/EDIT]

… und was ist eigentlich dein Problem ?
→ “Es geht nicht” ist keine hilfreiche Antwort

Fehlermeldungen beim Übersetzen (Verifizieren)?
→ Bitte als Text einfügen, nicht als Video

:wink:

Das ist ja mein Problem, sorry hatte ich nicht dabei geschrieben... Beim Verifizieren bzw. Kompilieren treten keine Probleme auf. Auch gibt es keine Fehlermeldung beim Übertragen auf den Arduino.

Das scheint wieder mal eine sehr gute Anwendung für einen Zustands-Automaten zu sein. Am besten gleich richtig machen anstatt Code auszubessern, der sowieso nicht gut ist.

Wenn man das vernünftig macht braucht man da eigentlich auch keine Interrupts.

Was auffällt: Variablen die innerhalb und außerhalb von Interrupt Routinen verwendet werden müssen als "volatile" deklariert werden

Beim Verifizieren bzw. Kompilieren treten keine Probleme auf. Auch gibt es keine Fehlermeldung beim Übertragen auf den Arduino.

sondern ?

Es lässt sich keiner den Tag versauen, aber durch deinen Text mit zwei Dutzend Kontakten und pipapo arbeitet sich wohl keiner durch, nur um zu raten, was du wohl anders gedacht als programmiert hast.

  • Ganz generell helfen manchmal Serial.println-Ausgaben als Debugging-Ersatz, wenn der Sketch was anderes macht als du denkst.

  • Was immer ein "Interrupt-Befehl" sein soll, gebe ich dir erstmal recht, dass man sowas bei deiner Maschinensteuerung mit mechanischen Kontakten nicht brauchen sollte. Allerdings ist delay(4000) und do {} while() gefährlich, wenn in der while Schleife nur ein Kontakt abgefragt wird.

Da deine Interrupt-Routinen nur die Variable START abschalten, und du START nur am Anfang von loop() einmal abfragst, darfst du auch in loop keine Schleifen und delay() einbauen. ( Und brauchst dann auch keine Interrupt-Handler )

  • Was ist eigentlich mit "Prellen" ? Stört das nicht ?