Warte Zeit im Program

solrac3f:
Hab mir das schon angeschaunt. Spannungsteiler Skizze hab verstanden. Neuer analog eingang dazu gekommen um den Kabelbruch zu Kontrollieren......Super Idee.

und ich stellen schon neue Fragen......

Schick..
Dann mach mal.

Noch eine Änderung, die für die Logik notwendig ist.
Hintergrund ist, das in Zeile 44 zwar der Schalter abgefragt wird, aber der Schritt dann nicht dauerhaft auf stoppen festgesetzt ist.

Alt ab Zeile 106:

    case stoppen:
      anhalten();
      if (schnellHalt(stoppenEnde) != stoppen)  // Es wird geprüft, ob stoppenEnde möglich ist

Neu:

    case stoppen:
      anhalten();
      schritt=stoppen;
      if (schnellHalt(stoppenEnde) != stoppen)  // Es wird geprüft, ob stoppenEnde möglich ist

Ich habs oben auch eingetragen...

Morgen my_xy_projekt

Hier ist was ich eingefugt habe in deinem Code was nach dem Rückstellen ausgelöst werden kann. Guck mal ob das so richtig ist.

const byte sensorLinksEnd  =  2;
const byte sensorRechtsEnd =  3;
const byte startPin        =  4;
const byte stopPin         =  5;
const byte relaisLinks     =  6;
const byte relaisRechts    =  7;
const byte HaltPin         =  A0;

enum {relaisAn, relaisAus};
enum {warten, on, rechts, haltrechts, links, haltlinks, off, stoppen, stoppenEnde};
byte schritt = warten;
byte zyklus = 20;
const byte maxzyklus = 20;

void setup() {
  Serial.begin(115200);
  Serial.println(F("Start...."));
  pinMode(sensorLinksEnd, INPUT);
  pinMode(sensorRechtsEnd, INPUT);
  pinMode(startPin, INPUT);
  pinMode(stopPin,  INPUT);
  pinMode(relaisLinks, OUTPUT);
  digitalWrite(relaisLinks, relaisAus);
  pinMode(relaisRechts, OUTPUT);
  digitalWrite(relaisRechts, relaisAus);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
}

void loop() {
  schritt = schnellHalt(schritt);
  schrittkette();

}

void schrittkette()
{
  static unsigned long lastmillis;
  const unsigned long pauseZeit = 5000; // in ms
  if (digitalRead(stopPin))
  {
    schritt = off;
  }
  switch (schnellHalt(schritt))
  {
    case warten:
      if (digitalRead(startPin))
      {
        zyklus = 0;
        schritt = on;
      }
      digitalWrite(relaisRechts, relaisAus);
      digitalWrite(relaisLinks, relaisAus);
      break;
    case on:
      digitalWrite(LED_BUILTIN, HIGH);
      schritt = rechts;
      break;
    case rechts:
      digitalWrite(relaisRechts, relaisAn);
      if (digitalRead(sensorRechtsEnd))
      {
        digitalWrite(relaisRechts, relaisAus);
        schritt = haltrechts;
        lastmillis = millis();
      }
      break;
    case haltrechts:
      digitalWrite(relaisRechts, relaisAus);
      digitalWrite(relaisLinks, relaisAus);
      if (millis() - lastmillis > pauseZeit)
      {
        schritt = links;
      }
      break;
    case links:
      digitalWrite(relaisRechts, relaisAus);
      digitalWrite(relaisLinks, relaisAn);
      if (digitalRead(sensorLinksEnd))
      {
        digitalWrite(relaisLinks, relaisAus);
        schritt = haltlinks;
        lastmillis = millis();
      }
      break;
    case haltlinks:
      digitalWrite(relaisRechts, relaisAus);
      digitalWrite(relaisLinks, relaisAus);
      if (millis() - lastmillis > pauseZeit)
      {
        if (zyklus == maxzyklus)
        {
          schritt = off;
        }
        else
        {
          zyklus++; // Die Zeile hat gefehlt
          schritt = rechts;
        }
      }
      break;
    case off:
      digitalWrite(LED_BUILTIN, LOW);
      schritt = warten;
      break;
    case stoppen:
      anhalten();
      schritt=stoppen;
      if (schnellHalt(stoppenEnde) != stoppen)  // Es wird geprüft, ob stoppenEnde möglich ist
      { // kommt "stoppen" zurück, geht es nicht weiter
        // Hier muss etwas rein, was nach dem Rückstellen ausgelöst werden kann
        // Und dann einen definierten schritt zurück gibt
        digitalWrite(relaisRechts, relaisAus);
        digitalWrite(relaisLinks, relaisAus);
        schritt = rechts;
        
       schritt=stoppenEnde;
      }
      break;
    case stoppenEnde: // Wenn der Stopp nicht mehr gilt UND zurück gefahren,
      schritt = off;  // gehe an definierten Zustand off
      break;
  }
}

