Mein Versuch mit zwei Boxen und zwei unterschiedlichen Wertebereichen.
Es kompiliert fehler- und warnungsfrei.
Ich habe keine Hardware und hab mir ein wenig zusammengereimt.
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h> // library requires for IIC communication
U8G2_GP1294AI_256X48_F_4W_HW_SPI u8g2(U8G2_R0, /* cs=*/2, /* dc=*/U8X8_PIN_NONE, /* reset=*/15);
struct BOX
{
const uint16_t x; // Frame !
const uint16_t y;
const uint16_t w;
const uint16_t h;
const uint16_t minValue; // untere Grenze, ab der angezeigt werden soll
const uint16_t maxValue; // obere Grenze bis zu der angezeigt werden soll
uint16_t peek; // Merker für oberen Anzeigewert
uint32_t peektime; // Merker, wann oberer Wert zuletzt berechnet
uint16_t value; // Variable -> Den Wert musst Du liefern!
};
BOX box[] =
{
{20, 2, 100, 14, 100, 500, 0, 0, 0}, // X, Y, Widht, High, Min-Begrenzung, Max-Begrenzung, merker, merker, Messwert
{20, 33, 100, 14, 0, 999, 0, 0, 0}
} ;
const byte frameFree = 2; // Pixel zwischen Frame und Balken
const uint32_t refreshTime = 30; // "delay"
const uint32_t intervall = refreshTime * 6; // Berechnet, damit der Balken stehen bleibt :)
void setup(void)
{
Serial.begin(9600);
u8g2.begin();
randomSeed(analogRead(A0));
}
void loop(void)
{
// RANDOM Value setzen
for (byte b = 0; b < sizeof(box) / sizeof(box[0]); b++)
{ box[b].value = random(box[b].minValue, box[b].maxValue); }
// Wenn nicht random, muss ein Realwert mit jedem Umlauf eingefügt werden
/*
box[0].value = ;
box[1].value = ;
*/
setDisplay();
}
void setDisplay()
{
u8g2.clearBuffer();
for (byte b = 0; b < sizeof(box) / sizeof(box[0]); b++)
{
// Begrenzung für map
if (box[b].value > box[b].maxValue)
{ box[b].value = box[b].maxValue; }
if (box[b].value < box[b].minValue)
{ box[b].value = box[b].minValue; }
// Balkenlänge ermitteln
uint16_t balken = map(box[b].value, box[b].minValue, box[b].maxValue, 0, box[b].w - frameFree * 2);
Serial.print(F("\r\n BoxNummer / Value / Balkenlänge: "));
Serial.print(b);
Serial.print(' ');
Serial.print(box[b].value);
Serial.print(' ');
Serial.println(balken);
// Frame setzen
u8g2.drawFrame(box[b].x, box[b].y, box[b].w, box[b].h);
// Balken in den Frame
u8g2.drawBox(box[b].x + frameFree, box[b].y + frameFree, box[b].w + frameFree + balken, box[b].h - frameFree);
if (box[b].peek < balken)
{
box[b].peek = balken;
box[b].peektime = millis();
}
else
{
if (millis() - box[b].peektime < intervall)
{
const byte lines = 1;
u8g2.drawBox(box[b].x + frameFree + box[b].peek - lines, box[b].y + frameFree, lines, box[b].h - frameFree);
}
else
{ box[b].peek = 0; }
}
}
u8g2.sendBuffer();
delay(refreshTime);
}
Der Peek soll nen Moment mit einer 1pixel-Line stehen und dann verschwinden.
Wenn das auf dem Display verschoben ist, dann hab ich mich mit den x/y-Koordinaten verhauen...
Der Balken als solches wird Dir immer noch zu hektisch sein, aber eins nach dem anderen
Ich bin da jetzt irgendwie raus, auf was Du Dich beziehst, aber ich hab ja geschrieben, dass da ein cast notwendig ist.
Und bei meiner Erklärug hab ich mich mit jeweils einer Klammer vertan.
Nicht die gesamte Rechnerei gehört da rein, sondern nur der erste Wert.
Ich habs geändert.
Na dann...