unsigned long auf 0 setzen?

hi

ich such nach einer moeglicht 3 unsigned longs auf 0 zu setzen nachedem das programm einen punkt durchlaufen hat.

hilft mir da wer auf die sprünge??

if(punkt == true)
{
a = 0;
b = 0;
c = 0;
}

Etwas kürzer, aber sonst identisch:

if(punkt) a=b=c=0UL;

okay für was steht 0ul?

die 3 longs heissen

laufzeitlueftung
laufzeitheizung
startzeitlueftung

ich hab einen VOID

void Alles Aus ()
lueftungAus ();
heizungAus ();
heizungIstAn=0;
lueftungIstAn=0;
....

kopier ich dort folgendes rein

laufzeitlueftung=0;
laufzeitheizung=0;
startzeitlueftung=0;

gehen diese zeiten nicht auf 0.

was ist daran falsch?

durch aufruf des voids geht alles aus.. also müsste es doch möglichsein das er mit aufruf des voids auch die werte der 3 unsigned longs auf 0 setzt.

danke schonmal.. bitte erläutert mir das mal.
ist die if abfrage zwingend notwendig?

sonst könnte man ja so machen

void Alles Aus ()
lueftungAus ();
heizungAus ();
heizungIstAn=0;
lueftungIstAn=0;
allesausgeschaltet=1;

void loop ()
if (allesausgeschaltet ==1) laufzeitlueftung=laufzeitheizung=
startzeitlueftung=0UL;

gibt es da nicht ne noch einfachere lösung den nun könnte ich mir fehler einbauen.... nur fürs Verständnis. ....

danke

okay für was steht 0ul?

U == Unsigned
L == Long
Damit wird der Datentype deiner Null erzwungen, sonst wird automatisch konvertiert.

ich hab einen VOID

void == unbestimmt, irrelevant
Du hast also einen "irrelevant"!
? ? ?

durch aufruf des voids

Wie ruft man einen "unbestimmt" auf?
Du meinst sicherlich:
Ich rufe eine Funktion auf.

kopier ich dort folgendes rein

laufzeitlueftung=0;
laufzeitheizung=0;
startzeitlueftung=0;

gehen diese zeiten nicht auf 0.

Doch, sollten sie tun.
Und wenn nicht, machst du irgendwas, irgendwo, falsch.

könntest du dir den code mal anschauen?

ich hab das rücksetzen der zeiten noch ausgelassen...

ich komm hier nicht weiter....

#include <SoftwareSerial.h>
String readString; //Puffert die eingehenden Symbole vom GSM MODUL


const int Webasto = 5;              // Relais 1
const int Klimabedienteil = 6;      // Relais 2
const int shield = 9;
const int Pumpe = 10;               // Relais 3
const int StandLueften = 11;        // Relais 4

int StandlueftungAn = 0;
int WebastoState = 0;
int lueftungIstAn = 0;
int heizungIstAn = 0;

int ergebnis = 0; // ergebnis des sms empfangs
int arbeiten = 0; // wir haben was zu tun

unsigned long Startzeit = 0;
unsigned long LaufzeitHeizung = 0;

unsigned long LaufzeitLueftung = 0;
unsigned long StartzeitLueftung = 0;

unsigned long LaufzeitStandLueftung = 0;
unsigned long StartzeitStandLueftung = 0;
unsigned long EndzeitStandLueftung = 0;

unsigned long UmschaltzeitLueftung = 0;

