INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
loop inerhalb von void loop ()
23.06.2020, 12:39
Beitrag #1
loop inerhalb von void loop ()
Hilfe ich bin überfordert und bräuchte eure Hilfe!
Es ist so,
ich habe an meiner Zimmertür einen Taster als Klingel installiert und wenn dieser gedrückt wird sollen alle möglichen Dinge aktiviert werden unter anderem auch meine Lego Seilbahn.
ich habe das Programm für die Seilbahn schon geschrieben bekomme es aber nicht mit den anderen zusammen weil er die Lichtschrankenmeldung direkt über springt (hier mal in Pseudo-Programmiersprache ):
void loop () {
if (klingel gedrückt)

andere Dinge

Seilbahn aktiviert
if Lichtschranke 1 unterbrochen
fahre zurück
if Lichtschranke 2 unterbrochen
halte an

andere Dinge
}
jetzt habe ich das Problem, dass die Seilbahn ja eine Weile braucht, bis die Seilbahn da ist und die Lichtschranke meldet und das Programm macht weiter, dass heißt ich brauche im Prinzip eine weitere loop in meiner void loop, das dann so aussehen würde:
void loop () {
if (klingel gedrückt)

andere Dinge

loop () {
Seilbahn aktiviert
if Lichtschranke 1 unterbrochen
fahre zurück
if Lichtschranke 2 unterbrochen
halte an
break (verlasse die Schleife)
}
andere Dinge
}
Alles schön und gut aber ich finde diesen Befehl nirgends, auch nicht in unserer Code-Referenz, da gibts ja nur while, for,... Schleifen aber keine weitere loop schleife.
Er soll ja bei der Seilbahn bleiben bis beide if-Funktionen war waren und dann weiter machen.
Kann mir da jemand helfen??

Vielen dank schon mal im voraus!
Gruß Simon

Manche nennen es Chaos - Ich nenne es kreatives Arbeiten!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.06.2020, 12:42 (Dieser Beitrag wurde zuletzt bearbeitet: 23.06.2020 12:44 von hotsystems.)
Beitrag #2
RE: loop inerhalb von void loop ()
Dann setze deinen Sketch bitte mal in Code-Tags, damit man den auch lesen kann.

Und wieso eine weitere loop ?
Du hast eine loop (Schleife), mehr schleifen brauchst du nicht.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.06.2020, 12:49
Beitrag #3
RE: loop inerhalb von void loop ()
(23.06.2020 12:42)hotsystems schrieb:  Dann setze deinen Sketch bitte mal in Code-Tags, damit man den auch lesen kann.

Und wieso eine weitere loop ?
Du hast eine loop (Schleife), mehr schleifen brauchst du nicht.

Bitte, wenn du Freude dran hast:
Code:
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const int Sessellift = 7;
//const int Klingel = 8;
const int Klingel = 9;
const int rm = 10;
const int LedRot = A0;
const int LedGruen = A1;
const int sensor = A2;
const int OnOff = A3;
const int Richtung = A4;
const int Taster = A5;

int switchState = 0;
int switchStateTest = 0;

int switchStateRM = 0;
int richtung1 = 1;
int richtung2 = 0;

