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!
Lesezeichen