ssd1306_128x64_i2c Schriftart ändern möglich ?

Hallo liebe Leute

Weiss jemand im Forum, ob es möglich ist, unter dem Beispiel Script ssd1306_128x64_i2c eine andere Schriftart zu installieren ?

Der Grund dafür ist, dass ich mit der Standart Schrift das Grad Symbol °
nicht darstellen kann.

Ich habe zwar andere Beispiel Scrips gefunden, wie zum Beispiel "SSD1306SimpleDemo".
Dort können andere Schriftarten gewält werden und das ° Symbol wird korrekt dargestellt.
Bei diesem Script weiss ich nicht, wie ich dort eigene Bitmaps auf dem Display darstellen kann.
Grundsätzlich müsste dies auch hier möglich sein.
Ich habe noch nicht herausgefunden, wie ich dies realisieren kann.
Für Tips hierfür wäre ich auch dankbar.

Hier wird im Beispiel "SSD1306SimpleDemo" ein Bitmap dargestellt.

void drawImageDemo() {
// see http://blog.squix.org/2015/05/esp8266-no...e-xbm.html
// on how to create xbm files
display.drawXbm(34, 14, WiFi_Logo_width, WiFi_Logo_height, WiFi_Logo_bits);
}

Bitmaps darzustellen ist für mein Projekt aber zwingend nötig.
Beim "ssd1306_128x64_i2c" Beispiel habe ich bereits erfolgreich eigene Bitmaps integrieren können, dafür besteht hier das Problem mit den Schriftarten.
Ich habe zwar einen Artikel gefunden welcher die Installation von anderen Schriftarten mit der Adafruit GFX library beschreibt, nur leider scheint dies nicht mit dem Beispiel "ssd1306_128x64_i2c" kompatibel zu sein.

Hier der Link zum Artikel:
https://learn.adafruit.com/adafruit-gfx-...sing-fonts

Ich habe versucht gemäss diesem Beispiel eine neue Schriftart zu installieren.
Der Aufruf um die Schriftart zu ändern würde zum Beispiel so aussehen:
tft.setFont(&FreeMonoBoldOblique12pt7b);

die Aufrufe aus dem Beispiel beginnen alle mit "display.set"

zum Beispiel so:
display.setTextSize(2); // Draw 2X-scale text

Beim compilieren bekomme ich dann folgende Fehlermeldung:
'tft' was not declared in this scope

tft in display umbenennen bringt auch nichts, was für mich auch logisch erscheint.

Ich blick gerade nicht mehr durch und bin für Eure Hilfe dankbar.

PS, ich habe den gleichen Beitrag ebenfalls auf "arduinoforum.de" gepostet.

Hilli Grallo, äh Hallo Grilli ;-))

doppelposten wird hier gar nicht gerne gesehen.

am meisten hilft den ganzen Sketch als code-section zu posten
just three steps

  1. press Ctrl-T for autoformatting your code
  2. do a rightclick with the mouse and choose "copy for forum"
  3. paste clipboard into write-window of a posting

'tft' was not declared in this scope sagt aus das das "Objekt" tft nicht definiert wurde.
Was man statt "tft" schreiben muss könnte ich hier jetzt schon schreiben wenn du deinen Sketch schon gepostest hätest.

Ob noch weitere Änderungen nötig sind kann man - tja was wohl ? sagen wenn du deinen Sketch gepostest hast.

vgs

Bei diesem Display kann man einzelne Pixel nach belieben setzen. Es hat selbst keine Schriftarten. Der Controller setzt die Pixel an den richtigen Stellen um ein Zeichen darzustellen. Bitmaps sind nichts anderes als "Bildschirmbilder" die in das Display geladen werden.
Um eine Schrift auf das Display darstellen zu können mussen irgendwo die Schriftart gespeichert sein. Ich nehme mal an die sind in der Bibliothek gespeichert. Wenn Du nur 1 anderes Zeichen brauchst dan ändere eines was Du nicht brauchst.
Welche Bibliothek verwendest Du? bitte Link.
Grüße Uwe

