User manual
85 86
10.6 Das OLED Display mit A/D-Umsetzer als einfaches Mini-Oszilloskope
Wenn man die Messwerte in einem Buffer speichert, kann man ein kleines Mini-Oszilloskope aufbauen. Die ma-
ximale Frequenz ist in dem Fall ziemlich klein, wenn man wie hier nach jeder Messung das Bild ausgibt. Oben
wird die Spannung in V angezeigt und unten ist das Bild des gemessenen Spannungsverlaufs zu sehen.
+
-
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
1N41481N4148
// DE_30 OLED Beispiele - AD Mini Oscilloscope
#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 ----------------------------------------------
char advalbuf[64]; // Zyklischer Speicher fuer die Messwerte
void setup() {
Wire.begin(); // I2C Initialisierung
i2c_oled_initall(i2coledssd); // OLED Initialisieriung
for (int i=0; i<64; i++) advalbuf[i]=47; // Mittelwert als Default
}
void loop() { // Messen in der Schleife
// 64x48 Pixel OLED
static int cxx = 0; // zyklischer Zaehler fuer Buffer
int poti11 = analogRead(A0); // Einlesen A/D-Umsetzer
char buffer[40]; // Ausgabebuffer feur Voltangabe
disp_buffer_clear(COLOR_BLACK); // erst mal loeschen
double p1 = (poti11*5000.0)/1023.0; // Wert am AD Wandler in mV
int y1 =0; // Temporaere Variable merkt die y Position
sprintf(buffer, „A0=%d.%03dV“,(int)p1/1000,(int)p1%1000); // Ausgabe
y1 = 47 - (p1 * 30.0)/5000.0; // 5V Max -> 30 pixel Umrechnen in pixel
advalbuf[cxx++] = y1; // merken 0..4xx V +-128 Zyklischer Buffer
disp_print_xy_lcd(2, 0, (unsigned char *)buffer, COLOR_WHITE, 0);
int i=0; // Ausgabe des zyklschen Buffers.
int yold = advalbuf[(cxx+1)%64]; // Letzer Wert
for (i=0; i<63; i++) { // alle Pixel durchlaufen (Spalten)
y1 =advalbuf[(cxx+1+i)%64]; // Neue Werte ausgeben
disp_line_lcd (i, yold, i, y1, COLOR_WHITE); // Und verbinden
yold = y1; // der alte wird zum neuen Wert, fuer Linienbildung
} // alle Pixel durch
if (cxx >63) cxx =0; // Zaehler von 0l..63 fuer zyklischen Buffer
disp_lcd_frombuffer(); // Dann alles Fertig zur Ausgabe
delay(10); // Nicht unbedingt wichtig deniert auch die Abtastrate
}
Links sieht man ein kommerzielles Oszillsokope von Rigol. Da
gibt es natürlich noch viele andere Einstellmöglichkeiten, wie
Amplitude, Frequenz und Trigger. Das Prinzip ist aber immer
das Gleiche, es gilt den Zeitverlauf eines Signals graphisch
darzustellen. Dazu hat man früher Elektronenstrahlen ver-
wendet, heute geht das elegant mit der Digitaltechnik. Solche
Scope oder im Jargon auch Oscis genannt können ziemlich
aufwendig sein. Entscheidend ist zum Beispiel der Frequenz-
bereich. Rekordwerte für ein Scope mit Echtzeitdarstellung
(also speichern des ganzen Signals) liegen aktuell bei 100 GHz
(LeCroy Teledyne LeCroy LabMaster 10-100zi 100GHz, 240GS/s
Oszilloskope ca. 1 Mio Dollar). Bei www.TheSignalPath.com
kann man sich die genauere Funktionsweise solcher High-
End-Geräte ansehen. Unser Miniscope liegt dagegen an der
unteren Skala aber immerhin ist es deutlich preiswerter.
Was passiert? Der gemessene Spannungswert wird auf dem Bildschirm in mV ausgegeben. Wenn
man an dem Poti dreht kann man einen Bereich von ca. 0 mV bis maximal 5000mV überdecken.
Dabei wird dann die Hälfte der Betriebsspanung als Maximalwert angezeigt, also normalweise ca.
4500 mV. Gleichzeitig wird in diesem Versuch auch der zeitliche Verlauf der Spannung angezeigt.
Wenn man das Poti hin- und herbewegt, kann man den Verlauf gut sichtbar machen.










