Display Laufschrift switch-case und for Schleife

Hallo,

ich würde gerne auf meinem Display eine Laufschrift erzeugen.

Sprich, es soll beim drücken eines Tasters erstmal “Gas” dann “Gas.” dann “Gas…” dann “Gas…” ausgegeben werden. Also immer einen Punkt mehr.

Dafür habe ich eine for-Schleife erstellt welche dann von 1 bis 5 zählt. Und dann eine Switch-Case anweisung welche dann 1 bis 5 auswertet.

Leider klappt es nicht ganz.

Wo liegt der Fehler?

MfG Marc

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4 // not used / nicht genutzt bei diesem Display
Adafruit_SSD1306 display(OLED_RESET);
int taster=7;
int led=6;
int i;
int tasterstatus=LOW;
int time;
int timesek;
int lauf;
int schleife;


void setup()   {                

  // initialize with the I2C addr 0x3C / mit I2C-Adresse 0x3c initialisieren
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  
  // random start seed / zufälligen Startwert für Random-Funtionen initialisieren
  randomSeed(analogRead(0));

pinMode(led, OUTPUT); 
pinMode(taster, INPUT);

  
}

#define DRAW_DELAY 118
#define D_NUM 47


void loop() {
  
  display.clearDisplay();
  
  // set text color / Textfarbe setzen
  display.setTextColor(WHITE);
  // set text size / Textgroesse setzen
  display.setTextSize(1);
  // set text cursor position / Textstartposition einstellen
  display.setCursor(41,0);
  // show text / Text anzeigen
  display.println("F-HEG");
  display.setTextSize(2);
  display.setCursor(23,15);
  display.println("MB6000");
  display.display();
  delay(0);
  display.clearDisplay();




  tasterstatus=digitalRead(taster);
  if( tasterstatus==HIGH)
{
  digitalWrite(led, HIGH);
  delay(50);
  digitalWrite(led, LOW);
  
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.setCursor(18,0);
  display.println("   Formiergas");
  display.setTextSize(2);
  display.setCursor(34,15);


for (int schleife=1; schleife=5; schleife++)
{
  
switch (schleife)

{
  
  case 1:
  display.setTextSize(2);
  display.setCursor(23,15);
  display.println("Gas");
  display.display();
  delay(400);
  display.clearDisplay();
  
   
  case 2:
  display.setTextSize(2);
  display.setCursor(23,15);
  display.println("Gas.");
  display.display();
  delay(400);
  display.clearDisplay();
  
  
  case 3:
  display.setTextSize(2);
  display.setCursor(23,15);
  display.println("Gas..");
  display.display();
  delay(400);
  display.clearDisplay();
  break;

  case 4:
  display.setTextSize(2);
  display.setCursor(23,15);
  display.println("Gas...");
  display.display();
  delay(400);
  display.clearDisplay(); 
  break;

 case 5:
 schleife=1;
  break;
  
}
 
}

 //Programmabschnitt des else-Befehls öffnen.
digitalWrite(led, LOW); 

}
}

[code]

for (int schleife=1; schleife<=5; schleife++)
? ? ? ?

Denn schleife=5 ist IMMER true.

Super, vielen dank. Es klappt.

Warum ist Schleife=5 immer true? Ist doch die Abbruchbedingung. Gibt es da eine VErständliche Erklärung für?

Eine Sache klappt noch nicht so ganz.

"Gas" wird nicht ausgegeben. Nur mit 1,2 und 3 Punkten.

Und wie kann ich das programmieren, das nachdem durchlauf das Programm wieder auf das Drücken des Tasters wartet?

MfG Marc

big_goliath:
Warum ist Schleife=5 immer true? Ist doch die Abbruchbedingung. Gibt es da eine VErständliche Erklärung für?

Schleife=5 ist eine Zuweisung, kein Vergleich. Das Ergebnis ist 5, was als true interpretiert wird.
Was Du gemeint hast ist Schleife==5, das ist ein Vergleich. Das passt aber in der for-Schleife auch nicht. Denn die Schleife läuft, solange die Bedingung true ist. Es ist also eigentlich keine Abbruchbedingung, sondern eine Laufbedingung.
Schleife==5 wäre aber schon vor dem ersten Durchlauf ( wenn Schleife 1 ist ) false, was zum sofortigen Abbruch führen würde.

"Gas" wird nicht ausgegeben. Nur mit 1,2 und 3 Punkten.

Beim ersten mal schon!
Bei allen weiteren Durchläufen nicht.
War das nicht beabsichtigt?

Denn so ist es programmiert.

Oder anders gefragt:
Was erwartest du dir von dieser Manipulation des Schleifenzählers außerhalb des Schleifenkopfes?

schleife=1; // im case 5
und dem darauf folgenden
schleife++ // im Schleifenkopf
Das macht man doch nicht ohne triftigen Grund!

Ansonsten vermeidet man das, so wie der Teufel das Weihwasser.
Zumindest bei mir gehen da alle Alarmglocken an. Sofort.

Also, ich bin kein Profi und bin dabei mich da so etwas einzuarbeiten, also Anfänger.

Diese Manipulation soll bewirken, dass der Zähler wieder auf 1 gesetzt wird um neu anfangen können zu zählen.

Diese Manipulation soll bewirken, dass der Zähler wieder auf 1 gesetzt wird um neu anfangen können zu zählen.

Das passiert ja auch!
Wo ist das Problem?

Wenn ich endlose Wiederholungen möchte verwende ich eine while(true) oder for(;;) Schleife.
Was gefällt dir an denen nicht?

Also, ich bin kein Profi und bin dabei mich da so etwas einzuarbeiten, also Anfänger.

Das musst du nicht sagen, das sehe ich auch so!
(da mache dir mal keine Sorgen)

Und: Jammern gilt nicht!
Offensichtlich wirst du eine der schwersten Sprachen lernen dürfen: C++

s/schwersten/schönsten/

Gruß Tommy

Gruselig vielseitig, sie ist.

Abstrakt und zugleich Hardware nah.

Eine Hybridsprache, sie ist.

Hi

@combie
Etwas Empathie dürftest auch Du haben und erkennen können, was der TO bezwecken will.

@TO
Sofern Du Deine Lauf-Bedingung geändert hast (for(int schleife=1;schleife<=5;schleife++){ ):
Beim Start der FOR wird ja schon die Zuweisung int schleife=1; ausgeführt - dafür musst Du aber die FOR auch neu beginnen - Das verhinderst Du effektiv, indem Du schleife innerhalb der Schleife wieder auf 1 setzt - somit bleiben wir in der Schleife, zählen ab und an 1 hoch, bei der 5 wird wieder auf 1 gesetzt, das Spiel beginnt von neuem.
Wenn Du den kompletten ‘case 5’ weg lässt, wird ‘schleife’ auch 5 sein und das FOR wird diese Zahl auch erneut prüfen - und auch irgendwann die FOR verlassen.
Beim nächsten Aufruf wird schleife wieder auf 1 initialisiert.

Allerdings ist Das keine wirklich schöne Art, einen Lauftext zu kreieren - während des Laufen des Textes kann man nämlich nicht mehr viel mit dem Arduino machen - Das geht erst wieder, wenn die FOR verlassen wurde und loop() wieder an die Reihe kommt.

MfG

Ah okay, super.

Das habe ich nun verstanden mit der Schleife. Somit muss ich eigentlich fast immer ein <= in der for-Schleife anwenden.

Ich werde es morgen mal ausprobieren.

Danke für eure Hilfe.