User manual
79 80
10.3 OLED Display über I2C
Hier wird eine Sinus-Funktion auf dem Display dargestellt. Dabei wird nach jedem Bildaufbau die Phase des
Sinus leicht geändert, so dass der Sinus durchzulaufen scheint.
Wir verwenden dazu ein paar praktische Elemente aus unserer Bibliothek. Der Aufruf disp_buffer_clear() löscht
den Displaybuffer. Man kann eine Löschfarbe (Schwarz oder Weiss) als Parameter angeben. Dies geschieht
aber nur in einem Buffer auf dem NANO nicht auf der OLED selbst. Die OLED zeigt zu dem Zeitpunkt noch das
aktuelle Bild an. Man nennt das auch Double Buffer Technique. Danach wird eine horizontale Linie gezeichnet.
Dazu gibt es den praktischen Befehl disp_line_lcd(). Als Parameter wird hier die Startkoordinate x,y gegeben
und die Zielkoordinate (der Zielpunkt wird auch als Punkt gezeichnet!). X geht von 0 bis 63 und y von 0 bis 47.
Der Ursprung liegt dabei links oben!
Die Funktion sin() muss noch in den Wertebereich angepasst werden, dazu wird y mit dem Range 0..47 berech-
net, sin() hat ja bekanntlich den Wertebereich -1.0 .. 1.0.
Mit disp_setpixel() werden nun genau die einzelnen Punkte der Funktion gesetzt, die durchlaufen werden. Als
Parameter gibt es x,y und die Farben weiß oder schwarz. Die Koordinate y wird vor der Ausgabe mit 47-y als
Parameter an disp_setpixel() übergeben, da der Urspung bei der OLED für 0,0 oben links liegt.
ACHTUNG: Hier liegt die Anzeige auf der Adresse 7A, ggf. den Dilschalter auf der Rückseite auf OFF stellen !
+
-
9V
1A
SCLS DA
+9V
A0
A1
Tx
Rx
PD2
SCLKMOSI
PD3
PD 6
PD 4
PD 5
PD 7
A7
A3
A2
A6
NANO
to
Br ick`R`
3,3V 5V
USB
B0
SS
MISC
B1
I²C
I²C OLED 64x48
SCL
SDA
SCL
SDA
+9V
Adr:8x,Xx
+9V
// DE_27 OLED Beispiele - Pixelroutinen
#include <Wire.h> // I2C Bibliothek
#include <avr/pgmspace.h> // Zugriff ins ROM
// Hier ggf Adresse anpassen 78 oder 7A je nach Schalter
#dene i2coledssd (0x7A>>1) // default ist 7A
// -------------------------OLED ----------------------------------------------
..... Bibliothek einkopieren.
// -------------------------END OLED ----------------------------------------------
void setup() {
Wire.begin(); // I2C Init
i2c_oled_initall(i2coledssd); // OLED Init
}
void loop() { // in der Schleife
// 64x48 Pixel OLED
static int phase=0; // Scrolleffekt hier statisch speichern
disp_buffer_clear(COLOR_BLACK); // Virtuellen Buffer loeschen BLACK = dunkel
disp_line_lcd (0,24,63,24, COLOR_WHITE); // x0,y0,x1,y1 Linie in Mitte
for (int i=0; i<63;i++) { // nun fuer alle 64 Spalten (x) des Displays
int y=0; // Sinuskurve berechnen und in Radiant umrechnen von Phase
y = (int)(23.0*sin(((double)i*3.141592*2.0)/64.0+phase/360.0*2.0*3.141592)+24.0);
disp_setpixel(i, 47-y, COLOR_WHITE); // koordinate 0,0 ist links oben daher 47-y
} // alle Spalten
disp_lcd_frombuffer(); // dann erst updaten, double buffer immerfrei
phase++; // beim nächsten Mal mit neuer Phase für den Sinus
if (phase>=360)phase=0; // Immer 0 bis 359 Grad (als DEG)
}
Was passiert? Nach dem Start erscheint eine Sinuskurve auf dem Display. Dabei scrollt die Kurve
langsam horizontal durch.










