Uno R3 mit 128x64 Pixel Display und Dreh-Encoder grafische Anzeigeprobleme
Werte Community,
ich bin immer noch autodidaktisch mit Übungen am Uno beschäftigt.
Nachdem ich nun das 128x64 Pixel Grafikdisplay und den Dreh-Encoder einzeln ansatzweise ergründet habe, sollte die beiden nun zusammen arbeiten.
Dazu habe ich mir 3 Zeilen mit je dem Text "Wert 1, Wert 2, Wert 3" erstellt, an deren Ende der eingelesene Wert des Dreh-Encoders ausgegeben wird.
Mit dem Button des Encoders kann ich die Zeilen "im Kreis herum" anspringen und die 3 Werte jeweils durch drehen ändern.
Das klappt prima.
Nun dachte ich mir: "Du hast hier ein Grafikdisplay!, Da geht ein bisschen Spielerei!"
Dazu habe ich um die Zeilen ein Rechteck zeichnen lassen, welches dann, je nach diesem vorhandenen Encoder-Wert (der rechts in jeder Zeile zusätzlich dezimal ausgegeben wird) von links schwarz gefüllt wird. Wie ein Bargraph eben so ist...
Die Schrift invertiert dabei allein. Das klappt in jeder Zeile allein auch.
Aber das Problem ist, dass zwar die Zahl rechts immer richtig ist, der Wert der Variablen stimmt also, aber der "Bargraph" mit der selben Variablen nicht richtig läuft.
Der höchste Wert, der in einer der 3 Zeilen "eingedreht" wird überlagert beim Zeilenwechsel den nächsten Graphen. Auch die Schrifttransparenz ist davon betroffen. Erst über dem "Überlagerungswert" ist sie dann wieder zu sehen.
Lacht ruhig über meine primitiven Versuche! Der Code ist bestimmt irgendwo zu kompliziert gedacht und umgesetzt.
Für Verbesserungsvorschläge und Hinweise bin ich echt dankbar.
Hier der Code:
Code:
#include <Arduino.h>
#include <U8g2lib.h>
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
U8G2_ST7565_64128N_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);
int volatile Encoderwert = 1; // Wert vom Drehencoder
int Bar1=1; // Variable von Bargraph 1 und Zahl
int Bar2=1; // 2
int Bar3=1; // 3
int taster=4; // Alias für Pin4
int tasterstatus=0; // Tasterstatusvariable
int Cursor=8; // Variable für Y Achse des zu steuernden Bargraphs und der Zahl rechts
// 8 = Zeile 1, 28 = Zeile 2, 48 = Zeile 3
void setup(void) {
u8g2.begin(); //Displayeinstellungen
u8g2.setContrast(128);
u8g2.setFlipMode(0);
u8g2.setFontMode(1); // activate transparent font mode
pinMode(3, INPUT); //Pin 2 und 3 für Drehencoder
pinMode(2, INPUT);
pinMode(taster, INPUT); // Pin 4 für Taster
attachInterrupt(digitalPinToInterrupt(2),Encoderread,CHANGE);
}
void loop(void) {
tasterstatus=digitalRead(taster); //Tasterabfrage
if ((tasterstatus == HIGH)&&(Cursor==8)) //Wenn gedrückt und Cursor steht auf Y Position 8
{
Cursor=Cursor+20; //Schalte den Cursor weiter auf Y Pos. 28 (Zeile 2)
Encoderwert=Bar2; //Der Encoderwert wird durch den Wert von Bar2 ersetzt
} // damit die nicht vom Bar1 Wert überschrieben wird
else if ((tasterstatus == HIGH)&&(Cursor==28)) //Wenn Taste gedrückt und Y Position steht auf 28
{
Cursor=Cursor+20; //Dann Cursor auf Y Position 48 weiterschalten (Zeile3)
Encoderwert=Bar3; //Wie oben
else if ((tasterstatus == HIGH)&&(Cursor==48)) //Taste gedrückt und Y Pos. ist auf 48
{
Cursor=8; // wieder zurück auf Y Pos 8 (Zeile1)
Encoderwert=Bar1; // wie oben
}
else if (Cursor==8) // Ist der Taster nicht gedrückt und Y Pos ist 8
{
Bar1=Encoderwert; // geht der Wert aus "Encoderwert" auf die Bargraph 1 Variable "Bar1"
}
else if (Cursor==28)
{
Bar2=Encoderwert; // Wie bei Bargraph 1
}
else if (Cursor==48)
{
Bar3=Encoderwert; // Wie bei Bargraph 1
}
u8g2.clearBuffer(); // clear the internal memory
u8g2.setFont(u8g2_font_ncenB08_tr); // choose a suitable font
u8g2.setDrawColor(1); /* color 1 for the box */
u8g2.drawBox(10,Cursor,Bar1,15);
u8g2.setDrawColor(2); /* color 1 for the box */
u8g2.drawStr(25,20,"Wert 1 = "); // write something to the internal memory
u8g2.setCursor(95, 20);
u8g2.print(Bar1); // write something to the internal memory
u8g2.setDrawColor(1); /* color 1 for the box */
u8g2.drawBox(10,Cursor,Bar2,15);
u8g2.setDrawColor(2); /* color 1 for the box */
u8g2.drawStr(25,40,"Wert 2 = "); // write something to the internal memory
u8g2.setCursor(95, 40);
u8g2.print(Bar2); // write something to the internal memory
u8g2.setDrawColor(1); /* color 1 for the box */
u8g2.drawBox(10,Cursor,Bar3,15);
u8g2.setDrawColor(2); /* color 1 for the box */
u8g2.drawStr(25,60,"Wert 3 = "); // write something to the internal memory
u8g2.setCursor(95, 60);
u8g2.print(Bar3); // write something to the internal memory
u8g2.sendBuffer(); // transfer internal memory to the display
delay(250);
}
void Encoderread(){
if(digitalRead(2)!= digitalRead(3))
Encoderwert--;
else Encoderwert++;
}
Irgendwie waren alle Umlaute nach der Vorschaufunktion gestört?? Bin mit Windows 7 unterwegs?? Kann oder muss ich hier was einstellen?
Habe es erstmal korrigiert
Danke!
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo Moppi,
Danke für die schnelle Hilfe.
Zum Verständnis der Darstellung mal ein Bild im Anhang. Der Bargraph geht jeweils über die Schrift. Min und Max habe ich noch nicht festgelegt. Beim Start ist ja "1" definiert...
Anhang 33902
Man sieht oben, dass der Bargraph die Schrift überdeckt. Die wäre normaler Weise jetzt auf die Länge invertiert zu sehen.
Der Balken hat jetzt die Länge des Wertes 43 aus Zeile 2! Das ist auch das Problem..
Also:
Der in irgendeiner Zeile maximale Wert von allen drei Zeilen wird beim durchschalten durch die Zeilen mit dem Button leider immer auf die anderen Zeilen verschleppt. Hinten, wo die gleiche Variable als Zahl angezeigt wird, stimmt die immer.
Drehe ich nun weiter, wird der Rest der Schrift ab dem Wert (Länge) 43 wieder invertiert sichtbar.
Ich hatte erwartet, dass der Bargraph beim Durchschalten automatisch immer die Länge der Zahl hinten bekommt, da es ja die selbe Variable ist??
Mit Deiner Änderung passiert nun folgendes:
Ich muss immer mit dem Encoder über den Wert 100 kommen, dann erscheint der Bargraph mit der Länge 50 auf einen Schlag und geht dann normal weiter jeden 2. Step.
Vor 100 ist keiner zu sehen.
Ich habe testweise mal alle Bargraphs im Sketch "parallel geschaltet" um ein Ansteuerproblem beim Display auszuschliessen. Dann laufen die sauber alle 3 gleichzeitig mit dem Encoder mit. Und die Schrift bleibt auch lesbar. Das Umschalten macht das Problem.
Gibt es bei der U8G2 Lib einen Unterschied zwischen "DrawBox" und "Print(Text)"?