Danke für Eure Antworten.
Ich werde zukünftig keine doppelpostings mehr machen, kann aber den Beitrag auf arduinoforum.de nicht mehr löschen.
Anscheinend muss ich den Code noch kürzen, da er zu lang um Posten ist.

Hier mal der Link zu der Bibliothek:

/**************************************************************************
  This is an example for our Monochrome OLEDs based on SSD1306 drivers

  Pick one up today in the adafruit shop!
  ------> http://www.adafruit.com/category/63_98

  This example is for a 128x64 pixel display using I2C to communicate
  3 pins are required to interface (two I2C and one reset).

  Adafruit invests time and resources providing this open
  source code, please support Adafruit and open-source
  hardware by purchasing products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries,
  with contributions from the open source community.
  BSD license, check license.txt for more information
  All text above, and the splash screen below must be
  included in any redistribution.
 **************************************************************************/

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_TFTLCD.h> // Hardware-specific library 
#include <Adafruit_SSD1306.h>
#include <Fonts/FreeSansOblique12pt7b.h>    // Zusätzliche Schriftart hinzufügen

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define NUMFLAKES     10 // Number of snowflakes in the animation example

#define LOGO_HEIGHT   16
#define LOGO_WIDTH    16

static const unsigned char PROGMEM logo_bmp[] =
{ B00000000, B11000000,
  B00000001, B11000000,
  B00000001, B11000000,
  B00000011, B11100000,
  B11110011, B11100000,
  B11111110, B11111000,
  B01111110, B11111111,
  B00110011, B10011111,
  B00011111, B11111100,
  B00001101, B01110000,
  B00011011, B10100000,
  B00111111, B11100000,
  B00111111, B11110000,
  B01111100, B11110000,
  B01110000, B01110000,
  B00000000, B00110000 };

void setup() {
  Serial.begin(9600);

  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for (;;); // Don't proceed, loop forever
  }

  // Show initial display buffer contents on the screen --
  // the library initializes this with an Adafruit splash screen.
  display.display();
  delay(2000); // Pause for 2 seconds

  // Clear the buffer
  display.clearDisplay();

  // Draw a single pixel in white
  display.drawPixel(10, 10, SSD1306_WHITE);

  // Show the display buffer on the screen. You MUST call display() after
  // drawing commands to make them visible on screen!
  display.display();
  delay(2000);
  // display.display() is NOT necessary after every single drawing command,
  // unless that's what you want...rather, you can batch up a bunch of
  // drawing operations and then update the screen all at once by calling
  // display.display(). These examples demonstrate both approaches...

  


  
  

  testdrawchar();      // Draw characters of the default font

  testdrawstyles();    // Draw 'stylized' characters

  testscrolltext();    // Draw scrolling text

  testdrawbitmap();    // Draw a small bitmap image

  // Invert and restore display, pausing in-between
  display.invertDisplay(true);
  delay(1000);
  display.invertDisplay(false);
  delay(1000);

  testanimate(logo_bmp, LOGO_WIDTH, LOGO_HEIGHT); // Animate bitmaps
}

void loop() {
}

void testdrawchar(void) {
  display.clearDisplay();

  display.setTextSize(1);      // Normal 1:1 pixel scale
  display.setTextColor(SSD1306_WHITE); // Draw white text
  display.setCursor(0, 0);     // Start at top-left corner
  display.cp437(true);         // Use full 256 char 'Code Page 437' font

  // Not all the characters will fit on the display. This is normal.
  // Library will draw what it can and the rest will be clipped.
  for (int16_t i = 0; i < 256; i++) {
    if (i == '\n') display.write(' ');
    else          display.write(i);
  }

  display.display();
  delay(2000);
}