SoftwareSerial SIM900(7, 8);
void setup()
{
  Serial.begin(19200);
  pinMode(Webasto, OUTPUT);
  digitalWrite(Webasto, HIGH);
  pinMode(Klimabedienteil, OUTPUT);
  digitalWrite(Klimabedienteil, HIGH);
  pinMode(shield, OUTPUT);
  digitalWrite(shield, LOW);
  pinMode(Pumpe, OUTPUT);
  digitalWrite(Pumpe, HIGH);
  pinMode(StandLueften, OUTPUT);
  digitalWrite(StandLueften, HIGH);


  // GSM SHIELD Aktivieren
  Serial.println("Einschalten GSM");
  digitalWrite(shield, HIGH);
  delay(1500);
  digitalWrite(shield, LOW);
  delay(1000);
  digitalWrite(shield, HIGH);
  Serial.println("GSM BOOTEN");
  SIM900.begin(19200);
  delay(6000); // Zeit zum Einloggen
  Serial.println("GSM SMS AKTIVIEREN");
  SIM900.print("AT+CMGF=1\r"); // setzt SMS Mode
  delay(100);
  SIM900.print("AT+CNMI=2,2,0,0,0\r");// gibt SMS direkt an den Arduino weiter
  delay(100);
  Serial.println("Modul BEREIT...");
  lueftungIstAn = 0;
  heizungIstAn = 0;
}
void loop()
{
  unsigned long w = 1;  //Standlueftung
  unsigned long x = 2; //Heizungszeit
  unsigned long y = 1; //Lüftungszeit
  unsigned long z = 5;  //Lüftung anheben nach 5 Minuten KlimabedienteilAn


  leseShield();
  if ( ergebnis > 0 )// schauen ob es eine sms gibt
  {
    {
      ergebnis = 0; // nus ein mal !!
      arbeiten = 1; // aber arbeiten
      Startzeit = 0;
      LaufzeitHeizung = 0;
      LaufzeitLueftung = 0;
      StartzeitLueftung = 0;
      lueftungIstAn = 0;
      heizungIstAn = 0;
      StandlueftungAn = 0;
      LaufzeitStandLueftung = 0;  // Laufzeit Standlueftung
      StartzeitStandLueftung = 0; // Einschaltzeit Standlueftung
      EndzeitStandLueftung = 0;   // Ausschaltzeit Standlueftung
      Startzeit = millis();

      if (( x > 0 ) and (arbeiten = 1))
      { arbeiten = 2;
        WebastoEIN();
        // ausrechnen wann Heizung aus soll
        LaufzeitHeizung = Startzeit + (60000 * x);
      }
      

      if (( y > 0 ) and (arbeiten = 2))
      { arbeiten = 3;
        // Heizung laeuft laenger wie Lüeftung dann fängt Lüftung später an
        if ( x > y )
        {
          StartzeitLueftung = Startzeit + (60000 * (x - y));
        }
        else
        {
          StartzeitLueftung = Startzeit;
        }
        // ausrechnen wann Lüftung aus soll, dabei Startzeit beachten
        LaufzeitLueftung = StartzeitLueftung + (60000 * y);
      }
    } // ende an
  } // ende lese sms

  if (arbeiten > 0)
    if (lueftungIstAn == 0)
      if (StartzeitLueftung >= Startzeit)
        if (StartzeitLueftung <= millis())
          if (LaufzeitLueftung >= millis())
            KlimabedienteilAN();

  if (arbeiten > 0)
    if (heizungIstAn == 1)
      if (LaufzeitHeizung < millis()) WebastoAUS();

    if (arbeiten > 0)
    if (lueftungIstAn == 1)
      if (StartzeitLueftung >= Startzeit )
        if ((LaufzeitLueftung < millis()) ) AllesAUS();


}

void AllesAUS()
{
  StandLueftungAUS();
  WebastoAUS();
  delay(1000);
  PumpeAus();
  delay(2000);
  KlimabedienteilAUS();
  lueftungIstAn = 0;
  heizungIstAn = 0;
  Serial.println("Heizung und Lueftung AUS Handbetrieb moeglich...");
}

void WebastoEIN()// SOLL 20 MINUTEN LAUFEN
{
  KlimabedienteilAUSFUNK();
  delay(1000);
  PumpeAn();
  delay(1500);
  digitalWrite(Webasto, LOW);
  lueftungIstAn = 0;
  heizungIstAn = 1;
  Serial.println("Heizung AN... .. . In 9 Minuten geht die Lueftung AN...");
}

void WebastoAUS()
{
  digitalWrite(Webasto, HIGH);
  heizungIstAn = 0;
  Serial.println("Heizung AUS...");
}

void KlimabedienteilAN()// SOLL NACH 9 MINUTEN STARTEN
{
  digitalWrite(Klimabedienteil, HIGH);
  delay(1000);
  KlimabedienteilEinstellen();
  lueftungIstAn = 1;
  Serial.println("Klimabedienteil AN fuer 11 Minuten...");
}

void KlimabedienteilAUS()
{
  digitalWrite(Klimabedienteil, HIGH);
  lueftungIstAn = 0;
  Serial.println("Klimabedienteil AUS... Durchgang Webasto Steuert");
}

