User manual
87 88
10.7 Das OLED Display und der A/D Umsetzer als Dual Voltmeter
Diesmal werden beide A/D-Umsetzer Kanäle A0 und A1 verwendet und sind auch getrennt ansprechbar. Die
Werte werden in V auf dem OLED angezeigt.
Mit dem Universalbrick kann man zwei analoge Quellen anschliessen und messen. Der Spannungsbereich liegt
zwischen 0V bis 5V. Achtung: Trotz der Schutzschaltung, bestehend aus dem 2.2k Ohm Widerstand und der
Diode, deshalb bitte keine Spannung außerhalb des zulässigen Bereichs von 0-5V anschließen.
Diesmal wird das Ergebnis direkt in Volt, mit drei Nachkommstellen angezeigt. Da die Gleitkommaarithme-
tik beim sprintf Befehl nicht unbedingt verwendet werden kann und zudem auch langsam ist, kann man mit
einem Trick auch Integerzahlen bei der Ausgabe verwenden. Dazu gibt man die Vorkommstallen mit Wert/1000
aus, z.B. wenn der Wert mit tausend skaliert wurde (mV nach Volt) und dann die Nachkommastellen mit Wert
% 1000, also mit Hilfe der sogenannten Modulo-Funktion (siehe auch Modulo Arithmetik - nicht mit dem Be-
griff Modul zu verwechseln). Die eigentliche Ausgabe erfolgt vor dem Komma mit dem String „%d“ und nach
dem Komma mit „%03d“. Das bedeutet, drei Stellen werden reserviert und die 0 steht für „mit Nullen auffül-
len“. Dazwischen kann einfach ein Punkt oder auch Komma (Deutsche Lokalisierung) ausgegeben werden.
+
-
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
1N41481N4148
I²C OLED 64x48
SCL
SDA
SCL
SDA
+9V
Adr:8x,Xx
+9V
// DE_31 OLED Beispiele - AD Dual
#include <Wire.h>
#include <avr/pgmspace.h>
// Hier ggf Adresse anpassen 78 oder 7A je nach Schalter
#dene i2coledssd (0x7A>>1) // default ist 7A
// -------------------------OLED ----------------------------------------------
...
// -------------------------END OLED ------------------------------------------
void setup() {
Wire.begin(); // I2C Initialisieren
i2c_oled_initall(i2coledssd); // OLED Initialisieren
}
void loop() { // Schleife
// 64x48 Pixel OLED
int poti11 = analogRead(A0); // Einlesen A/D-Umsetzer 0
int poti12 = analogRead(A1); // Einlesen A/D-Umsetzer 1
char buffer[40]; // fuer die Ausgabe in ASCII
disp_buffer_clear(COLOR_BLACK); // Display loeschen
double p1 = (poti11*5000.0)/1023.0; // Spannung A0 ausrechnen
double p2 = (poti12*5000.0)/1023.0; // Spannung A1 ausrechnen
// Kleiner Trick um auch Nachkommastellen ohne Gleitkommabefehle
// auszugeben ist sie in zwei INT Werte zu zerlegen:
sprintf(buffer, „A0=%d.%03dV“,(int)p1/1000,(int)p1%1000); // ausgabe
disp_print_xy_lcd(2, 8, (unsigned char *)buffer, COLOR_WHITE, 0);
sprintf(buffer, „A1=%d.%03dV“,(int)p2/1000,(int)p2%1000); // Ausgabe
disp_print_xy_lcd(2, 28, (unsigned char *)buffer, COLOR_WHITE, 0);
disp_lcd_frombuffer(); // Dann auf das OLED Display uebertragen
delay(10); // 10ms damit nicht zu haeuge Updates
} // Ende Schleife
Was passiert? Hier werden die beiden Kanäle A0 und A1 gleichzeitig als Spannungswert in Volt an-
gezeigt. An den Klemmbrick können dazu zwei verschiedene Spannungsquellen mit einem Bereich
von 0 bis maximal 5V angeschlossen werden. Achtung: keine negativen Spannungen anlegen !










