Go Down

Topic: Programmieren einer do-while Schleife (Read 421 times) previous topic - next topic

Benedikt105

Jan 21, 2019, 04:33 pm Last Edit: Jan 21, 2019, 05:38 pm by Benedikt105
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

Klaus_ww

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

Code: [Select]

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);
  }
}

Freizeit-Programmierer mit moderatem Ehrgeiz besseren Code zu schreiben.

uwefed

While und Do While werden Entlosschleifen wenn die Variable für die Abbruchbedingung nicht in der Schleife geändert / neu eingelesen wird.
Code: [Select]
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


gregorss

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
„Ich glaube, ich leg' mich noch mal hin", sagte das Bit.

HotSystems

.....
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. ;)
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Rentner

#5
Jan 21, 2019, 05:40 pm Last Edit: Jan 21, 2019, 05:42 pm by Rentner
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.  ;)

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.

gregorss

Wieso schwer ?
Es ist doch nicht schwer den Titel zu ändern.
Alles andere kann man nachlesen, man muss eben lesen. ;)
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 glaube, ich leg' mich noch mal hin", sagte das Bit.

Benedikt105

#7
Jan 21, 2019, 05:46 pm Last Edit: Jan 21, 2019, 05:48 pm by Benedikt105
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.

Serenifly

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

Benedikt105

Und wie setze ich dies in mein Programm um?

combie

Und wie setze ich dies in mein Programm um?
Wenn du men sagen würdest, was du erreichen möchtest.....
> Das größte Problem, ist die Wahl der richtigen Gedanken <
Frei nach Dale Carnegie

Rentner

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




Benedikt105

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.

combie

Ach....

Das ist doch ein recht einfaches Problem..
 :smiley-twist:  :smiley-twist:

Mal eben aus meiner Wühlkiste zusammengestoppelt:
(vielleicht kannste ja was damit anfangen)
Code: [Select]
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);
}
> Das größte Problem, ist die Wahl der richtigen Gedanken <
Frei nach Dale Carnegie

Benedikt105

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

Go Up