void KlimabedienteilAUSFUNK()
{
  digitalWrite(Klimabedienteil, LOW);
  lueftungIstAn = 0;
  Serial.println("Klimabedienteil AUS... Arduino Steuert");
}

void KlimabedienteilEinstellen()
{
  Serial.println("Klimabedienteil auf niedrigste Luefterstufe, belueftung der Frontscheibe");
}

void KlimabedienteilRegeln()
{
  Serial.println("Klimabedienteil.. .. Lüfter auf mittlere Stufe");
}
void PumpeAn()
{
  digitalWrite(Pumpe, LOW);
  Serial.println("Wasserpume AN... ..Steuerung durch Webasto");
}
void PumpeAus()
{
  digitalWrite(Pumpe, HIGH);
  Serial.println("Wasserpumpe AUS... ..Steuerung durch Klimabedienteil");
}

void StandLueftungEIN() //5 Minuten!
{
  PumpeAn();
  digitalWrite(StandLueften, LOW);
  digitalWrite(Klimabedienteil, LOW);
  delay(1000);
  KlimabedienteilEinstellen();
  StandlueftungAn = 1;
  Serial.println("StandLueftung und Klimabedienteil..... ..EIN");
}
void StandLueftungAUS()
{
  PumpeAus();
  digitalWrite(StandLueften, HIGH);
  digitalWrite(Klimabedienteil, HIGH);
  StandlueftungAn = 0;
  Serial.println("StandLueftung und Klimabedienteil..... ..AUS");
}

int leseShield()

{ ergebnis = 0;
  // Texterkennung
  while (Serial.available())
  {
    ergebnis = 1;
    delay(100);
    char c = Serial.read();
    readString += c;
  }
  if (readString.length() > 0)
  {
    readString.trim();
    Serial.println(readString);

    if (readString.indexOf("#an") >= 0)
    {
      WebastoEIN();
      arbeiten = 1;
    }

    if (readString.indexOf("*an") >= 0)
    {
      StandLueftungEIN();
      arbeiten = 1;
    }

    if (readString.indexOf("#aus") >= 0)
    {
      AllesAUS();
      arbeiten = 0;
    }

    if (readString.indexOf("*aus") >= 0)
    {
      StandLueftungAUS();
      arbeiten = 0;
    }

    readString = "";
    delay(10);
    SIM900.println("AT+CMGD=1,4"); // alle SMS loeschen
    Serial.println("ALLE SMS geloescht...");
    return ergebnis;
  }
}

man kanns am serial monitor durchspielen...

sende ich #an und lass es durchlaufen ist alles ok
sende ich #an und nach 30sek. #aus läuft er nach 1 min das klimabedienteil an und nach 2 schaltet er alles aus....

mich machts wahnsinnig.. bin n absoluter anfänger

#include <SoftwareSerial.h>
String readString; //Puffert die eingehenden Symbole vom GSM MODUL


const int Webasto = 5;              // Relais 1
const int Klimabedienteil = 6;      // Relais 2
const int shield = 9;
const int Pumpe = 10;               // Relais 3
const int StandLueften = 11;        // Relais 4

int StandlueftungAn = 0;
int WebastoState = 0;
int lueftungIstAn = 0;
int heizungIstAn = 0;

int ergebnis = 0; // ergebnis des sms empfangs
int arbeiten = 0; // wir haben was zu tun

unsigned long Startzeit = 0;
unsigned long LaufzeitHeizung = 0;

unsigned long LaufzeitLueftung = 0;
unsigned long StartzeitLueftung = 0;

unsigned long LaufzeitStandLueftung = 0;
unsigned long StartzeitStandLueftung = 0;
unsigned long EndzeitStandLueftung = 0;

unsigned long UmschaltzeitLueftung = 0;

SoftwareSerial SIM900(7, 8);
void setup()

müsste es nicht vor dem void setup ()

so aussehen?!...

#include <SoftwareSerial.h>
String readString; //Puffert die eingehenden Symbole vom GSM MODUL


const int Webasto = 5;              // Relais 1
const int Klimabedienteil = 6;      // Relais 2
const int shield = 9;
const int Pumpe = 10;               // Relais 3
const int StandLueften = 11;        // Relais 4

int StandlueftungAn = 0;
int WebastoState = 0;
int lueftungIstAn = 0;
int heizungIstAn = 0;

int ergebnis = 0; // ergebnis des sms empfangs
int arbeiten = 0; // wir haben was zu tun

