Forum: Mikrocontroller und Digitale Elektronik Stimmt mit meinem OLED Display etwas nicht?


von Julian D. (juli_elektronik)


Lesenswert?

Hallöchen,
Hab mir letztens ein 0,96 zoll I²C 128x64p OLED Display gekauft. Dieses 
will ich mit einem Arduino Uno ansteuern. Aber bei den ersten Tests 
haben sich schon Probleme ergeben. Nur zur Info, ich bin bezüglich 
Arduino noch nicht besonders weit, kenne nur das was wir in diesem Jahr 
in der Schule gelernt haben und ich hab mich ein bisschen selbst 
informiert. Beim Display kenn ich mich noch weniger aus, bei meinem gab 
es eine pdf mit einem Beispielcode. Was ich damit sagen will, ist, dass 
ich nicht weiß ob das Display spinnt oder ich einen Fehler mache.
1
 
2
#include <U8g2lib.h>
3
#include <Wire.h>
4
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);
5
6
7
void setup() {
8
  // put your setup code here, to run once:
9
10
u8g2.begin();
11
}
12
13
14
void loop() {
15
  // put your main code here, to run repeatedly:
16
17
int i = 5;
18
19
 u8g2.setFont(u8g2_font_t0_11_tf); 
20
 u8g2.setFontRefHeightExtendedText(); 
21
 u8g2.setDrawColor(1);
22
 u8g2.setFontPosTop();
23
 u8g2.setFontDirection(0);
24
u8g2.drawStr(1, 1, i);
25
u8g2.sendBuffer();
26
delay(25);
27
}

Ich verwende die U8G2 Library (hab sie natürlich installiert). Hier habe 
ich diese "Standardzeilen", die man ja anscheinend immer braucht, aus 
dem Beispielcode übernommen. Eigentlich sollte hier einfach nur eine 
Variable deklariert und dann am Display ausgegeben werden. Aber das 
Display zeigt gar nichts an. Wenn ich z.b.
1
u8g2.drawStr(1, 1, "1");
schreibe, dann wird 1 ausgegeben wie gewünscht.
Ich habe auch probiert, eine als double gespeicherte variable 
auszugeben, aber da gibt es eine fehlermeldung, anscheinend weil die 
"Koordinaten" für die Position der Schrift int sind.
1
no known conversion for argument 3 from 'double' to 'const char*'
2
exit status 1
3
no matching function for call to 'U8G2_SSD1306_128X64_NONAME_F_HW_I2C::drawStr(int, int, double&)'
Kann mir bitte jemand weiterhelfen?
LG Julian

von Johannes S. (Gast)


Lesenswert?

drawStr möchte einen String ausgeben, also muss die int oder double 
Variable erst in einen String konvertiert werden.

von Julian D. (juli_elektronik)


Angehängte Dateien:

Lesenswert?

Das hier ist das was ich eigentlich vorhatte. Ich habe ein 3kW 
Schaltnetzteil (42V @ 66A) bei dem ich eine stromgeregelte 
Lüftersteuerung und eine Anzeige für die aktuelle Lüftergeschwindigkeit 
in %, Ausgangsstrom und später auch noch Ausgangsspannung un 
Ausgangsleistung einrichten wollte. Hab mal den Sketch hochgeladen den 
ich bis jetzt habe. Aber da ich einige Male etwas geändert und 
ausprobiert habe ist das ganze unübersichtlich, es fehlen vielleicht 
Teile, manche sind zu viel usw. Grundsätzlich funktioniert es aber 
eigentlich. ich habe die Spannung am shunt mal mit einem Poti simuliert 
aber das was am Display angezeigt wird ist komisch. statt 0A bzw 0% wird 
eine Art "y" mit zwei punkten oben wie bei einem "ü" angezeigt. Wenn ich 
dann am Poti herumdrehe werden scheinbar willkürlich Buchstaben mit 
Anhängseln oben, Zahlen, Sonderzeichen und manchmal seltsamerweise auch 
Luefter: (was eigentlich woanders steht). Sieht man in dem video das ich 
angehängt habe. Mich erinnert das ein bisschen daran wie wenn man am 
Serial Monitor diese Zahl falsch einstellt, die glaub ich die 
Sende-/Lesefrequenz bestimmt.

Woher kommen diese Zeichen?

Noch etwas: Ich habe das so verstanden dass wenn man ein paar mal etwas 
am Display ausgibt, also z.b. ein paar mal u8g2.drawStr("***"); dann 
wird das erst wirklich ans Display geschickt wenn man sendBuffer(); 
schreibt. Richtig? Dann hab ich gelesen, dass clearBuffer(); bewirkt, 
dass nur diese zwischengespeicherten Daten gelöscht gelöscht werden. Bei 
mir wird aber alles am Display gelöscht!? Das sollte doch eigentlich 
clearDisplay machen, nicht?

von Julian D. (juli_elektronik)


Lesenswert?

Johannes S. schrieb:
> drawStr möchte einen String ausgeben, also muss die int oder double
> Variable erst in einen String konvertiert werden.

Danke. Wie mache ich das?

von Johannes S. (Gast)


Lesenswert?

Julian D. schrieb:
> Danke. Wie mache ich das?

da gibt es viele Wege, ein einfacher ist über die Stringklasse:
https://www.arduino.cc/reference/de/language/variables/data-types/stringobject/

an drawStr() dann als Adresse des Strings myString.c_str() übergeben.

von Pepe T. (pepe_t)


Lesenswert?

> Danke. Wie mache ich das?

sprintf ?

von Andreas S. (bastelmax)


Lesenswert?

Ich habe die Ausgabe immer so realisiert (bin selbst Anfänger):

#include <U8g2lib.h>
#include <Wire.h>

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);

void setup(void) {
  u8g2.begin();
}

void loop(void) {

  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_ncenB18_tr);
    u8g2.drawStr(15,30,"Hello World !");
    u8g2.drawStr(0,70,"U8G2 with OLED");
  } while ( u8g2.nextPage() );

}

Ich hoffe, dass ich nichts vergessen habe.
Auch sehen verschiedene Fonts auf den OLED je nach Auflösung
entsprechend mies aus. Da musste ich auch lange nach einen
passenden Font suchen. Die Fontübersicht gibt es auf GitHub.
Als Anfänger habe ich mich an lauffähige Beispiele orientiert
und daraus auch gelernt die Formatierung der Anzeige "hinzubekommen".
Noch ein Tipp: melde dich beim Arduinoforum in der deutschen 
Benutzergruppe an.Da wird verstärkt auf Anfänger Rücksicht genommen.

: Bearbeitet durch User
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
Noch kein Account? Hier anmelden.