If -> Operator Problem

Bitte schaut Euch die unteren Zeilen an. Ich fürchte, es muss mit der Syntax zusammen hängen. Welchen Fehler mache ich bei der Verknüpfung mit den Operatoren? im Klartext möchte ich formulieren: "wenn Wahl(schalter ausgelesen) den Wert2 hat und der dritte Durchlauf (Zeitmultiplikator) erfolgte und der Startschalter (Variable) gedrückt wurde... DANN springe Funktion Automatik an.

if (Wahl == 2  && durchl == 2 && StartVal == 0)
{Automatik();}

funktioniert nicht. der Automatik Betrieb wird nicht angesprungen.

Wenn ich nur 2 dieser Bedingungen verknüpfe

if (Wahl == 2  && durchl == 2)
{Automatik();}

oder

if (Wahl == 2  && StartVal == 0)
{Automatik();}

funktioniert es.

Bitte sagt mir nur, ob ich falsch verknüpfe. Falls das doch richtig ist, muss ich den Fehler wo anders suchen, kann aber DAS wenigstens ausschließen!

Lieben Dank !

Stefan

Setze Klammern, wenn du dir unsicher bist....

if (Wahl == 2 && durchl == 2 && StartVal == 0)

Wenn die 3 Bedingungen nie gleichzeitig wahr werden, dann werden sie nie gleichzeitig wahr!

Über das "WARUM" kann ich noch nicht einmal spekulieren....

Versuche mal die Bedingungen in Klammern zu setzen. Also

if ((Wahl == 2)  && (durchl == 2) && (StartVal == 0))
{Automatik();}

Es kann natürlich auch sein, dass durch einen Programmierfehler niemals alle drei Bedingungen gleichzeitig erfüllt sind. Lass dir die Werte vor dem If über den seriellen Monitor ausgeben.

Ich lese aus Euren Antworten, dass die Abfrage selbst in Ordnung ist. Der Tipp, dass bei nicht Erfüllung der Abfrage auch kein Sprung erfolgt ist soweit klar. Trotzdem danke, denn ich war mir gestern Nacht mit gar nix mehr sicher...

Dann mal weiter schauen, WARUM kein Sprung erfolgt.

Vielen Dank!!!

Stefan

Hallo,

ich gebe dir mal eine Hilfe zum übersichtlichen debuggen.

serieller_Monitor() rufste zum Bsp. immer am Anfgang oder Ende der loop auf. Ggf. Intervall ändern.

void serieller_Monitor ()
{
  static unsigned int intervall = 500;  // aller 500ms Werte ausführen
  static unsigned long last_millis = 0;

  if (millis()-last_millis < intervall) return; // Zeit noch nicht erreicht, Funktion abbrechen
  
  last_millis += intervall; 
  Ueberschriftszeile();
  Serial.print(Wahl); Serial.print('\t');
  Serial.print(durchl); Serial.print('\t');
  Serial.print(StartVal); Serial.print('\t');
  Serial.println();
}


void Ueberschriftszeile ()
{
  static int counter = 33;

  counter++;
  
  if (counter<25) return; // Zeit noch nicht erreicht, Funktion abbrechen
  
  counter = 0; 
  Serial.print(F("Wahl")); Serial.print('\t');
  Serial.print(F("durch")); Serial.print('\t');
  Serial.print(F("Start")); Serial.print('\t');
  Serial.println();
}

Hallo Doc_Arduino !
Danke fur die Routine.

Das mit dem Counter = 33
Counter ++
und if Counter < 25
kapier ich nicht.
Die Bedingung wird erst nach nem
Überlauf wahr ? Oder ist das ein Programmier- Trick
den ich noch nicht verstehe?

Stefan

Hallo,

die 33 dient nur zur aller ersten Überhöhung damit gleich beim ersten Aufruf die "Überschrift" ausgegeben wird. Muss nur größer der > 25 sein. Für alles danach gilt die > 25. Damit wird aller 26 Zeilen eine Zeile eingefügt zum besser lesen, wenn es permanent ausgegeben wird.

:astonished:

Aua... :-[

Verstanden...

Hallo,

lernste auch noch solche Dinge selbst zu erfinden. Ist nur eine Frage der Zeit bis man gewisse Dinge zu kombinieren anfängt. Sieht auf den ersten Blick vielleicht etwas durcheinander aus, auf den zweiten glas klar. ;) Das Ausgabeintervall in ms und aller wieviel Zeilen die Überschrift erscheinen soll (>25) kannste dir alles anpassen.