Werte als Statusbar und Linien Grafik auf dem Display anzeigen lassen

Hallo,

hoffe ich könnt mir da etwas unter die Arme greifen. Habe ein paar Werte die sich auf dem Display anzeigen lassen.
Zurzeit lasse ich die Werte hier durch anzeigen:

u8g2.print(volt_net, 2);

Habe schon mal mit dem Encoder herum gespielt und ja an sich funktioniert es, bin gerade überfragt wie ich aber die Werte in verschiedene Statusbars bekomme. Damit diese auch hoffentlich geschmeidig sich verändern.

Line Graphen, also Grafik auf dem Display wäre sehr interessant, die Grafiken wäre schön wenn diese fortlaufend sind und das der speicher freigegeben wird nach erreichen eines Punktes.
Geplant sind 6 Grafiken je 2 auf 3 Displays verteilt.
Habt Ihr da ne Idee?

Hier ein Beispiel was ich meine, was ich auf Youtube gesehen habe:
YouTube

Dankeschön

Es gibt ein Sketch wie das gemacht wurde :wink:
Wen du jedoch die U8g2 verwenden willst meine dort ist auch ein Beispiel

Hallo,

habe heute damit etwas experimentiert. Bin schon mal froh das überhaupt etwas auf dem Display erscheint.
Es scheint zu funktionieren, falls der Encoder immer eine 1 ausgibt und beim betätigen eine 0, diesen habe ich zum testen verwendet.

Ich bekomme die Grafik von oben nicht gelöst nach unten ungefähr 20 Pixel muss es runter, egal was ich mache wird alles zerrissen.

Hat jemand vielleicht ne Idee wie ich yPos ändern kann? Die xPos ist bequem per Zahl änderbar.


/**
 *  Draws a scrolling graph of a single analog input (set to A0) on the OLED display
 *
 *  By Jon E. Froehlich
 *  @jonfroehlich
 *  http://makeabilitylab.io
 *
 */

#include <SPI.h>
#include <U8g2lib.h>
#include <Wire.h>
#include <U8g2Graphing.h>


#define SCREEN_WIDTH 256 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels


U8G2_GP1294AI_256X48_F_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/2, /* dc=*/U8X8_PIN_NONE, /* reset=*/15);

const int ANALOG_INPUT_PIN = 39;
const int MIN_ANALOG_INPUT = 0;
const int MAX_ANALOG_INPUT = 10;
const int DELAY_LOOP_MS = 5; // change to slow down how often to read and graph value

int _circularBuffer[SCREEN_WIDTH]; //fast way to store values 
int _curWriteIndex = 0; // tracks where we are in the circular buffer

int _graphHeight = SCREEN_HEIGHT;

void setup() {
  Serial.begin(9600);
  u8g2.begin();

  // Clear the buffer
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_6x10_tf);
  u8g2.setCursor(20, 20);
  u8g2.println("Graph Line Test");
  u8g2.sendBuffer();
  delay(2000);
  
  u8g2.clearBuffer();


}

void loop() {
  // Clear the display on each frame. We draw from the _circularBuffer
  u8g2.clearBuffer();

  // Read and store the analog data into a circular buffer
  int analogVal = analogRead(ANALOG_INPUT_PIN);
  Serial.println(analogVal);
  _circularBuffer[_curWriteIndex++] = analogVal;

  // Set the circular buffer index back to zero when it reaches the 
  // right of the screen
  if(_curWriteIndex >= 128){
    _curWriteIndex = 0;
  }
  
  
  // Draw the line graph based on data in _circularBuffer
  int xPos = 1; 
  for (int i = _curWriteIndex; i < 128; i++){
    int analogVal = _circularBuffer[i];
    drawLine(xPos, analogVal);
    xPos++;
  }
  
  for(int i = 0; i < _curWriteIndex; i++){
    int analogVal = _circularBuffer[i];
    drawLine(xPos, analogVal);
    xPos++;;
  }
  u8g2.sendBuffer();
  
  delay(DELAY_LOOP_MS);
}

/**
 * Draw the line at the given x position and analog value
 */
void drawLine(int xPos, int analogVal){
  int lineHeight = map(analogVal, MIN_ANALOG_INPUT, MAX_ANALOG_INPUT, 0, _graphHeight);
  int yPos = SCREEN_HEIGHT - lineHeight;
  u8g2.drawVLine(xPos, yPos, lineHeight);
}


Dankeschön

Und was genau meinst du damit ?

1 Like

Der Sketch ist für ein Poti nicht für Encoder.

Was für System nutzt du das Analog Pin ist auf 39, ESP32 ?

1 Like