void testdrawstyles(void) {
  display.clearDisplay();
  //
  tft.setFont(&FreeSansOblique12pt7b.h);  // Dieser Aufruf funktioniert nicht !
  display.setTextSize(1);             // Normal 1:1 pixel scale
  display.setTextColor(SSD1306_WHITE);        // Draw white text
  display.setCursor(0, 0);            // Start at top-left corner
  //display.println(F("Hello, world!"));
  display.println(F("TEST"));

  display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Draw 'inverse' text
  display.println("Zeile 2");

  display.setTextSize(2);             // Draw 2X-scale text
  display.setTextColor(SSD1306_WHITE);
  display.print(F("0x")); display.println(0xDEADBEEF, HEX);

  display.display();
  delay(2000);
}

void testscrolltext(void) {
  display.clearDisplay();

  display.setTextSize(2); // Draw 2X-scale text
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(10, 0);
  display.println(F("scroll"));
  display.display();      // Show initial text
  delay(100);

  // Scroll in various directions, pausing in-between:
  display.startscrollright(0x00, 0x0F);
  delay(2000);
  display.stopscroll();
  delay(1000);
  display.startscrollleft(0x00, 0x0F);
  delay(2000);
  display.stopscroll();
  delay(1000);
  display.startscrolldiagright(0x00, 0x07);
  delay(2000);
  display.startscrolldiagleft(0x00, 0x07);
  delay(2000);
  display.stopscroll();
  delay(1000);
}

void testdrawbitmap(void) {
  display.clearDisplay();

  display.drawBitmap(
    (display.width()  - LOGO_WIDTH ) / 2,
    (display.height() - LOGO_HEIGHT) / 2,
    logo_bmp, LOGO_WIDTH, LOGO_HEIGHT, 1);
  display.display();
  delay(1000);
}

#define XPOS   0 // Indexes into the 'icons' array in function below
#define YPOS   1
#define DELTAY 2

void testanimate(const uint8_t *bitmap, uint8_t w, uint8_t h) {
  int8_t f, icons[NUMFLAKES][3];

  // Initialize 'snowflake' positions
  for (f = 0; f < NUMFLAKES; f++) {
    icons[f][XPOS]   = random(1 - LOGO_WIDTH, display.width());
    icons[f][YPOS]   = -LOGO_HEIGHT;
    icons[f][DELTAY] = random(1, 6);
    Serial.print(F("x: "));
    Serial.print(icons[f][XPOS], DEC);
    Serial.print(F(" y: "));
    Serial.print(icons[f][YPOS], DEC);
    Serial.print(F(" dy: "));
    Serial.println(icons[f][DELTAY], DEC);
  }

  for (;;) { // Loop forever...
    display.clearDisplay(); // Clear the display buffer

    // Draw each snowflake:
    for (f = 0; f < NUMFLAKES; f++) {
      display.drawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h, SSD1306_WHITE);
    }

    display.display(); // Show the display buffer on the screen
    delay(200);        // Pause for 1/10 second

    // Then update coordinates of each flake...
    for (f = 0; f < NUMFLAKES; f++) {
      icons[f][YPOS] += icons[f][DELTAY];
      // If snowflake is off the bottom of the screen...
      if (icons[f][YPOS] >= display.height()) {
        // Reinitialize to a random position, just off the top
        icons[f][XPOS]   = random(1 - LOGO_WIDTH, display.width());
        icons[f][YPOS]   = -LOGO_HEIGHT;
        icons[f][DELTAY] = random(1, 6);
      }
    }
  }
}

Wenn ich folgende Zeilen ausklammere, kann ich den Code ohne Fehler compilieren.
Zeile 24:
#include <Adafruit_TFTLCD.h> // Hardware-specific library

Zeile 135:
tft.setFont(&FreeSansOblique12pt7b.h); // Dieser Aufruf funktioniert nicht !

Grilli303:
... Adafruit ...

Uäh ... meiner Meinung nach ist zumindest das Software-Zeug von Adafruit Müll. Was man bei denen immer alles includieren und anstellen muss, damit es funktioniert ...