byte schnellHalt(byte aktuell)  // Diese Funktion bekommt den aktuellen Schritt übergeben
{
  if (analogRead(HaltPin) > 450 && analogRead(HaltPin) < 550) // Spannungsteiler OK?
  {
    return aktuell; // Wenn ja, ist der Kontakt noch geschlossen
  }
  else
  {
    anhalten();// Wenn nein, ist ausgelöst
  }
  return stoppen;
}

void anhalten()
{
  digitalWrite(relaisRechts, relaisAus);
  digitalWrite(relaisLinks, relaisAus);
}

solrac3f:
Hier ist was ich eingefugt habe in deinem Code was nach dem Rückstellen ausgelöst werden kann. Guck mal ob das so richtig ist.

    case stoppen:

anhalten();
      schritt=stoppen;
      if (schnellHalt(stoppenEnde) != stoppen)  // Es wird geprüft, ob stoppenEnde möglich ist
      { // kommt “stoppen” zurück, geht es nicht weiter
        // Hier muss etwas rein, was nach dem Rückstellen ausgelöst werden kann
        // Und dann einen definierten schritt zurück gibt
        digitalWrite(relaisRechts, relaisAus);
        digitalWrite(relaisLinks, relaisAus);
        schritt = rechts;
 
      schritt=stoppenEnde;
      }
      break;

Ne nicht ganz.
Die Idee dahinter ist ja, das Du nach dem auslösen des SchnellStopp den Zustand bestätigen sollst.

Ich hab das mal aufgeräumt und Dir was reingeschrieben.
Wenn Du jetzt den SchnellStop auslöst, wird erst nachgeschaut, ob der wieder in Ordnung ist.
Dann wird gewartet, bis Du bestätigst ob Du mit Zyklus 0 starten willst oder nicht.
Du musst da zwingend N oder J sagen - sonst gehts nicht weiter.

const byte sensorLinksEnd  =  2;
const byte sensorRechtsEnd =  3;
const byte startPin        =  4;
const byte stopPin         =  5;
const byte relaisLinks     =  6;
const byte relaisRechts    =  7;
const byte HaltPin         =  A0;

enum {relaisAn, relaisAus};
enum {warten, on, rechts, haltrechts, links, haltlinks, off, stoppen, stoppenEnde};
byte schritt = warten;
byte zyklus = 20;
const byte maxzyklus = 20;

void setup() {
  Serial.begin(115200);
  Serial.println(F("Start...."));
  pinMode(sensorLinksEnd, INPUT);
  pinMode(sensorRechtsEnd, INPUT);
  pinMode(startPin, INPUT);
  pinMode(stopPin,  INPUT);
  pinMode(relaisLinks, OUTPUT);
  digitalWrite(relaisLinks, relaisAus);
  pinMode(relaisRechts, OUTPUT);
  digitalWrite(relaisRechts, relaisAus);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
}

void loop() {
  schritt = schnellHalt(schritt);
  schrittkette();
}