unsigned long Startzeit;
unsigned long LaufzeitHeizung;

unsigned long LaufzeitLueftung;
unsigned long StartzeitLueftung;

unsigned long LaufzeitStandLueftung;
unsigned long StartzeitStandLueftung;
unsigned long EndzeitStandLueftung;

unsigned long UmschaltzeitLueftung;

SoftwareSerial SIM900(7, 8);
void setup()

ich habe deinen Sketch gerademal überflogen, dabei ist mir ein Fehler ins Auge gesprungen

 if (( x > 0 ) and (arbeiten = 1))
      { arbeiten = 2;
        WebastoEIN();
        // ausrechnen wann Heizung aus soll
        LaufzeitHeizung = Startzeit + (60000 * x);
      }

Vergleich :==
Zuweisung:=
das gleiche hier:

if (( y > 0 ) and (arbeiten = 2))
{ arbeiten = 3;
// Heizung laeuft laenger wie Lüeftung dann fängt Lüftung später an
if ( x > y )
{
StartzeitLueftung = Startzeit + (60000 * (x - y));
}
else
{
StartzeitLueftung = Startzeit;
}
// ausrechnen wann Lüftung aus soll, dabei Startzeit beachten
LaufzeitLueftung = StartzeitLueftung + (60000 * y);
}

ob das funktioniert,
if (( x > 0 ) and (arbeiten = 1))
(and) kann ich dir nicht sagen .Frage für die C-Spezialisten
(=) Zuweisung

if (( x > 0 ) and (arbeiten == 1))
      { arbeiten = 2;
        WebastoEIN();
        // ausrechnen wann Heizung aus soll
        LaufzeitHeizung = Startzeit + (60000 * x);
      }

so sollte es sein oder?

endlich mal ne hilfe :slight_smile:

die frage ist warum er laufzeitheizung als 0 ausgibt und wie ich das ausgerechnet bekomme... und wie ich es auf 0 setze...

totaler anfänger eben.... danke danke danke

könntest du dir den code mal anschauen?

Done!

Erst mal zum sozialen Aspekt:

totaler anfänger eben.

Bitte wiederhole diesen Unsinn nicht öfter.
Sonst zementierst du diesen Zustand.
Baust innere Blockaden auf.

Wie sehen das auch so, ohne dass du dich selber bemitleidest...

Entscheide dich: Willst du vorwärts kommen, oder nur heulen?
Beim vorwärts kommen kann ich dir evtl. helfen.
Von der Heulerei wende ich mich einfach nur ab.

Jetzt zum fachlichen:
Mir gefallen deine Zeitabhandlungen nicht.
Das Programm soll vermutlich ein Dauerläufer werden....
Deine Zeitabhandlungen fallen nach ca 50 Tagen voll aus dem Rahmen.
Da steckt ein Defekt im Code.
Siehe dazu: "Blink without Delay"

Das Ganze macht auf mich den Eindruck, als sollte das eine "Ablaufsteuerung" werden.
Eigentlich 3 ineinander/miteinander verschränkte Ablaufsteuerungen.

  1. Die GSM Abhandlung
  2. Die Lüftung
  3. Die Heizung
    Um solche Dinge abzuhandeln wurden die Design Pattern "Schrittkette", bzw. "Endlicher Automat" erfunden.

Mein Vorschlag:
Benenne alle notwendigen Zustände deiner Ablaufsteuerung(en).
Definiere die Zustandsänderungen.
Das bringt Klarheit in den Ablauf.

Verzichte auf ellenlange if Ketten.
Kapsel das was zusammen gehört.
Verzichte auf Delays.
Verzichte auf das String Objekt.

Hier auch mal ein Hinweis auf einen konkreten Bock:

pinMode(Webasto, OUTPUT);
digitalWrite(Webasto, HIGH);

Was passiert hier?
pinMode schaltet den Pin auf LOW
digitalWrite schaltet den Pin auf HIGH
Das führt zu einem harten Zucken der Relais, bzw. ihrer Treiberstufen.
Vielleicht zu kurz um es zu bemerken, aber beabsichtigt ist das doch sicherlich nicht.

Besser:

digitalWrite(Webasto, HIGH);
pinMode(Webasto, OUTPUT);

Was passiert hier jetzt?
Der Pullup wird aktiviert.
pinMode schaltet den Pin auf HIGH, ohne das kurze zucken auf LOW

