- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 10 von 44

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

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.674
    Blog-Einträge
    1
    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.
    Das hatte ich heute Nacht noch nicht so gesehen, als ich mir den Code ansah. Wenn die Zahl stimmt, muss auch der Balken stimmen, denn Du führst die Zahl ja nicht extra in einer Variablen.

    Also mal zum Vertändnis:

    1. Du drehst am Rad

    2. Du veränderst damit einen Wert

    3. den Wert zeigst Du in einer Zeile am Ende an

    4. dieser Wert ist richtig und nicht falsch

    5. Du verwendest denselben Wert zur Darstellung des Balkens

    6. der Balken wird falsch dargestellt


    Vielleicht liegt es an: u8g2.drawBox()
    Eventuell brauchst Du für jede Zeile ein extra Objekt oder was in der Richtung.

    1) Wenn Du am Rad drehst und weiter und weiter und immer weiter in dieselbe Richtung, dass der Wert immer größer wird, gibt es dann mal irgendwo einen Endwert? Oder wird der Wert immer größer und größer?
    2) Was ist der maximale Wert für die Breite des Balkens in drawBox() für eine Zeile?

    Ich habe noch mal geschaut, wenn ich das richtig sehe, dann verwendet U8G2 einen Pixelpuffer in welchem man sich "bewegen" kann, indem man eine Draw-Methode aufruft und mit X- und Y-Position in Pixel die Startposition oben Links angibt. Ist das korrekt?

    Ich habe noch was gefunden in:

    Code:
    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
    Du verwendest einmal absolute Angabe und einmal aus Variable Cursor.

    ändere das entweder in:
    Code:
    u8g2.drawBox(10,Cursor,Bar1,15);  u8g2.setDrawColor(2); /* color 1 for the box */
       u8g2.drawStr(25,Cursor,"Wert 1 = ");  // write something to the internal memory
    oder in absolute Angabe, wie hier als Beispiel:

    Code:
    u8g2.drawBox(10,20,Bar1,15);  u8g2.setDrawColor(2); /* color 1 for the box */
       u8g2.drawStr(25,20,"Wert 1 = "); // write something to the internal memory

    Das ist glaub ich das Problem, dass Du in der ersten Zeile den Balken mit der Länge vom Wert aus der zweiten Zeile erzeugst und so ist das dann mit den anderen auch.

    So müsste es besser sein:

    Code:
      u8g2.setDrawColor(1); /* color 1 for the box */  
      u8g2.drawBox(10,20,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,40,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,60,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

    MfG
    Geändert von Moppi (02.01.2019 um 12:17 Uhr)

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    28.05.2018
    Beiträge
    45
    Ein JA auf alle 6 Fragen.

    Darstellungsende und maximale Balkenbreite bei dem Display ist logischer Weise 128. Da bleibt der stehen
    bis 256 512 ... ,
    dann fängt der Bargraph von vorn neu an.
    Das Gleiche gilt linksrum für negative Werte. Das grenze ich später dann ein, auf Werte, die ich benutzen kann.


    EDIT:
    Hat sich überschnitten, ich setze Deinen Ansatz mit den Werten mal in die Tat um...

    EDIT2:
    Du hast Recht!! Es läuft. Ich habe nun absolute Angeben genommen.
    Nun sind alle 3 Bargraphen immer gleichzeitig sichtbar und alle haben die richtige Länge
    und behalten die auch! Schrift ist immer zu sehen! DANKEEE !!!!!
    Der Tastendruck wechselt nun nur noch die Zuordnung des Encoders zur Zeile.
    Sieht sogar noch besser aus als vorher. Allerdings fehlt nun ein Symbol oder Cursor vorn,
    damit ich weiss in welcher Zeile ich bin.

    Hast Du da einen Ansatz auf der Hand? Ohne das ich das Problem erneut einbaue?
    Achso, wenn ich diese eingestellten Werte permanent behalten will, dann muss ich mich nun mit EEPROMs beschäftigen ?
    Geändert von Wolle62 (02.01.2019 um 12:45 Uhr)

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.674
    Blog-Einträge
    1
    Ich habe oben Sachen nachgetragen.

    In Deinem Ursprungs-Code hast Du immer die Variable Cursor zur Ausgabe der Box verwendet, aber Du hast Cursor nie geändert, um die die Box für die nächste Zeile zu zeichnen.

    MfG
    Geändert von Moppi (02.01.2019 um 12:28 Uhr)

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    28.05.2018
    Beiträge
    45
    ...aber Du hast Cursor nie geändert, um die die Box für die nächste Zeile zu zeichnen
    MMM, in der Loop habe ich dafür ein IF ELSE Konstrukt, wo der Wert für "Cursor" je nach IST-Position und Tastendruck wechselt.

    Die Koordinate der Box für Zeile 1 ist 8, da die oben links angegeben werden muss.
    Die Schrift hat aber in der gleichen Zeile bei dem Font die 20, damit die mittig drin steckt.

    Da müsste ich, sollte ich Variablen verwenden wollen, aus einer, eine zweite umrechnen lassen. Werde ich auch testen.

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.674
    Blog-Einträge
    1
    Achso entschuldige, nicht aufgepasst!

    Also 20-8 = 12.

    Code:
      u8g2.setDrawColor(1); /* color 1 for the box */
      u8g2.drawBox(10,20-12,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,40-12,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,60-12,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

    MMM, in der Loop habe ich dafür ein IF ELSE Konstrukt, wo der Wert für "Cursor" je nach IST-Position und Tastendruck wechselt.
    Das ja, das stimmt. Aber für die Ausgabe nutzt das so nichts. Weil Du beim Schreiben in den Pixelpuffer immer alles neu schreibst, nachdem der Puffer gelöscht wurde.


    MfG

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    28.05.2018
    Beiträge
    45
    Vielen Dank!

    Ich habs nun verstanden. Ohne die Hilfe wäre das nicht geworden.

    So:
    Code:
    u8g2.clearBuffer();					// clear the internal memory
     
     
      u8g2.setFont(u8g2_font_unifont_t_symbols);
      u8g2.drawGlyph(3,Cursor+12,0x2192);      //Hier ist der Pfeil
    
      u8g2.setDrawColor(1); /* color 1 for the box */
      u8g2.drawBox(10,8,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,28,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,48,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);
    geht es nun. Ich habe einen Pfeil vor dem aktiven Bargraph und alles läuft wie es soll.
    Den Rest konnte ich so lassen.
    Den Font und das Min Max des Wertes passe ich dann erstmal an...

    Danke!

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.674
    Blog-Einträge
    1
    Prima, geschafft!

    MfG

Ä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
  •  

Solar Speicher und Akkus Tests