void schrittkette()
{
  static unsigned long lastmillis;
  const unsigned long pauseZeit = 5000; // in ms
  if (digitalRead(stopPin))
  {
    schritt = off;
  }
  switch (schnellHalt(schritt))
  {
    case warten:
      if (digitalRead(startPin))
      {
        zyklus = 0;
        schritt = on;
      }
      anhalten();
      break;
    case on:
      digitalWrite(LED_BUILTIN, HIGH);
      schritt = rechts;
      break;
    case rechts:
      nachrechts();
      if (digitalRead(sensorRechtsEnd))
      {
        schritt = haltrechts;
        lastmillis = millis();
      }
      break;
    case haltrechts:
      anhalten();
      if (millis() - lastmillis > pauseZeit)
      {
        schritt = links;
      }
      break;
    case links:
      nachlinks();
      if (digitalRead(sensorLinksEnd))
      {
        schritt = haltlinks;
        lastmillis = millis();
      }
      break;
    case haltlinks:
      anhalten();
      if (millis() - lastmillis > pauseZeit)
      {
        if (zyklus == maxzyklus)
        {
          schritt = off;
        }
        else
        {
          zyklus++; // Die Zeile hat gefehlt
          schritt = rechts;
        }
      }
      break;
    case off:
      digitalWrite(LED_BUILTIN, LOW);
      schritt = warten;
      break;
    case stoppen:
      anhalten();
      schritt = stoppen;
      if (schnellHalt(stoppenEnde) != stoppen)  // Es wird geprüft, ob stoppenEnde möglich ist
      { // hier gehts nur weiter, wenn der schnellstop nicht mehr ausgelöst ist
        if (stoppenAusgabe()) // Abfrage, was passieren soll
        {
          if (zyklus == 0) {
            schritt = rechts;
          }
          else
          {
            schritt = stoppenEnde;  // Wenn Abfrage in Ordnung, dann nächster Schritt
          }
        }
      }
      break;
    case stoppenEnde: // Wenn der Stopp nicht mehr gilt UND zurück gefahren,
      schritt = off;  // gehe an definierten Zustand off
      break;
  }
}

byte schnellHalt(byte aktuell)  // Diese Funktion bekommt den aktuellen Schritt übergeben
{
  if (analogRead(HaltPin) > 450 && analogRead(HaltPin) < 550) // Spannungsteiler OK?
  {
    return aktuell; // Wenn ja, ist der Kontakt noch geschlossen
  }
  else
  {
    anhalten();// Wenn nein, ist ausgelöst
  }
  return stoppen;
}

void anhalten()
{
  digitalWrite(relaisRechts, relaisAus);
  digitalWrite(relaisLinks, relaisAus);
}

void nachlinks()
{
  digitalWrite(relaisRechts, relaisAus);
  digitalWrite(relaisLinks, relaisAn);
}

void nachrechts()
{
  digitalWrite(relaisLinks, relaisAus);
  digitalWrite(relaisRechts, relaisAn);
}


bool stoppenAusgabe()
{
  char zeichen = '\0';
  Serial.print(F("Schnellstop ausgelöst\r\nbei Zyklus: "));
  Serial.println(zyklus);
  Serial.println(F("Zyklus auf 0 stellen? J/N"));
  while ((char(zeichen) != 'J') && (char(zeichen) != 'N'))
  {
    zeichen = Serial.read();
  }
  if (char(zeichen) == 'J')
  {
    Serial.println(F("Stelle auf 0"));
    zyklus = 0;
    return true;
  }
  if (char(zeichen) == 'N') {
    Serial.println(F("Stelle nicht auf 0"));
    return true;
  }
  return false;
}
  void anhalten()
{
  digitalWrite(relaisRechts, relaisAus);
  digitalWrite(relaisLinks, relaisAus);
}

void nachlinks()
{
  digitalWrite(relaisRechts, relaisAus);
  digitalWrite(relaisLinks, relaisAn);
}

void nachrechts()
{
  digitalWrite(relaisLinks, relaisAus);
  digitalWrite(relaisRechts, relaisAn);
}

Das ihr oben habe ich verstanden. Hab es direkt erkannt..... :).
Was gestern und heute dazu gekommen ist, und auch schon abfrage uber seriellen Monitor ....stop, stop, stop ...my_xy_projekt.
Ist gut gemeint von dir und ich weiss es zu schätzen. Aber fur mein Gehirn momentan ist es zu viel neues Futter zu verdauen..... :o. Ich brauche Zeit um hall disse Info zu Verarbeiten . :slight_smile:
Werde in den kommenden Tagen daran Arbeiten.
Danke noch einmal. Werde mich auf jedem Fall spater nochmal melden.

Wo kommen denn in letzter Zeit die ganzen (sorry blöden) Quelltexte mit den komischen color-Tags her?

Gruß Tommy

Tommy56:
Wo kommen denn in letzter Zeit die ganzen (sorry blöden) Quelltexte mit den komischen color-Tags her?