Denkanstoss... danke

ja das das nach 50 tagen zu problemen wird war mir bewusst.. lösung bis dato.. keine

zu der pinmode geschichte...
die relais sind wechsler..
im high zustand sind sie auf 1 und 2 und im low zustand auf 2 und 3.

ich hab ne orginal webasto uhr fur handbetrieb oder nach vorwahlzeit und dauer.

die webasto krigt 12 volt auf einen pin und läuft dann.

läuft sie gibt sie 12volt aus die das klimabedienteil aktivieren.

dafür nutz ich ein 2. relais was auf low schaltet bei heizung an... und nach ablauf einer zeit wieder auf urstellung high kehrt.
dann ist das bedienteil an und die lüftung geht.

alles so das die webastuhr funktioniert.

das mit dem dauerläufer ist denk ich n problem... oder ist es einfach das blink witjout delay schema?

und warum auf den string kram verzichten?

sorry wenn ich blöde frag...

Ich verstehe deine Texte nicht!

also das relaisshield was ich hab hat 4 wechsler relais.

ist ein relais auf high so ist es ungeschaltet krigt es aber low dann schaltet es!

was ist den falsch das ich string nutze?

um das millis problem mit dem überlauf nach 50 tagen auszumertzen soll ich mir das blink without delay muster als beispiel nehmen?

sry..besser?

also das relaisshield was ich hab hat 4 wechsler relais.

ist ein relais auf high so ist es ungeschaltet krigt es aber low dann schaltet es!

Die Frage war eher: Ist das kurze zucken der Relais beabsichtigt?

was ist den falsch das ich string nutze?

String nutzt die dynamische Speicherverwaltung.
Das kann gerade auf kleinen AVRs zu einem fragmentiertem Heap führen....
Ein SCHWER zu findender Fehler.
Und noch viel schwerer zu beheben.
Das Abenteuer sollte man im Vorfeld schon vermeiden.

um das millis problem mit dem überlauf nach 50 tagen auszumertzen soll ich mir das blink without delay muster als beispiel nehmen?

Das sachte ich doch schon..... oder?

sry..besser?

Ja, etwas...
Wenn du es jetzt noch schaffst ganze Sätze zu schreiben und ab und zu mal die Großbuchstabentaste zu nutzen, dann kann das was mit dir werden.
Bedenke:
Warum soll ich mir mit den Antworten mehr Mühe geben, als du mit den Fragen?
Wer will was von wem?

Meine private Sicht der Dinge: (betrachte es bitte nicht als Angriff)
Erfolgreiches programmieren ist untrennbar mit Sorgfalt und Disziplin verbunden.
Und wer schlampige Texte verfasst, schreibt auch schlampige Programme.
Das ist nicht immer wahr, aber so oft, dass man es als Regel anwenden kann.

Nein das zucken ist nicht beabsichtigt.
Da Kann man ja dein Vorschlag nutzen um es zu verhindern.

Könnte man den den String Speicher nach ausführung der Arbeit leeren?
Ich empfand es als sehr angenehm da ich so zusätzliche Befehle einarbeiten kann.
Ausserdem hat es das extrem vereinfacht für mich..vorher hatte ich mit char gearbeitet und einem riesigen if else Block.

was schlägst du anstelle der String Geschichte vor?

Ich google mal gleich den Fehler von dem du erzählst.

Ich muss ja nicht im Loop eine Led blinken lassen.

Im loop würde ich die Sms abfrage machen.

per void Sms () würden dann Funktionen aufgerufen werden die ihren Ist Zustand eingeschrieben haben.
z.B. kommt A1An

A1An ist dann eine Void // Funktionsaufruf
der irgend ein Port z.B. High setzt und A1 dann true ist

Im loop würde ich das dann so zb einbauen:

if A1==true
{
StartZeitA1= JETZT (merke Zeit seid wann a1 AN ist);
LaufZeitA1=ZeitA1(rechne aus wie lang a1 AN Soll);
AusZeitA1=StartZeitA1+LaufZeitA1(rechne Zeit aus wann a1 AUS soll);
}

dann

if ZeitAusA1 == 1
{
A1=a1aus ();
A1=false;
StartZeitA1=LaufZeitA1=AusZeitA1=0UL
}

