Filament RunOut mit Relais

Hallo, ich bin ganz neu auf dem Weg der Arduino Programmierung und möchte einen Filmend Run Out Schalter an meinen Zortrax M300 anbauen.

Soweit funktioniert alles nur mit dem Code hapert es noch etwas ^^

es soll so sein wenn der Rollentaster filmend merkt soll die LED an sein, sobald das Filmend weg ist soll dann die Rote LED kurz blinken und dann eine Relais Schalten was der Code auch macht. Mein Problem ist wie stoppe ich die Schleife das sie nur einmal den letzten Teil macht und dann die Rote LED dauerhaft leuchtet bis wieder Filament eingeschoben ist? Irgendwie glaube ich fehlt nur sowas wie ein Stopp ^^

ich danke schonmal für eure Hilfe :slight_smile:

int state=0;

int ledPin = 8; //Gruen
int led1Pin = 7; //Rot
int outPin = 2; //Relais Pause
int filaPin = 5;  //Schalter Filament

unsigned long lastMillis = 0;

void setup() {
  Serial.begin(9600);
  pinMode(outPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(led1Pin, OUTPUT);
  digitalWrite(ledPin, LOW);
  digitalWrite(led1Pin, LOW);
  digitalWrite(outPin, HIGH);
  // Setup notification button on pin 2
  pinMode(filaPin, INPUT_PULLUP);
}

void loop() {

  int isFilaLow = digitalRead(filaPin);
  if (isFilaLow) {
   state=1;
   digitalWrite(led1Pin, HIGH);  // turn on LED with voltage HIGH
   digitalWrite(ledPin, LOW);
   digitalWrite(outPin, HIGH);  // turn on output pin with voltage LOW
     }
     else{ 
   state=0;
   digitalWrite(ledPin, HIGH);  // turn on LED with voltage HIGH
   digitalWrite(led1Pin, LOW);
   delay(1000);
   digitalWrite(led1Pin, HIGH);
   delay(1000);
   digitalWrite(led1Pin, LOW);
   delay(1000);
   digitalWrite(led1Pin, HIGH);
   delay(1000);
   digitalWrite(led1Pin, LOW);
   delay(1000);
   digitalWrite(led1Pin, HIGH);
   delay(1000);
   digitalWrite(led1Pin, LOW);
   delay(500);
   digitalWrite(led1Pin, HIGH);
   delay(500);
   digitalWrite(led1Pin, LOW);
   delay(500);
   digitalWrite(led1Pin, HIGH);
   delay(500);
   digitalWrite(led1Pin, LOW);
   delay(500);
   digitalWrite(led1Pin, HIGH);
   delay(500);
   digitalWrite(led1Pin, LOW);
   digitalWrite(outPin, LOW);  // turn on output pin with voltage LOW
   delay(6500);
   digitalWrite(outPin, HIGH);
   
     }
    }

Ich vermute, dass du alle delay() entsorgen, und stattdessen endliche Automaten nach dem Muster der "Nachtwächter Erklärung" bauen möchtest.

Das wird aber nichts dran ändern das es dann immer noch in einer schleifen laufen wird oder?:frowning: und nicht die Rote LED weiter leuchtet bis sich der Schalterzustand ändert.

Dann halt erstmal ohne Blinken :smiley:

int state=0;

int ledPin = 8; //Gruen
int led1Pin = 7; //Rot
int outPin = 2; //Relais Pause
int filaPin = 5;  //Schalter Filament

unsigned long lastMillis = 0;

void setup() {
  Serial.begin(9600);
  pinMode(outPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(led1Pin, OUTPUT);
  digitalWrite(ledPin, LOW);
  digitalWrite(led1Pin, LOW);
  digitalWrite(outPin, HIGH);
  pinMode(filaPin, INPUT_PULLUP);
}

void loop() {

  int isFilaLow = digitalRead(filaPin);
  if (isFilaLow) {
   state=1;
   digitalWrite(led1Pin, HIGH);  
   digitalWrite(ledPin, LOW);
   digitalWrite(outPin, HIGH);  
     }
     else{ 
   state=0;
   digitalWrite(ledPin, HIGH);  
   digitalWrite(led1Pin, LOW);
   digitalWrite(outPin, LOW);  
   delay(6500);
   digitalWrite(outPin, HIGH);
   
     }
    }

ich möchte ja nur erstmal das ich weiter komme mit dem Code :slight_smile:

Das wird aber nichts dran ändern das es dann immer noch in einer schleifen laufen wird oder?:frowning: und nicht die Rote LED weiter leuchtet bis sich der Schalterzustand ändert.

Wenn du meinst....

Du bist der Programmierer deiner Anwendung.
Das Programm tut strikt das, was du da schreibst.

Schleifen sind übrigens nichts böses, auch wenn sie einem manchmal im Weg rum stehen.
Dann muss man eben umdenken.

Ansonsten beinhaltet eigentlich jedes Programm, jeder Prozess und jede Task mindestens eine Schleife, auch gerne eine Endlosschleife.
Notwendigerweise.

und wie bringt mich das jetzt weiter? :o

Hi,
combie meinte nicht das Blinken zu entsorgen, sondern die vielen delays()
Schaue Dir dazu auch das 'Blink without delay'-Beispiel in der IDE an. Und Suche hier im Forum nach der 'Nachtwächter Erklärung', wie ebenfalls von combie vorgeschlagen. Dies sollte Dir weiterhelfen, Dein Problem zu lösen.

LG Stefan

as2008schl:
und wie bringt mich das jetzt weiter? :o

Was erwartest du?

Falls du erwartest, dass ich lerne wie man solche Automaten baut, dann wird dir das nicht aufs Pferd helfen.

Ablaufsteuerung
Meine Standardantwort zu Ablaufsteuerungen:

Eine Stichworte Sammlung für Google Suchen:
Endlicher Automat,
State Machine,
Multitasking,
Coroutinen,
Ablaufsteuerung,
Schrittkette,
BlinkWithoutDelay,

Blink Without Delay
Die Nachtwächter Erklärung

Intervall Macro
Multitasking Macros
INTERVAL Ersatzstoff
CooperativeTask

@combie
Danke dass Du Ihm noch das Blink without delay und die Nachwächter Erklärung verlinkt hast, ich war grad zu faul dazu, da ich eigentlich mit geburtstagfeiern beschäftigt bin.

LG Stefan

Irgendwie glaube ich fehlt nur sowas wie ein Stopp

Ein Controller und die loop() - Schleife stoppt nicht, solange Strom da ist!

Beim BlinkWithoutDelay geht es gar nicht um's Blinken, sondern um eine grundsätzlich andere Denkweise.
Beim Umdenken, was ein Programm/Sketch eigentlich ist, hilft manchen die Nachtwächter-Erklärung.

Deltaflyer:
@combie
Danke dass Du Ihm noch das Blink without delay und die Nachwächter Erklärung verlinkt hast, ich war grad zu faul dazu, da ich eigentlich mit geburtstagfeiern beschäftigt bin.

LG Stefan

Gar kein Problem!

Da mein Browser eine Notizbuchäpp hat, ist der Textbaustein nur ca 3 Klick entfernt.

Sorry hatte das in meinem Tunnelblick garnicht geschnallt was ihr damit meint ^^Jetzt weis ich was @combie damit meint :slight_smile: wie gesagt ich hab erst damit angefangen :slight_smile: Ich werde mich mal dran machen :slight_smile:

Fein!
Das hört sich ja an, als wäre da ein Groschen gefallen.

Tipp:
Sei dir gewiss, hinter jeder Hürde lauert ein "Aha" Effekt.

So ist es ^^