Ich habe mir meine kleine SSD3306-Bibliothek selbst gestrickt. Die kann vielleicht vieles nicht, was das Adafruit-Zeug kann, aber ein #include genügt und man kann die Manipulationen und Zusammenhänge von A bis Z überblicken.

Die Dateien meiner Bibliothek hängen an, ein minimal-Code gibt's in diesem Thread in Posting #7.

Gruß

Gregor

gSSD3306.h (9.52 KB)

gSSD3306.cpp (8.03 KB)

keywords.txt (224 Bytes)

Warum siehst du dir nicht die Libraries an, die du verwendest ?
Da sind die Schriftarten hinterlegt.

Ansonsten kannst du nicht tft.xxx verwenden, wenn zuvor display.xxx definiert wurde.

Und sieh dir einfach mal andere Beispiele der Library an.

Grilli303:
Zeile 24:
#include <Adafruit_TFTLCD.h> // Hardware-specific library

Ist überflüssig, bitte löschen.

Grilli303:
Zeile 135:
tft.setFont(&FreeSansOblique12pt7b.h); // Dieser Aufruf funktioniert nicht !

Das ist eine Referenz zum Objekt, nicht zur Datei:

display.setFont(&FreeSansOblique12pt7b);  // Dieser Aufruf funktioniert!
display.setCursor(0, 20);

Die Basislinie verschiebt sich gegenüber dem Standardfont!

Damit wird der Text zu groß:

display.setTextSize(2);

Der Font FreeSansOblique12pt7b enthält aber nur Definitionen bis 127.

Im Standardfont nach Codepage 437 findet sich das Gradzeichen bei 248.

Hallo Dieter

Ich habe mir die Libraries ja auch angeschaut und die Englishe Anleitung versucht zu verstehen.
Nur leider weiss ich nach wie vor wie vor nicht wo und wie ich die Schriftart definieren muss.
Auch habe ich keine entsprechenden Beispiele dazu im Netz gefunden.
Du darfst mir gerne ein Link mit einen Beispiel posten.
Ich habe den entsprechenden Part der Anleitung mal versucht auf Deutsch zu übersetzen:

In diesen .h-Dateien befinden sich mehrere Datenstrukturen, einschließlich einer Hauptschriftstruktur, die normalerweise denselben Namen wie die Schriftdatei hat (abzüglich der .h). Verwenden Sie die Funktion setFont (), um eine Schriftart für nachfolgende Grafikoperationen auszuwählen, und übergeben Sie die Adresse dieser Struktur, z.

Nachfolgende Aufrufe von tft.print () verwenden jetzt diese Schriftart. Die meisten anderen Attribute,
die zuvor mit der integrierten Schriftart (Farbe, Größe usw.) gearbeitet haben, funktionieren hier ähnlich. Um zur Standardschriftart mit fester Größe zurückzukehren, rufen Sie setFont () auf und übergeben Sie entweder NULL oder keine Argumente:

OK....also nochmal.

Du verwendest in deinem Sketch die Anweisungen zur Library:

display.clearDisplay();
display.drawPixel(10, 10, SSD1306_WHITE);

Usw.
Dann darfst du nicht plötzlich

tft.setFont(&FreeSansOblique12pt7b.h);   // Dieser Aufruf funktioniert nicht !

verwenden. Kein Wunder, dass es nicht funktioniert. Das hatte ich dir auch schon geschrieben.

Also musst du

display.setFont(&FreeSansOblique12pt7b);

verwenden.

Und hier kannst du jeden Font verwenden, den du in der Library "<Adafruit_GFX.h>" findest.
Keine Ahnung wo du da gesucht hast, jedenfalls nicht in der Library.

Und agmue hat dir das auch schon geschrieben. Du solltest dir mal angewöhnen, alle unsere Beiträge richtig zu lesen. Auch im Netz findest du Informationen dazu.

Also probier es aus und gib bitte eine Rückmeldung.

Edit:
Danke agmue,
Fehler beseitigt.

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