Was läuft falsch in meinem Sketch

Arduino Uno + I2C LCD Anzeige 2004 --- mit Geduld und nach vielen Versuchen habe ich es doch noch geschafft, jedoch holpert der Ablauf einwenig, der Ablauf der Sekunden setzt mal nach 7, mal nach 8 aus und statt 2 x++, x-- mußte ich 4 einfügen also verstehe ich den Ablauf noch nicht richtig - wie geht es richtig, im C+4 Basic war die if - else Anweisung logischer, doch das ist auch jahrzehnte her...

...

#include <LiquidCrystal_I2C.h>     // I2C-Adapter: SDA an A4, SCL an A5, VCC an +5V, GND an GND (-, Masse)
byte x = 0;                        //  byte = Zahl zwischen 0 und 255
LiquidCrystal_I2C lcd(0x27,20,4);  // auf LCD Anzeige 2004 setzen

void setup()                       //  Kontrast einstellen am Poti der I2C-Platine
{
  lcd.init();                      // Initialisiere das LCD Display
  lcd.backlight();                 // LCD Licht ein
  lcd.clear();                     // lösche LCD Anzeige
}
void loop()
 {
   lcd.setCursor(19, 2);
   lcd.print(x);                    // schreibe rechts den Wert von x ins Display
   lcd.setCursor(6, 2);
   lcd.print("Sekunden   X=");
   lcd.setCursor(2, 1);
   lcd.print("die Zeit vergeht");
   lcd.setCursor(2, 2);
   lcd.print(millis()/1000);        // Ausgabe Sekunden ab Programmstart
   delay(200);                      // 2oo Millisekunden Pause
   x++;                             // x = x+1
   lcd.setCursor(0, 0);
   lcd.print("24-"); lcd.print (x);  // hier wechselt x zwischen 1 und 2
   delay(200);                       // 2oo Millisekunden Pause
   if (x > 1)                        // wenn x>1 weiter Zeile 37 
    {
     x--;                            // x = x-1
     lcd.setCursor(5, 0);
     lcd.print("30-"); lcd.print (x); // hier hat X immer 1
     lcd.setCursor(9, 3);
     lcd.print (x); lcd.print (" <<<");
     delay(200);                     // 2oo Millisekunden Pause
    }
   else                              // wenn x icht >1 weiter Zeile 46
    {
     x++;                            // x = x+1
     lcd.setCursor(10, 0);
     lcd.print("39-"); lcd.print (x); // hier hat x immer 2
     lcd.setCursor(5, 3);
     lcd.print (">>> "); lcd.print (x);
     delay(200);                     // 2oo Millisekunden Pause
    }
   x--;                              // x = x-1
   lcd.setCursor(15, 0);
   lcd.print("46-"); lcd.print (x);  // hier wechselt x zwischen 0 und 1
   delay(200);                       // 2oo Millisekunden Pause
   lcd.clear();                      // lösche LCD Anzeige
 }
...


was soll das werden wenn`s fertig ist?

Mach die Pausen mit millis()
Grüße Uwe

1 Like

Was ist der Sinn dieses Sketches und was ist dein Problem?
Was verstehst du unter "Holpern"?

Das ist ja wohl nicht der vollständige sketch (sonst dürfte nur 1 und 2 angezeigt werden).
Fehlersuche daher kaum möglich.
P.S.: Das Programm tut genau das, was du programmiert hast :slight_smile:

Den Arduino hab ich schon Jahre rumliegen und hab jetzt endlich Zeit mich ihm zu beschäftigen. So versuchte ich auch meine Enkel zu begeistern indem deren Namen (jetzt ">>>" und "<<<") abwechselnd angezeigt werden sollten.
Ich wollte einen Zähler x mit +1 und -1 zwischen 0 und 1 hin und herschalten und x zur Anzeige der Namen nutzen. Das funktionierte jedoch erst als ich weitere x+1 und x-1 einfügte.
Um den Programmablauf verfolgen und verstehen zu können fügte ich die ZeilenNr mit dem aktuellen x in der ersten Zeile ein sowie das Löschen ganz unten. Das entstehende Chaos im Programmablauf ist jedoch unverständlich und die Pausen im Sekundenablauf sind auch nicht erklärbar (mal nach 6, mal nach 7 Sekunden).
Also hoffte ich hier Auflärung zu finden. Und auch einen logischeren Programmablauf hin zu bekommen.
Wer kann den Opa aufklären um seine Enkel zu begeistern?
Habe Ende der 80iger viele Basicprogramme auf dem C+4 geschrieben. C++ ist da einwenig anders...

doch, ist es

Im Codeabschnitt wird x 2 mal erhöht (einmal bei jedem Schleifendurchlauf) und einmal im Fall x <= 1) und nur 1 mal erniedrigt (im Fall x > 1)
Damit schafft es dieser Sketch nur, den Wert x am Ende der loop zuerst auf auf "1" zu stellen, im 2.Durchlauf auf "2" und da sollte er dann hängen bleiben.... (im Normal - loop increment, im else-Zweig decrement).

um eine Variable von 0 zu 1 und zurück zu wechseln kann man:

var = 1-var;
oder
var = !var;

schreiben.
So können keine anderen Werte vorkommen.

1 Like

var=var==0;

1 Like

bitte schreiben Sie so, wie Sie es im Basic schreiben würden. Wir helfen es in C++ zu übersetzen.

1 Like
var=var?LOW:HIGH;

Zur Fehlersuche und Programmverfolgung ist es sinnvoller den seriellen Monitor in der IDE zu verwenden. Dann hast Du deine Ausgaben zur Fehlersuche unabhängig vom LCD auf dem Monitor und bist auch nicht auf das kleine Display begrenzt. Dazu must Du in setup() einmal die serielle Ausgabe initiieren:

Serial.begin(115200);

und kannst dann im Sketch an den entsprechenden Stellen mit

Serial.println( ... );

deine Ausgaben machen. Du darfst nicht vergessen, im seriellen Monitor unten rechts die Baudrate auf 115200 zu stellen. Den standard (9600) würde ich nicht verwenden.

1 Like

Beschreibe doch wie hoch soll gezählt werden und umgekehrt.
Na ja, bei C++ist viel anders als bei BASIC vom C64, so neben, bei auf C64 wurde dein Sketch das gleiche zeigen wen der wehre im BASIC geschrieben :wink:

Aus dem Basic bin ich mittlerweile auch raus, ist Jahrzehnte her und der C+4 vergammelt auf dem Boden weil der analoge Monitor fehlt.
Die "For - to - next" Schleife zu verstehen und deren Eigenarten zu begreifen ist der Sinn dieses Programmablaufes mit dem Auffloppen der Zeilennummern. In Basic schreibt man etwa:
For x>1 then Print "Enkel A"
x=x-1
else Print "EnkelB"
x=x+1
next
Doch das würde sicher auch nicht laufen, hab vieles vergessen...
In dem aktuellen Sketch jedoch geht es nur mit den 4 x++ oder x-- weil ich irgendwie einen Denkfehler eingebaut habe. Das Entfernen eines x++ oder x-- bricht den Ablauf ab.
Und wie erklärt sich der Stop im Sekundenablauf?

... denk dran, dass du im normalen Ablauf des loop immer noch ein x++ hast!

Es gibt gut beschriebene Arduino Referenz

Dort ist auch alles auf Deutsch :wink:

1 Like

Ich glaube Du verwechselst da die For Schleife mit der IF Anweisung. Auch in Basic würde es mehr Sinn machen, dein Flag 'x' auf feste Werte zusetzen, und nicht hoch-runter zu zählen:

IF X>0 THEN
 PRINT "Enkel A"
 X=0
ELSE
 PRINT "Enkel B"
 X=1
ENDIF

Und da dann eine Schleife drum.
So würde es auch in C++ mehr Sinn machen, wobei Du die Schleife in Form des loop() schon automatisch drum hast.

es war IF x>1 THEN ...

10 FOR X=1 TO 5
20 PRINT "X ist gleich ";X
30 NEXT X
:wink:
Man, musste mein altes C64 buch rausholen schon ewig nicht die Kiste benutzt

2 Likes

Danke für die Hinweise, werde sie nach und nach abarbeiten. Deutsch ist wichtig - hatten in der Schule Russisch, von dem auch kaum noch etwas da ist... Englisch ist nur mit dem Goole Übersetzer verständlich, also ätzend...