Einstellung des Wertebereichs eines Diagramm auf dem OLED-Display mit Variablen

Ich möchte die Skalierung der y-Achse eines Diagramms auf dem OLED-Display durch Variablen festlegen, um eine möglichst gute Auflösung zu erreichen. Dazu soll ganz zum Anfang des Programms einmal ein Wert vom Helligkeitssensor geholt und dann als Mittelwert der y-Achse festgelegt werden. Die y-Achse soll dann einen Wertbereich von -50 bis +50 um diesen Mittelwert darstellen, siehe folgendes Programmierbeispiel:

Leider funktioniert das so nicht. Stattdessen wird die y-Achse von -50 bis +50, also um 0 herum skaliert. Ein Blick auf den Arduino-Quellcode zeigt auch warum:

void setup() {
tsl.begin();
senseBoxIO.powerI2C(true);
delay(2000);
display.begin(SSD1306_SWITCHCAPVCC, 0x3D);
display.display();
delay(100);
display.clearDisplay();
DataPlot.setTitle(„Helligkeit“);
DataPlot.setXLabel(„Zeit“);
DataPlot.setYLabel(„Lux“);
DataPlot.setXRange(0,3600);
DataPlot.setYRange((round((Element - 50))),(round((Element + 50))));
DataPlot.setXTick(360);
DataPlot.setYTick(25);
DataPlot.setXPrecision(0);
DataPlot.setYPrecision(0);

Element = tsl.getIlluminance();

}

Der Wert der Variable „Element“ wird erst gesetzt, wenn das Diagramm schon fertig initialisiert ist. Das Problem wird sicher klar, wenn man den Quelltext analysiert, beim reinen Blick auf das Blockly-Programm aber leider komplett unverständlich und dementsprechend eventuell etwas frustrierend.

Könnte man dort die Umwandlung der Blöcke in Arduino-Quelltext nicht noch etwas optimieren, insbesondere was die Zeitabhängigkeiten angeht?

Das schau ich mir mal, ich habe schon eine Idee woran es liegt.

Generell ist die Idee gut, leider gibt der Lichtsensor manchmal beim ersten mal Lesen keinen korrekten Wert raus, sodass das Setzten des Wertebereiches dann nicht gut funktionieren würde.

Mit folgender (händisch programmierter bzw. in der Reihenfolge verändertert) Setup-Routine hat es dann gut funktioniert:

void setup() {
senseBoxIO.powerI2C(true);
delay(2000);
display.begin(SSD1306_SWITCHCAPVCC, 0x3D);
display.display();
delay(100);
display.clearDisplay();
tsl.begin();
delay(1000);
Element = tsl.getIlluminance();

DataPlot.setTitle(“Helligkeit”);
DataPlot.setXLabel(“Zeit”);
DataPlot.setYLabel(“Lux”);
DataPlot.setXRange(0,3600);
DataPlot.setYRange((round((Element - 100))),(round((Element + 100))));
DataPlot.setXTick(360);
DataPlot.setYTick(50);
DataPlot.setXPrecision(0);
DataPlot.setYPrecision(0);
}

1 Like