Programmieren einer do-while Schleife

Hallo,
mal wieder hab ich eine Frage zu einem Sketch.
Ich will hier eine do-while Schleife programmieren bin mir aber mit den Codes nicht ganz so sicher. Es wäre nett wenn mir jemand helfen könnte Warum der Code falsch ist. P.S. Bin Neuling auf diesem Gebiet.
Mfg Benedikt

FIP_TEST.ino (689 Bytes)

  1. Blöder Titel "Programmieren", kann sich jeder was denken, darfst Du aber gerne noch nachträglich ändern
  2. Wenn Code kompiliert, ist er nicht falsch. Er macht höchstens nicht das was Du willst.
  3. Also: was willst Du? (ich kann's mir denken, aber vielleicht kommst Du selbst drauf wenn Du's Dir klar machst)
  4. Den Code bitte nicht als Anhang, schon gar nicht wenn der so kurz ist. Einfach in Code-Tags einfügen. Ich mach das mal schnell
int LED = 6;
int Pieps = 5;
int Taster1 = 3;
int Taster2 = 4;
int Tasterstatus1 = 0;
int Tasterstatus2 = 0;

void setup()
{
  pinMode(LED, OUTPUT);
  pinMode(Pieps, OUTPUT);
  pinMode(Taster1, INPUT);
  pinMode(Taster2, INPUT);
}

void loop()
{
  Tasterstatus1 = digitalRead(Taster1);
  Tasterstatus2 = digitalRead(Taster2);

  if (Tasterstatus1 == HIGH)
do{
    delay(50)
x = analogRead(4);
    digitalWrite(LED, HIGH);
    digitalWrite(Pieps, HIGH);
    delay(1000);
    digitalWrite(LED, LOW);
    digitalWrite(Pieps, LOW);
    delay(1000);
  }while (Tasterstatus2 == LOW);
  else
  {
    digitalWrite(LED, LOW);
    digitalWrite(Pieps, LOW);
  }
}

While und Do While werden Entlosschleifen wenn die Variable für die Abbruchbedingung nicht in der Schleife geändert / neu eingelesen wird.

do{
    delay(50)
x = analogRead(4);
    digitalWrite(LED, HIGH);
    digitalWrite(Pieps, HIGH);
    delay(1000);
    digitalWrite(LED, LOW);
    digitalWrite(Pieps, LOW);
    delay(1000);
  }while (Tasterstatus2 == LOW);

Wo wird da Tasterstatus2 neu eingelesen?

Grüße Uwe

uwefed:
While und Do While werden Entlosschleifen wenn die Variable für die Abbruchbedingung nicht in der Schleife geändert / neu eingelesen wird.

Dass das „von der Schleife gemacht wird“ dachte ich auch mal. Wenn man sich sicher ist, dass das so ist, kann man sich auf der Fehlersuche leicht eine Hornhaut auf die Brille glotzen. Anfänger haben's manchmal ganz schön schwer.

Gruß

Gregor

gregorss:
.....
Anfänger haben's manchmal ganz schön schwer.

Wieso schwer ?
Es ist doch nicht schwer den Titel zu ändern.
Alles andere kann man nachlesen, man muss eben lesen. :wink:

Hallo,

was willst Du mit der do Schleife erreichen, Du hast schon eine Schleife die heisst loop.

Aber Du kannst gerne damit herumspielen, dann lernst Du auch das die do Schleife für Controler denkbar ungeeignet ist, das gilt ebenso für den delay() Befehl. Bei delay macht das Program eine Pause, während der Zeit wird fast nichts anderes gemacht. Wenn Du also den Taster 2 nur kurz drückst wird er vom Program nicht erkannt. Aber auch damit kannst Du gerne rumspielen um das zu lernen. Bekanntlich lernt man ja am meisten durch Fehler. :wink:

Um mit Zeiten zu arbeiten solltest Du Dir das Beispiel "Blink without Delay" ansehen. Das findest Du wie viele andere verständliche Beispiele in der IDE.

HotSystems:
Wieso schwer ?
Es ist doch nicht schwer den Titel zu ändern.
Alles andere kann man nachlesen, man muss eben lesen. :wink:

Schwer wird es immer dann, wenn etwas missverständlich geschrieben ist. Wenn man sonst immer alles (richtig) verstanden hat, ist man verleitet, auch das andere Gelernte für richtig zu halten und den Fehler anderswo zu vermuten.

Aber wer hier mitliest hat zumindest gute Karten, den Fehler irgendwann doch noch zu erlegen.

Gruß

Gregor

Ich will erreichen das der Taster 1 einmal kurz gedrückt wird und das Blinken dann solange weitermacht bis ich den Taster 2 drücke.

Was willst du dann mit einer zusätzlichen Schleife? Du hast mit loop() schon eine Schleife. Alles weitere ist bei sowas nur hinderlich. Merke dir ob gerade geblinkt werden soll oder nicht. Diesen Zustand kannst du dann je nach Tastendruck ändern

Und wie setze ich dies in mein Programm um?

Benedikt105:
Und wie setze ich dies in mein Programm um?

Wenn du men sagen würdest, was du erreichen möchtest.....

Hallo,

Grobe Struktur

wenn der erste Taster gedrückt ist eine Variable auf 1

wenn der zweite Taster gerückt die Variable wieder auf 0

Wenn die Variable 1 dann Blinken

Blinken ist eine Funktion die das Blink without delay beinhaltet.

Kannst das ja zunächst mal ohne blinken machen,also ohne zus. Funktion einfach in einem zusätzlichen If..

Heinz

combie:
Wenn du men sagen würdest, was du erreichen möchtest.....

Taster 1 soll kurz gedrückt werden, das soll dann auch wenn der Taster losgelassen wird fortgeführt werden. Bis Taster 2 gedrückt wird das es wieder aus geht.

Ach....

Das ist doch ein recht einfaches Problem..
:smiling_imp: :smiling_imp:

Mal eben aus meiner Wühlkiste zusammengestoppelt:
(vielleicht kannste ja was damit anfangen)

const byte einTaster = 2;
const byte ausTaster = 3;
const byte led       = LED_BUILTIN;
const unsigned long interval = 500;


bool tasterAuswertung(const byte einTaster,const byte ausTaster)
{
  static bool merker = false;
  if(not digitalRead(einTaster)) merker = true;
  if(not digitalRead(ausTaster)) merker = false;
  return merker;
}

void blinkAutomat(byte out,const bool merker,unsigned long interval)
{
  static unsigned long zeitMerker = 0;

  if(merker)
  {
    if(millis()-zeitMerker>interval)
    {
      digitalWrite(out,not digitalRead(out));
      zeitMerker = millis();
    }
  }else
  {
    zeitMerker = millis();  
    digitalWrite(out,LOW);
  }
}



void setup() 
{
  pinMode(einTaster,INPUT_PULLUP);
  pinMode(ausTaster,INPUT_PULLUP);
  pinMode(led,OUTPUT);
}


void loop() 
{
  blinkAutomat(led,tasterAuswertung(einTaster,ausTaster),interval);
}

Super, Danke werde ich auf jeden Fall mal ausprobieren.:slight_smile:

Hi

Du kannst ziemlich sicher sein, daß Das funktioniert.
Nur: Du solltest Es nicht nur toll finden, sondern auch verstehen, was der Sketch Da eigentlich macht.
(das Warum kommt dann hoffentlich später, also die Neugierde, warum der Kram Da überhaupt funktioniert)

MfG