OLED mit SSD1306 Info

Hab endlich rausgefunden wie ich das Display per Software Aus- & Einschalten kann:

display.ssd1306_command(SSD1306_DISPLAYOFF);

display.ssd1306_command(SSD1306_DISPLAYON);

Quelle: hier

Kann man für Batteriebetrieb Energie sparen bzw. das OLED etwas schonen (soll wohl verschleißen).
SSD1306 wird wohl recht häufig verwendet - ist ja auch recht preiswert...

1 Like

Schlagt mich - aber ich finde nix: Wie kann ich äöü im Display darstellen?

Hab mich etwas falsch ausgedrückt:

Das Sonderzeichen ö kann ich mit display.println(char(153)); einzeln darstellen. Möchte aber "Öffner" schreiben.

Geht es nur umständlich mit:

display.print(char(153));
display.println("ffner");

???

Du kannst das mit "#define" aufbauen.

So sollte das gehen:

"#define MeinWort "\x99" "ffner"

oder so

display.println("\231ffner");  // Oktal-Codes gehen immer

vorausgesetzt, dein Zeichensatz auf dem display kann was damit anfangen. Aber das ist das gleiche bei deinem char(153)

Hab es jetzt so gemacht:

#define Oeffner "\x99" "ffner"

Funktioniert super!

Darauf muß man erst mal kommen...

Danke für eure Tips !!

stoni99:
Hab es jetzt so gemacht:

#define Oeffner "\x99" "ffner"

Funktioniert super!

Darauf muß man erst mal kommen...

Danke für eure Tips !!

Na, das ist doch super.
War von mir mal so "geraten", da ich aktuell das nicht testen konnte und hier mit dem seriellen Monitor und dem LCD das nicht testen konnte. Da werden andere Codes verwendet.
Aber das Zusammensetzen hat hier auch funktioniert.

Habe das grad mal ausprobiert, bin da nämlich grad was am Testen mit dem Display, das Ö will nicht erscheinen.
Weder mit

#define Oeffner "\x99" "ffner"
u8x8.println(Oeffner);

noch mit
display.println("\231ffner");

noch mit
display.print(char(153));
display.println("ffner");

Ich habe als Font: u8x8_font_victoriabold8_r.

Ich nutze die Standard Adafruit Lib

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

...

#define Oeffner "\x99" "ffner"
#define Oeffnung "\x99" "ffnung"
#define Oeffn "\x99" "ffn"
#define Druecken "Dr" "\x81" "cken"
#define Pfortenoeffner "Pforten" "\x99" "ffner"
#define Sofortoeffnung "Sofort" "\x99" "ffnung"

.....

display.clearDisplay();
display.setCursor(0,0);
display.println("1x " Druecken);
display.println("2s " Sofortoeffnung);
display.display();

....

display.clearDisplay();
display.setCursor(0,0);
display.println("2x " Druecken);
display.println(Oeffnung " nach 10s");
display.println("2. " Oeffn ".n.weit.10s");
display.println("3. " Oeffn ".n.weit.7s");
display.display();

Funktioniert super !

Ist wohl von der verwendeten Lib abhängig....

Ist nur mal so ein Testsketch.
Ich verwende diese ...

#include <INTERVAL.h>
#include <Arduino.h>
#include <U8x8lib.h>
#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif

char output[10];
unsigned long  dauer = 5;
unsigned long  dauer_ein = 0;
unsigned long  dauer_aus = 1000;

#define Oeffner "öffner"

U8X8_SSD1306_128X64_NONAME_SW_I2C u8x8(/* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);   // OLEDs without Reset of the Display

void setup(void)
{
	u8x8.begin();
	u8x8.setPowerSave(0);
	u8x8.setFont(u8x8_font_victoriabold8_r);
	u8x8.setFontMode(1);

	Serial.begin(115200);
	
	pinMode(LED, OUTPUT);
	pinMode(A0, INPUT);
}

void loop(void)
{
	if (dauer == dauer_aus)
	{
		u8x8.clearLine(0);
		u8x8.drawString(0, 0, ltoa(analogRead(0), output, 10));
		
		u8x8.setCursor(10, 0);
		//u8x8.println(Oeffner);
		u8x8.print(char(153));
		u8x8.println("ffner");
	}

	INTERVAL(dauer)
	{
		if (dauer == dauer_aus)
		{
			u8x8.drawString(7,3,"Ein");
			digitalWrite(LED, HIGH);
			dauer = dauer_ein;
		}
		else
		{
			u8x8.drawString(7,3,"Aus");
			digitalWrite(LED, LOW);
			dauer = dauer_aus;
			
			INTERVAL_FIRST(5000, 0)
			{
				u8x8.clearLine(7);
				u8x8.drawString(0, 7, ltoa(millis(), output, 10));
			}
		}
		
		u8x8.drawString(5, 3, itoa(digitalRead(LED), output, 10));
	}
}

Probiere doch einfach mal die von Adafruit?!

FlyingEagle:
Habe das grad mal ausprobiert, bin da nämlich grad was am Testen mit dem Display, das Ö will nicht erscheinen.
Weder mit...

Dem kommst du auf die Schliche, wenn du eine Schleife aufbaust, in der du die Codes langsam hochzählst und anzeigen lässt.

So gehts auch mim Ö

u8x8.drawString(10, 0, "\xd6");
u8x8.drawString(11, 0, "ffner");

Bei der Lib ist Display On/Off:

u8x8.noDisplay();
und
u8x8.Display();

Aber mal noch ne Frage, das darstellen der Texte auf dem Display dauert ja eine Weile, wie kann man das denn beschleunigen bzw im Sketch so gestalten, dass die Darstellung den Rest des Codes nicht ausbremst? - die Geschwindigkeit der Darstellung sehe ich bei mir sekundär.

FlyingEagle:
...Aber mal noch ne Frage, das darstellen der Texte auf dem Display dauert ja eine Weile, wie kann man das denn beschleunigen bzw im Sketch so gestalten, dass die Darstellung den Rest des Codes nicht ausbremst? - die Geschwindigkeit der Darstellung sehe ich bei mir sekundär.

Aufhorch! :o

Woran erkennst du das?

Ich habe das Problem dass manchmal Ausgaben "verschluckt" werden - könnte das auch an einem zu langsamen Beschreiben liegen? Schau mal hier.
z.B. dass das Beschreiben von Ausgabe1 noch nicht beendet ist und schon die Ausgabe2 sich anmeldet. Wird Ausgabe2 dann verschluckt oder gibt es einen Ausgabepuffer der das zwischenspeichert?
Selber einen Ausgabepuffer basteln? Aber wie? :roll_eyes:

stoni99:
Ausgabepuffer

Ich habe mir das eigentlich zusammengereimt, da ich (siehe weiter oben mein Sketch) ja eine LED "blinken" lasse, je mehr ich Text aufs Display haue, um so länger ist die LED an. Ein schönes Blitzen, wie man es mit bspw. 25/250 hinbekommt ist nun nicht mehr möglich.

Wegen mir dürfte Buchstabe für Buchstabe da aufs Display wandern, Hauptsache der restliche Sketch läuft flüssig weiter.

Nachtrag: "Verschlucken" hatte ich bisher nur, wenn ich z.b. die Zeile, in der mehrere Texte stehen beim Ausgabe 2 vorher geleert habe - in der 8x8-Lib clearLine.

Nachtrag 2: Grad das hier gefunden, durchaus nicht uninteressant.