Hallo,
ich kenne die Ug2 lib nicht so gut, aber eine Linie wird durch 4 Punkte definiert.
soweit ich den Sketch verstanden habe solle hier eine senkrechte Linie vom Messpunkt xpos, ypos bis zur x-Achse an der Position xpos, lineHeight gezogen werden.

dann sollte das so aussehen
u8g2.drawVLine(xPos, yPos, xPos, lineHeight);

Nachtrag
Sorry ich hab das V übersehen

1 Like

Ist schon ok

DrawVLine(&u8g2, x, y, h)

Der TO versucht sein Sketch anpassen nach dem aus #2, und auf dem Video wird gezeigt Poti nicht Encoder was soll der Analogeingang auswerten wen der nur 0 oder 1 (VCC) bekommt also 0 oder 1024 wird ausgegeben

1 Like

Dankeschön für die tollen Antworten,

Encoder war nur zum testen da, es löst von links nach rechts den Ablauf ab. Poti brauche ich dann eh nicht, da später eine Variable ausgelesen sein sollte.
Oder eher gesagt 6 Grafiken werden es insgesamt.

Die Höhe der Grafik kann ich anpassen, funktioniert.
Xpos kann ich auch bequem anpassen.

Nur die Grafik ist irgendwie wie angeschweist am der Ypos. Hängt am y0 am oberen Rand des Displays, möchte diese runter setzen obere linke Ecke y20 nur zum Beispiel.

Es scheint alles zu funktionieren, die Position des ganzen bekomme ich in der Y Achse nicht verändert.

Ändere ich mal den, mal anderen Wert, dann fliegt mir fast alles um die Ohren.

Gruß

Ok, fast verstanden. :wink:
Ein Foto vom Display mit der fehlerhaften Anzeige würde uns helfen.

Vermute mal, hier musst du die Position ändern.

1 Like

ist die Stelle wo sich die Y Position, Wert ändert. so lange sich die Analogwerte nicht ändern wird das nix.

1 Like

Nein oben ist Void Setup, das ist nur einmalige Anzeige.

Ja versuche mal nen Bild zu machen. Man stelle sich ein Rechteck vor, höhe und breite.
Dieses Viereck hängt am oberen Bildschirmfest, ich verstehe nicht wie ich die Höhe davon ändern kann.
Die Vline ist ja in dem Viereck gebunden.

Der Bildschirm ist 48 pixel Hoch, die Graphik ist 32 Pixel hoch.
Etwa 20 Pixel hätte ich diese gerne weiter unten, qausi am unteren Bildschirmkante. 1 Pixel drüber.

Oder kann man anders vielleicht lösen? Das die Linien erst von y47 hoch gehen.?

Er berechnet irgendwie von y0 runter mit -32 und dann wieder hoch. Hatte auch feste Werte probiert, hatte nicht funktioniert.

Vielleicht bin ich nur Blind... Das kann auch sein.

Hast du mal versucht, das zu ändern ?

Nimm Blatt Papier zeichne das und wie es soll sein, oder Foto und Zeichnung :wink:
für ein Rechteckt nimmt man
drawRBox
drawRFrame

JA :wink: du hast doch Linie ab welscher nach oben gezeichnet wird, jedenfalls so ist in dem Video

1 Like

Ja richtig, nun meine Frage ist ja wie ich diesen Bereich ändern kann. Irgendwie sehe ich den Wald vor lauter Bäume nicht...

Das ist qausi der Hintergrund:

Das ist die Vollausgeschlagene Grafik, diese möchte ich unten in die Kästchen platzieren. Oben in den Bild.


Bekomme die Grafik nicht runter, das ist mein Problem.
Ja in der Void noch mal SetCursor versucht zu ändern, da ändert sich nur die Position des Textes, beim Hochfahren.

Jemand ne Idee?

Danke euch schon mal.

Grüße

Wo ist denn deine Grafik abgespeichert ?
In dem Register wird vermutlich auch die Position festgelegt.

1 Like

Ich kann es leider nicht sagen, da so tief blicke ich da nicht durch

Da gibt es doch sicher eine Registerkarte in deiner IDE mit dem Namen
Hast du einen Link, wo der Code her ist ?

1 Like

Versuch mall

void drawLine(int xPos, int analogVal){
  int lineHeight = map(analogVal, MIN_ANALOG_INPUT, MAX_ANALOG_INPUT, 0, _graphHeight);
 int yPos = (SCREEN_HEIGHT - lineHeight)+10;
  u8g2.drawVLine(xPos, yPos, lineHeight);
}

Bin zu Faul um das ganze auf einen anderen Display umschreiben um zu testen :wink:
Ups geht gar nicht wegen U8g2Graphing.h.

1 Like

@power-dodge
Und diese Datei brauchen wir.

1 Like