Hallo Community,
Ich habe eine Verständnisfrage zu einem Sketch. Ich benutze einen
Arduino Nano und ein 0.96“ OLED Display das über IIC angeschlossen ist.
Ich habe aus einem Beispiel Sketch die Teile raus gesucht, die für mich
relevant sind und den Rest weggelassen.
Sinn dieses Programmes sollte sein, eine Art Geschwindigkeitstest
durchzuführen, wie lange der Sketch braucht um 100 Loop Durchläufe zu
schaffen. Dabei wird auf dem Display etwas angezeigt und danach der
Zähler um eins erhöht. Jetzt beginnt die Loop Funktion von vorne. Wenn
der Zähler die 100 erreicht hat, wird die Zeit in Millisekunden
angezeigt.
Nun musste ich feststellen, dass es einen Unterschied macht wo im Sketch
der Befehl
x++; steht.
Ich habe mich für zwei Möglichkeiten endschieden.
Möglichkeit 1) x++; steht direkt in der void draw() Methode. Dann
braucht mein Nano 536ms bis die 100 Loop Durchläufe erreicht sind.
Möglichkeit 2) wäre das x++; in den Loop Teil zu schreiben. Dann brauch
der Nano allerdings 4054ms bis er 100 Loopdurchläufe erreicht hat.
Von meiner Logik her, hätte ich gedacht es spielt keine Rolle wo im
Sketch die 1 addiert wird. Aber es scheint so, als würde ich hier was
nicht richtig verstanden haben.
Meine Frage ist also: kann mir jemand mit einfachen Worten erklären
warum das so ist?
Hier also der Sketch. Zählt der jetzt eigentlich noch unter kurz oder
hätte ich den als Dateianhang senden müssen ?
#include "U8glib.h"
U8GLIB_SSD1306_128X64
u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST); //U8glib,
Fast I2C / TWI 100 Neuzeichnungen in 570ms
int x = 0;
int z = 0;
void draw(){
u8g.setFont(u8g_font_6x13); // U8glib, Schriftart festlegen
u8g.drawStr( 0, 10, "Hello World"); // U8glib, Text ausgeben
u8g.setPrintPos(18,30); // U8glib, Position für Zahl
festlegen
u8g.print(x); // U8glib, Zahl an Position
schreiben
x++; // nach jedem Loopdurchlauf x+1
<- Möglichkeit 1 (536ms bis 100 Loop Durchläufe erreicht sind
if(x==100){z = millis();} // wenn 100 Loops erreicht sind
speiche die Zeit in z
u8g.setPrintPos(18,50); // schreibe an dieser Position
u8g.print(z); // den Wert von z
}
void setup(){}
void loop(){
//x++; // <-
Möglicheit 2 (4054ms bis 100 Loop Durchläufe erreichtsind)
u8g.firstPage(); do {draw();} while (u8g.nextPage()); // U8glib, Ruft
die zeichnen Methode auf
}
Sandro N. schrieb: > do {draw();} ... Die Anzahl der draw-Aufrufe ist ungleich groesser als die loop-Durchlaeufe. leo
https://www.youtube.com/watch?v=33sOIHPwpfQ Schau Dir mal an, was die Funktionen
1 | u8g.firstPage(); |
und
1 | u8g.nextPage(); |
so machen. Und nutze bitte eine gescheite Formatierung - Dein Code ist vollkommen unleserlich.
leo schrieb: > Die Anzahl der draw-Aufrufe ist ungleich groesser als die > loop-Durchlaeufe. Dann erkläre ihm doch mal, warum das so ist.
Johann J. schrieb: > Dann erkläre ihm doch mal, warum das so ist. Hat er doch schon mit "loop-Durchläufe". Dieser Wink mit dem Zaunpfahl sollte genügen.
Stefanus F. schrieb: > Dieser Wink mit dem Zaunpfahl > sollte genügen. Na ja - er sollte halt begreifen, was die ug8-Lib und ihre Funktionen so tun ...
Johann J. schrieb: > Stefanus F. schrieb: >> Dieser Wink mit dem Zaunpfahl >> sollte genügen. > > Na ja - er sollte halt begreifen, was die ug8-Lib und ihre Funktionen so > tun ... Das "Problem" ist aber von dieser Library völlig unabhängig. Es geht darum, ob die Variable x innerhalb oder außerhalb der wiederholschleife erhöht wird. Wenn man wiederholt erhöht, dann kommt da natürlich ein andere Ergebnis bei raus.
Stefanus F. schrieb: > Es geht > darum, ob die Variable x innerhalb oder außerhalb der > wiederholschleife erhöht wird. Wenn man wiederholt erhöht, dann > kommt da natürlich ein andere Ergebnis bei raus. Nö - es geht darum, dass in der Wiederholschleife das komplette Bild an das Display übergeben wird - und erst danach ein neuer Bildaufbau erfolgt. Die Änderungen ( Draw(..) ) wirken sich nur auf den noch nicht übertragenen Teil des Bildes aus - das ist im Video schön zu sehen. Deswegen sollte man eine Vorstellung von den Funktionen haben, welche man nutzt.
Der Kommentar vom "LDP" hier [1] beschreibt ganz gut wozu dieses firstPage/nextPage-loop-Gedöns gut ist (Englisch!): [1] http://henrysbench.capnfatz.com/henrys-bench/u8glib-graphics-library-user-guide/u8glib-arduino-oled-tutorial-2-playing-with-the-picture-loop/
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.