vielleicht hast du eine saubere idee?
Bin ich damit auf dem richtigen Weg?

Ich glaube aber auch das ich erstmal die Variablen an die richtige Position setzen muss..

Sprich ist sie Global?
NUR im Setup?
Oder nur im Loop?
Sogar vielleicht nur im Bereich einer If abfrage?

int globaleVariable=0;

müsste es nicht vor dem void setup ()
so aussehen?!...

int globaleVariable;

Das ist egal: Globale Variable werden zwischen reset und setup in jedem Fall initialisiert. Wenn nichts angegeben ist, mit 0.


Richtig: Sowenig globale Variable wie möglich ist ein guter Ansatz.
Alles was in jedem loop -Durchlauf neu gemessen wird, kann in eine lokale Variable.
Schleifenzähler und ähnliche kurzlebige Sachen nur in der Schleife. usw.

Zum Datenaustausch mit Funktionen sind Parameter und Rückgabewert zu bevorzugen.

Die Zeitbehandlung geht generell so:

  1. Beim Start aktuelle Zeit merken:
    static unsigned long StartzeitA1;
    ....
    StartzeitA1 = millis();
  2. Abschaltbedingung prüfen
    if ( millis() - StartzeitA1 > DAUER_A160000UL ) { / Zeit abgelaufen */ }

Der Vergleich der Differenz mit einer Konstanten funktioniert ewig sowie auch während eines Überlaufs, ohne besondere Vorkehrungen. Wenn DAUER_A1 eine Konstante ist, umso besser, die Umrechnung in Millisekunden geschieht dann schon beim Kompilieren auf dem PC, kann nach Geschmack natürlich bei der Deklaration stehen statt hier mitten im Code.

Wenn du auf Strings bestehst dann mache wenigstens reserve() am Anfang um etwas Speicher zu reservieren:

Dann muss das interne Array nicht ständig vergrößert werden

String Objekte sind nicht mehr so katastrophal wie sie mal waren. Aber man muss sie trotzdem richtig verwenden. Was Anfänger nicht tun.

Die Alternative hatte ich dir aber ich schon mal verlinkt:
http://forum.arduino.cc/index.php?topic=362179.msg2497241#msg2497241
Da braucht man auch keine langen if-Abfragen. Nur die readSerial() Funktion und dann strcmp() (string compare) zum Vergleich.

In dem Thread oben geht es um das Einlesen von Zahlen. Das hast du nicht. Aber der erste Code-Block zeigt das Einlesen von Text. Den Code kannst du 1:1 übernehmen. Dann macht man einfach das:

void loop()
{
   if (readSerial(softwareSerial) == true)
   {
      if ( strcmp(stringBuffer, "#an") == 0)
      {
      }
      else if ( strcmp(stringBuffer, "#aus") == 0)
      {
      }
   
   }
}

Das war es :slight_smile:
strcmp() gibt bei Gleichheit 0 zurück

Wichtig hier: du musst am anderen Ende ein Linefeed/LF/newline am Ende des Strings senden damit auf dem Arduino das Ende erkannt wird!!

Das ist aber nicht dein Problem. Lass das erst mal. Das Problem ist wie schon angesprochen dein Programmablauf. Sowas macht man mit einem endlichen Automaten. Dann versteht man auch einfacher was gemacht werden soll und kann Dinge einfacher ändern.
In deinem Code blickt man als Außenstehender nicht wirklich durch (und du wahrscheinlich später auch nicht mehr). Das ist völlig ok. Das geht jedem am Anfang so.

Dazu kommen dann alle diese "kleinen" Sachen wie =/== oder unsigned Variablen auf < 0 abfragen, die Fehler verursachen können.

Die zwei Dinge zusammen machen es schlecht möglich zu sagen wo genau der eigentliche Fehler liegt.

ja recht hast du... das mit dem reservieren werd ich übernehmen!

so ist es für mich selbst einfacher weist du?
die frage ist natürlich welchen wert ich für size setze. .. #an #aus ... als mit 4 bin ich wohl bedient oder seh ich das falsch?

ich hab mich nochmal rangesetzt..

die globalen variablen reingehackt und die einzelnen funktionen.

ich poste das gleich mal bevor ich die if abfragen in meiner endlichen maschine schreibe.

so könnte man schon erste fehler ausmertzen wenn ihr so nett seid!

der heutige input bringt einen Fortschritt mit sich!

danke!