Das sind die Skripte, die wir ausblenden. :wink:
Das ist wie mit den Namen der User.
Da wird automatisch ein Link ins Profile gesetzt und farbig einmarkiert.

Ohoooo.... Du hast recht Tommy. Habe die Post mit mein Smartphone geschrieben und copy paste vom Code gemacht. When über Laptop oder PC ist mir das nie vorgekommen...

solrac3f:
Habe die Post mit mein Smartphone geschrieben und copy paste vom Code gemacht.

Mach Dir keine Sorgen! Da bist Du nicht schuld!

my_xy_projekt:
Mach Dir keine Sorgen! Da bist Du nicht schuld!

OK... :slight_smile:

solrac3f:
Ohoooo.... Du hast recht Tommy. Habe die Post mit mein Smartphone geschrieben und copy paste vom Code gemacht. When über Laptop oder PC ist mir das nie vorgekommen...

Ok, dann weiß man das wenigstens. Das hat in letzter Zeit ziemlich zugenommen und ist für mich (evtl. auch für Andere) ein Grund da überhaupt nicht einzuschauen.

Gruß Tommy

und ist für mich (evtl. auch für Andere) ein Grund da überhaupt nicht einzuschauen.

Ich klicke dann auch meist weg…
Wer mir sowas vorsetzt, will meine Hilfe nicht.

Ebenso bei verstümmelten Fehlermeldungen, fehlenden Komponentenangaben usw.

combie:
Wer mir sowas vorsetzt, will meine Hilfe nicht.

Bitte bedenke, das das nicht Absicht ist.
Ich hab es live gesehen - seither warte ich nur noch drauf das noch weitere Schnüfflerdomains eingebunden werden...

Bitte bedenke, das das nicht Absicht ist.

Das interessiert mich nicht!

Wer will, findet Wege.
Wer nicht will, findet Gründe.

combie:
Das interessiert mich nicht!

Habe ich zur Kenntnis genommen.

Da hat er aber Recht. Warum sollen wir uns jeden Unsinn rein ziehen?
Wenn sich der Fragende nicht mal die Zeit / Sorgfalt nimmt, sein Posting Korrektur zu lesen (dann würde er den Schwachsinn sehen), bin ich bei solchen Sachen auch raus. Ich meine damit keine Tippfehler, die überliest man.

Gruß Tommy

Tommy56:
Da hat er aber Recht. Warum sollen wir uns jeden Unsinn rein ziehen?

Das sehe ich anders. Denn:
Weil der Poster DAS nicht sieht.
Der sieht in seinem Foren-Editor schönen sauberen code, der sogar farblich an notepad++ erinnert.

Bedenke: Das macht die Forensoftware.

Der Thread ist schon kaputt genug, aber die Grundsatzdiskussionen zu dieser Forensoftware ist in zu vielen unterschiedlichen Threads auch schon fortgeschritten genug.

Wo macht das die Forensoftware? Wenn ich meinen Quelltext einfüge werden da keine color-Tags eingefügt.

Gruß Tommy

Tommy56:
Wo macht das die Forensoftware? Wenn ich meinen Quelltext einfüge werden da keine color-Tags eingefügt.

Das passiert vermutlich nur auf tablets/Smartphones.
Glaub es mir oder nicht - ich hab es m.W. auf einem komischen Apfel gesehen.

Schreib mal bitte eine Antwort auf diesen Text und meinen Profilnamen rein.
Und dann schau Dir an, wie das aussieht, was über das Smartphone kommt.
[edit] #33 ist so ein Beispiel - das macht keiner freiwillig [/edit]

Das ist mir recht egal, woran das liegt.

Der Quelltext wird dadurch quasi unlesbar.
Das ist Fakt.

Die Suche nach einem Schuldigen, oder eine Rechtfertigung beliebiger Art, bessert die akute Situation in keinster Weise.

my_xy_projekt:
[edit] #33 ist so ein Beispiel - das macht keiner freiwillig [/edit]

In #33 sind keine color-Tags. Es ist aber auf der anderen Seite nicht meine Aufgabe, die verhunzten Quelltexte gerade zu ziehen. Das soll der machen, der will, dass ich sie mir anschaue.

Gruß Tommy