void setup(){
  Serial.begin(9600);
  pinMode(rm, INPUT);
  pinMode(LedRot, OUTPUT);
  pinMode(LedGruen, OUTPUT);
  pinMode(Richtung, OUTPUT);
  pinMode(OnOff, OUTPUT);
  pinMode(Klingel,INPUT);
  pinMode(Taster, INPUT);
  pinMode(Sessellift,OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(sensor, INPUT);
  
  digitalWrite(LedGruen, HIGH);

  Serial.println("System ist bereit");
  lcd.begin(16, 2);
  lcd.setCursor(1,0);
  lcd.print("System bereit");
}
void loop(){
  switchState = digitalRead(Klingel);
  switchStateTest = digitalRead(Taster);
  switchStateRM = digitalRead(rm);
  
  if (switchState || switchStateTest) {
Serial.println("Es klingelt");
  lcd.clear();
  lcd.setCursor(2,0);
  lcd.print("Es klingelt");
  tone(8, 200, 100);
  delay(50);
  tone(8, 250, 100);
  delay(50);
  tone(8, 300, 100);
  delay(50);
  tone(8, 350, 100);
  delay(50);
  tone(8, 400, 100);
  delay(50);
  tone(8, 450, 100);
  delay(50);
  tone(8, 500, 100);
  delay(50);
  tone(8, 550, 100);
  delay(50);
  tone(8, 600, 100);
  delay(50);
  tone(8, 650, 100);
  delay(50);
  tone(8, 700, 100);
  delay(50);
  tone(8, 750, 100);
  delay(50);
  tone(8, 800, 100);
  delay(50);
  tone(8, 850, 100);
  delay(50);
  tone(8, 900, 100); //Erster UP
  delay(100);
  tone(8, 900, 100);
  delay(50);
  tone(8, 850, 100);
  delay(50);
  tone(8, 800, 100);
  delay(50);
  tone(8, 750, 100);
  delay(50);
  tone(8, 700, 100);
  delay(50);
  tone(8, 650, 100);
  delay(50);
  tone(8, 600, 100);
  delay(50);
  tone(8, 500, 100);
  delay(50);
  tone(8, 450, 100);
  delay(50);
  tone(8, 400, 100);
  delay(50);
  tone(8, 250, 100);
  delay(50);
  tone(8, 300, 100);
  delay(50);
  tone(8, 250, 100);
  delay(50);
  tone(8, 200, 100); //Erster Down
  
  Serial.println("Person läuft die Treppe hoch!");
  delay(2000);
  
  lcd.clear();
  lcd.setCursor(4,0);
  lcd.print("Herzlich");
  lcd.setCursor(3, 1);
  lcd.print("Willkommen");
  
  delay(6000);
  
  digitalWrite(Sessellift,HIGH);
  Serial.println("Sessellift an");

  delay(3000);
  
  Serial.println("lcd Display an");   //lcd Display
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Abfahrtszeiten");
  lcd.setCursor(0, 1);
  lcd.print("Lego Seilbahn:");
  delay(5000);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Montag-Mittwoch:");
  lcd.setCursor(0,1);
  lcd.print("8,10,14,16,18Uhr");
  delay(5000);
   lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Do und Fr:");
  lcd.setCursor(0,1);
  lcd.print("6,8,10,14,16Uhr");
  delay(5000);
   lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Samstag:");
  lcd.setCursor(0,1);
  lcd.print("jede 1/2 Stunde");
  delay(3000);
   lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Sonntag:");
  lcd.setCursor(0,1);
  lcd.print("alle 15 Minuten");
  delay(3000);
   lcd.clear();
  lcd.setCursor(5,0);
  lcd.print("Heute:");
  lcd.setCursor(5,1);
  lcd.print("Jetzt!");
  delay(1000);                            //lcd Display

   float sensorWert = analogRead(sensor);     //Temparatur
  
  Serial.print("Digitaler Wert: ");
  Serial.print(sensorWert);
  
  float Spannung = (sensorWert / 1024.0) * 5.0;

  Serial.print(", Volt: ");
  Serial.print(Spannung);

  Serial.print(", degrees C: ");
  float temp = (Spannung - 0.5) * 100;
  Serial.println(temp);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Temparatur:");
  lcd.setCursor(0,1);
  lcd.print(temp);
  lcd.setCursor(6,1);
  lcd.print("C");
  delay(100);                         //Temparatur
    
   Serial.println("Seilbahn aktiviert");  //Seilbahn
bis hier hin läuft alles.

jetzt sollte die zweite loop anfangen
Code:
digitalWrite(LedGruen, LOW);
  digitalWrite(LedRot, HIGH);
  delay(2000);
  
  digitalWrite(Richtung, LOW);
  digitalWrite(OnOff, HIGH);

  if (switchStateRM && richtung1) {
richtung1 = LOW;
delay(190);
Serial.println("Rückmeldung1");
digitalWrite(OnOff, LOW);
digitalWrite(Richtung, HIGH);
Serial.println("Warte");

delay(2000);                               //Ampel
digitalWrite(LedRot, LOW);
digitalWrite(LedGruen, HIGH);
delay(7000);
digitalWrite(LedGruen, LOW);
digitalWrite(LedRot, HIGH);
delay(2000);                               //Ampel

digitalWrite(OnOff, HIGH);
Serial.println("Seilbahn in Richtung 2 an");
delay(5000);
Serial.println("Erster Wechsel vollzogen");
richtung2 = HIGH;
switchStateRM = LOW;
}

if (switchStateRM && richtung2) {
richtung2 = LOW;
delay(210);
Serial.println("Rückmeldung2");
digitalWrite(OnOff, LOW);
digitalWrite(Richtung, LOW);
Serial.println("Warte");

delay(2000);                               //Ampel
digitalWrite(LedRot, LOW);
digitalWrite(LedGruen, HIGH);
delay(7000);
digitalWrite(LedGruen, LOW);
digitalWrite(LedRot, HIGH);
delay(2000);                               //Ampel

digitalWrite(OnOff, HIGH);
Serial.println("Seilbahn in Richtung 1 an");
delay(5000);
Serial.println("Zweiter Wechsel vollzogen");
  richtung1 = HIGH;
  switchStateRM = LOW;
  break;
}
hier soll die loop enden
und der Rest läuft auch:
Code:
Serial.println("Seilbahn ausgeschaltet");  //Seilbahn


  delay(2000);
  digitalWrite(Sessellift,LOW);
  Serial.println("Sessellift aus"); //Sessellift
  delay(500);
  Serial.println("Fertig");
  lcd.clear();
  lcd.setCursor(1,0);
  lcd.print("System bereit");
  switchState = 0;
  }
}

Gruß Simon

Manche nennen es Chaos - Ich nenne es kreatives Arbeiten!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.06.2020, 12:59
Beitrag #4
RE: loop inerhalb von void loop ()
Warum so spitzig ?
Du möchtest doch Hilfe haben, dann möchten wir auch saubere Infos haben.
Und vom kompletten Sketch war nicht die Rede, nur das, was du gepostet hattest.

Ja und meine Frage darfst du auch beantworten.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.06.2020, 13:04
Beitrag #5
RE: loop inerhalb von void loop ()
Aber ok, habe mir deinen Sketch angesehen.
Dein Problem werden die ganzen delays im ersten Teil sein.
Damit wird dein Vorhaben scheitern.

Die musst du durch die Funktion mit millis() ersetzen, damit die nicht deinen Sketch blockieren.

Sieh dir dazu BlinkWithoutDelay in den Beispielen der IDE an.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.06.2020, 13:11
Beitrag #6
RE: loop inerhalb von void loop ()
(23.06.2020 12:59)hotsystems schrieb:  Warum so spitzig ?
Du möchtest doch Hilfe haben, dann möchten wir auch saubere Infos haben.
Und vom kompletten Sketch war nicht die Rede, nur das, was du gepostet hattest.

Ja und meine Frage darfst du auch beantworten.

OK. Sorry.
ich brauche ne weitere Schleife, weil das Programm sonst weiter geht und die beiden Lichtschranken aus lässt und meine Seilbahn in die Station kracht (was immer wieder passiert).
er muss die Lichtschranken solange abfragen bis sie beide durchlaufen sind und dann kann er weitermachen. Es muss ja keine weitere loop sein. Es könnte ja sein, dass es einen if-Befehl gibt der geprüft wird bis er wahr wird oder so etwas in die Richtung.
Der wichtige Teil (die zweite loop) des Sketches:
Code:
digitalWrite(LedGruen, LOW);
  digitalWrite(LedRot, HIGH);
  delay(2000);
  
  digitalWrite(Richtung, LOW);
  digitalWrite(OnOff, HIGH);

  if (switchStateRM && richtung1) {
richtung1 = LOW;
delay(190);
Serial.println("Rückmeldung1");
digitalWrite(OnOff, LOW);
digitalWrite(Richtung, HIGH);
Serial.println("Warte");

delay(2000);                               //Ampel
digitalWrite(LedRot, LOW);
digitalWrite(LedGruen, HIGH);
delay(7000);
digitalWrite(LedGruen, LOW);
digitalWrite(LedRot, HIGH);
delay(2000);                               //Ampel

digitalWrite(OnOff, HIGH);
Serial.println("Seilbahn in Richtung 2 an");
delay(5000);
Serial.println("Erster Wechsel vollzogen");
richtung2 = HIGH;
switchStateRM = LOW;
}

if (switchStateRM && richtung2) {
richtung2 = LOW;
delay(210);
Serial.println("Rückmeldung2");
digitalWrite(OnOff, LOW);
digitalWrite(Richtung, LOW);
Serial.println("Warte");

delay(2000);                               //Ampel
digitalWrite(LedRot, LOW);
digitalWrite(LedGruen, HIGH);
delay(7000);
digitalWrite(LedGruen, LOW);
digitalWrite(LedRot, HIGH);
delay(2000);                               //Ampel

digitalWrite(OnOff, HIGH);
Serial.println("Seilbahn in Richtung 1 an");
delay(5000);
Serial.println("Zweiter Wechsel vollzogen");
  richtung1 = HIGH;
  switchStateRM = LOW;
}
die beiden if Funktionen soll er so lange abfragen bis sie wahr sind und nichts anderes und dass tut er nicht (deswegen bin ich etwas genervt) und da dachte ich des einfachste wäre eine weiter loop und am Ende der zweiten If Funktion ein break und es passt.
geht das??
Gruß Simon

Manche nennen es Chaos - Ich nenne es kreatives Arbeiten!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.06.2020, 13:36 (Dieser Beitrag wurde zuletzt bearbeitet: 23.06.2020 13:39 von hotsystems.)
Beitrag #7
RE: loop inerhalb von void loop ()
Da du nur eine loop brauchst, musst du deine if-Abfragen in der loop abfragen lassen und dann entsprechend darauf reagieren.

Aber nochmal, solange du deine delays in deinem Sketch nicht entfernt hast, wird das nix.
Dann werden auch deine if-Abfragen verzögert abgefragt.
Das würde sich auch mit einer weiteren Schleife nicht ändern.

Eine Möglichkeit wäre ein "else-Zweig" in der if-Abfrage.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.06.2020, 09:33
Beitrag #8
RE: loop inerhalb von void loop ()
(23.06.2020 13:36)hotsystems schrieb:  Da du nur eine loop brauchst, musst du deine if-Abfragen in der loop abfragen lassen und dann entsprechend darauf reagieren.

Aber nochmal, solange du deine delays in deinem Sketch nicht entfernt hast, wird das nix.
Dann werden auch deine if-Abfragen verzögert abgefragt.
Das würde sich auch mit einer weiteren Schleife nicht ändern.

Eine Möglichkeit wäre ein "else-Zweig" in der if-Abfrage.

Mit millis kann ich im Prinzip warten und die If-Abfragen gleichzeitig und wenn eine If wahr ist führt er sie aus und wenn ich delay nehme ist er im Prinzip für diese Zeit außer Gefecht gesetzt, Stimmt dass?
Gruß Simon

Manche nennen es Chaos - Ich nenne es kreatives Arbeiten!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Fehlermeldung expected unqualified-id before void Celestron 26 479 28.06.2020 18:19
Letzter Beitrag: Tommy56
  Frage zu "void" Lampe 7 480 14.04.2020 18:06
Letzter Beitrag: Lampe
  variable or field declared void Harry 10 951 21.02.2020 22:54
Letzter Beitrag: MicroBahner
  Loop-Teil mit Interrupt für bestimmte Zeit stoppen Alter Fritz 11 1.254 23.12.2019 23:10
Letzter Beitrag: hotsystems
  Display in void neu zeichnen Mr_Martin 6 958 23.09.2019 15:32
Letzter Beitrag: Tommy56
  Kennt jemand einen Stepper Closed Loop Sketch? Holzwurm56 16 2.786 17.06.2019 22:37
Letzter Beitrag: georg01
  (void)change; Batucada 6 1.067 18.04.2019 19:19
Letzter Beitrag: Tommy56
  For-Loop verschluckt Ausgabe am seriellen Monitor TimeMen 5 1.012 14.04.2019 17:59
Letzter Beitrag: Tommy56
  Wasserverbrauchszähler, statische Variablen, komisches Verhalten in der loop() pzYsTorM 14 1.914 19.03.2019 20:33
Letzter Beitrag: Hilgi
  Lokale Variable an loop zurück - Fehler Haukini 3 1.037 26.02.2019 22:33
Letzter Beitrag: Haukini

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste