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
}
...
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
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...
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).
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.
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
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?
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.
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...