- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 44

Thema: Uno R3 mit 128x64 Pixel Display und Dreh-Encoder grafische Anzeigeprobleme

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied
    Registriert seit
    28.05.2018
    Beiträge
    45

    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!
    Geändert von Wolle62 (01.01.2019 um 18:48 Uhr)

Ähnliche Themen

  1. Dreh-Encoder gibt "Rückschlag-Impuls" ab - wieso nur?
    Von t0bias im Forum AVR Hardwarethemen
    Antworten: 1
    Letzter Beitrag: 03.03.2014, 16:08
  2. Dreh-Encoder und Tasten gleichzeitig abfragen
    Von DerSchatten im Forum C - Programmierung (GCC u.a.)
    Antworten: 0
    Letzter Beitrag: 13.05.2011, 20:16
  3. LCD-Display 128x64 mit dem Controler T6963c
    Von heri im Forum PIC Controller
    Antworten: 8
    Letzter Beitrag: 05.06.2007, 22:04
  4. Funktioniert der Pollin-Dreh-Encoder mit BASCOM?
    Von felack im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 16
    Letzter Beitrag: 27.06.2006, 17:52
  5. Hyundai 128x64 LC-Display
    Von ShadowPhoenix im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 14
    Letzter Beitrag: 01.12.2005, 21:16

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test