Oled Display Programmierung

Hallo,
ich möchte bei meinem Oled Display (128x64) SSD1306 zwei Werte ausgeben.
Da ich eine größere Schriftart gewählt habe sind auf dem Display nur zwei Zeilen ersichtlich.
In der oberen sollte dauerhaft der selben Wert stehen.
In der zweiten Zeile sollte sich die Anzeige aber ca. im Sekundentakt ändern.

Die Werte die auf dem Display angezeigt werden sind erfunden, also werden zb nicht von einem Sensor bezogen.

Mein Problem ist die Programmierung wie ich es schaffe den unteren Wert zu verändern ohne das sich alles verschiebt.
Welchen Befehl könnte ich verwenden?
Hat jemand ein Beispiel Code?

Danke!

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Dann zeig doch mal, was du bisher programmiert hast.
Da können wir sicher Tipps geben und dir helfen.

Hallo max21031

Es gibt eine große Anzahl von Tutorials in denen alles Funktionen für das OLED vorgestellt werden.

Viel Spass beim Basteln

Welche Schnittstelle, I²C, SPI ...

Welcher Arduino?

Nur Zahlen, nur ASCII-Buchstaben, UTF-8-Zeichen?

Hier einmal mein Code.
Mein Problem liegt darin das sich die untere Zeile im Display, sprich RPM nicht überschreiben lässt, sondern man (meiner Meinung nach) weiter scrollen müsst um die Werte anzeigen zu lassen. Gibt es da eine Lösung um den vorherigen Wert direkt zu überschreiben?

void loop() 
{
  display.print("PS:    560");
  /*display.print("RPM: ");
  display.print(2.4,3);*/
  funktionrpm();
  display.display();
}

void funktionrpm()
{
  int rpm;
  for(rpm = 0; rpm < 11;rpm++)
  {
    display.print("RPM:   ");
    display.print(rpm);
    delay(200);
  }

  display.display();
}

Das ist nur ein Fragment, da kann ich nicht viel mit anfangen.

Bitte beantworte meine Fragen.

Arduino über I2C. Ausgabe sind nur Buchstaben und Zahlen

Warum postest du nicht den kompletten Sketch ?
Oder sollen wir den Rest würfeln ?

Nein ihr braucht nicht würfeln...

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
 
#define DISPLAY_I2C_ADDRESS 0x3C
#define DISPLAY_WIDTH 128  // Breite in Pixeln
#define DISPLAY_HEIGHT 32  // Höhe in Pixeln
Adafruit_SSD1306 display(DISPLAY_WIDTH, DISPLAY_HEIGHT, &Wire, -1);
#define BITRATE 9600
 
void setup() 
{
  Serial.begin(BITRATE);
  
  if(!display.begin(SSD1306_SWITCHCAPVCC, DISPLAY_I2C_ADDRESS)) 
  {
    Serial.println("SSD1306 nicht gefunden");
    for(;;);
  }
  
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
}
void loop() 
{
  display.print("PS:    560");
  /*display.print("RPM: ");
  display.print(2.4,3);*/
  funktionrpm();
  display.display();
}

void funktionrpm()
{
  int rpm;
  for(rpm = 0; rpm < 11;rpm++)
  {
    display.print("RPM:   ");
    display.print(rpm);
    delay(200);
  }

  display.display();
}

Sehr gut.

Das kommt in dein Setup:

Und in der Funktion schreibst du den Wert immer an einen bestimmten Punkt mit "setCursor".
Dann den alten Wert mit:

display.setTextColor(BLACK);

überschreiben. Danach den neuen Wert mit

display.setTextColor(WHITE);

reinsetzen. Und das immer an der gleichen "setCursor"-Position.

Kurze Nachfrage: Wieviele Zeichen passen in eine Zeile, wenn Du die voll beschreiben würdest?

Der gleicher Gedanke, bei Size2 :wink:
Bei Ada durfte das gehen (2,1), probieren kostet nix

Das widerspricht sich, 32 oder 64.

Schau mal in den Online-Shop, wie viele ganz unterschiedliche Arduinos es gibt.

Du gehst in einen Schuhladen und sagst: "Ich möchte Schuhe kaufen!" Ha ha!

Letztlich interessiert mich der verfügbare Speicher.

Was ich zum Testen habe:

  • ATtiny: ganz knapper Speicher
  • UNO, Nano, ProMini: Fontdefinitionen sollten sparsam verwendet werden
  • Mega2560: der Speicher reicht normalerweise
  • ESP32 und Teensy 3.2: keine Arduinos, aber mittels Arduino-IDE programmierbar, da muß man sich anstrengen, den Speicher zu füllen.

Mein OLED hängt gerade am ESP32, also teste ich mit dem, solange ich von Dir keine genaueren Angaben habe.

Abweichend von #11 würde ich den Speicher immer löschen und neu beschreiben.

snprintf für den UNO und printf formatieren die Ausgabe.

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

#define DISPLAY_I2C_ADDRESS 0x3C
#define DISPLAY_WIDTH 128  // Breite in Pixeln
#define DISPLAY_HEIGHT 64  // Höhe in Pixeln
Adafruit_SSD1306 display(DISPLAY_WIDTH, DISPLAY_HEIGHT, &Wire, -1);

void setup()
{
  if (!display.begin(SSD1306_SWITCHCAPVCC, DISPLAY_I2C_ADDRESS))
  {
    Serial.println("SSD1306 nicht gefunden");
    for (;;);
  }

  display.setTextSize(2);
  display.setTextColor(WHITE);
}
void loop()
{
  display.clearDisplay();
  display.setCursor(0, 0);
  display.println("PS:    560");
  funktionrpm();
  display.display();
  delay(200);
}

void funktionrpm()
{
  static unsigned int rpm;
  //char buf[15];
  //snprintf(buf, sizeof(buf), "RPM:%6d", rpm);  // Macht die Anzeige rechtsbündig
  //display.print(buf);
  display.printf("RPM:%6d", rpm);
  rpm++;
  if (rpm > 10) rpm = 0;
}

grafik

10

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.