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
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);
}
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);
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
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.
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.
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.