Font mit Dateiendung "c" in Adafruit GFX einbinden

Hallo,

ich habe mal wieder ein Problem :

In der orginalen Bibliothek sind bereits Fonts vordefiniert - mit der Dateiendung "h"
Gern hätte ich weitere Fonts eingebunden - diese sind im Web frei verfügbar aber mit der
Dateiendung "c"
Wenn ich diese identisch einbinde (include, setFont) bekomme ich eine Fehlermeldung.
Mit den vorhanden orginalen Fonts mit "h" geht das ohne Probleme.

Müssen die Fonts mit "c" erst nach "h" konvertiert werden ?
Gibt es dafür ein Programm - oder habt Ihr noch eine andere Lösung ?

Dank für Eure Antworten.

viele Grüße

Maik

Ändere doch einfach mal c in h und warte ab, ob und welche Fehler der Compiler dann meldet.

maik_s:
Wenn ich diese identisch einbinde (include, setFont) bekomme ich eine Fehlermeldung.
Mit den vorhanden orginalen Fonts mit "h" geht das ohne Probleme.

3 Punkte:

Es gibt sicher mehr Fehlermeldungen als "eine Fehlermeldung" - daher - wie lautet die Fehlermeldung genau?
Wie bindest du diese Datei genau ein? include, setFont ist kein Include der kompilieren würde.
Lade eine Beispiel-Datei hier hoch, die du includen willst und mache einen Link - woher du diese Datei hast.

Danke für die Antworten.

Hier ein teil des Codes:

#include <Adafruit_GFX.h> 
#include <Adafruit_TFTLCD.h> 
#include <SevenSegNumFont.c> 

void setup() 
{

 tft.setFont(&SevenSegNumFont);
 tft.setTextSize(2);
 tft.setTextColor(WHITE);
 tft.setCursor(200, 120);
 tft.print(value1);

}

Das ist nur ein Ausschnitt des Programmes.
Im Anhang der entsprechende Font.

Als Fehlermeldung wird

“fatal error: SevenSegNumFont.c: No such file or directory”

ausgegeben.
Ich habe es aber im Stammverzeichniss der GFX Library kopiert (siehe Screenshot)

Eine Änderung / Umbennung auf SevenSegNumFont.h erzeugte die gleiche Fehlermeldung

(fatal error: SevenSegNumFont.h: No such file or directory)

Diese ist aber auch im Stammverzeichnis vorhanden / entsprechend umbenannt worden.

Meine Frage : muss noch eine Änderung an Adafruit_GFX.cpp / oder Adafruit_GFX.h vorgenommen werden - oder gibt es dafür eine einfache Lösung ?

Danke für Eure Hilfe -

Gruß

Maik

font.jpg

SevenSegNumFont.c (10.3 KB)

Benutze die andere Syntax #include "..." für Header Dateien im Projektverzeichnis.

Ich habe es mal so gemacht wie oben erleutert :

#include "SevenSegNumFont.c" ;   // liegt im Projektverzeichnis

dazu noch : 

void setup() {

setFont(&SevenSegNumFont); 

usw.

}

Font wird zwar gefunden und eingebunden aber wieder mit Fehlermeldung :

In function 'void setup()':

error: 'SevenSegNumFont' was not declared in this scope

tft.setFont(&SevenSegNumFont);

Bin wieder ratlos - muss noch was beachtet werden ?

Noch einmal herzlichen Dank.

Gib uns doch mal einen Link auf so eine Font.c-Datei und eine originale Font.h-Datei.
Dann sollte sich eine Lösung finden lassen.

Gruß Tommy

Nochmals Danke !

eine beliebige orginale " h" Datei aus der GFX Library (Adafruit_GFX) anbei

und von :

http://www.rinkydinkelectronics.com/r_fonts.php

die Fontdatei mit “c” am Ende ist auch anbei.

Habt Ihr noch eine Idee ?
Auf der Seite sind von rinkydinkelectronics sind bereits viele Fonts frei verfügbar.
Wäre schade wenn die nicht genutzt werden könnten.
Hilft vieleich nicht nur mir - daher nochmals vielen Dank.

SevenSegNumFont.c (10.3 KB)

FreeMono18pt7b.h (23.9 KB)

Hallo,
ich habe selbst die GFX Library mal genutzt.
Einen anderen Fond als die mitgelieferten zu verwenden kannst Du vergessen.
Es gibt zwar Converter, aber die können kein "GFX Library Transparent"
Vergesse es einfach.
Gruß und Spaß
Andreas

Nach dem ersten Satz auf der Seite würde ich sagen die Fonts sind nur für die UTFT Library.

Gruß Thorsten

SkobyMobil:
Einen anderen Fond als die mitgelieferten zu verwenden kannst Du vergessen.
...
Vergesse es einfach.

Warum denn so negativ?

Der Inhalt von SevenSegNumFont.c entspricht schon einer Bitsammlung, die auch für die GFX-Bibliothek zu verwenden ist. Es fehlt nur die Glyphen- zusammen mit der Fontdefinition, damit auch proportionale Fonts verwendet werden können.

Der SevenSegNumFont hat nur zehn Zahlen gleicher Breite, weshalb sich die Glyphendefinition recht einfach gestaltet.

SevenSegNumFont.png

Bei "zeitaufwändig" würde ich Dir sofort zustimmen :slight_smile:

SevenSegNumFont.png

Danke noch einmal an alle beteiligten !

Ich gebe an der Stelle auf - mir die fehlt einfach die Intelligenz für das
“umprogrammieren” anderen Fonts auf das GFX Format.
Mittlerweile habe ich ein Onlienetool gefunden, welches ttf Schriften in die GFX Fonts konvertiert.
die Schrifthöhe kann frei gewählt werden und die Fonts sind direkt importierbar.
Freie ttf Schriften gibt es im Web mehr als genug.
Auf dieser Weise habe ich dann auch ein Siebensegment Font für meine Anwendung erstellen
können.

Noch eine Frage an die Profis :

gibt es für die Arduinos auch eine Bibliothek die Framebuffer bei TFT ( 3,5") ünterstützt ?
Die GFX von Adafriut kann das nicht.
Ich habe auch noch mit einen Flackern bei der Aktualisierung der Werte auf das Display zu kämpfen.
Es soll eine einfache Anzeige der Strom / Spannung / Leistung für älteres Labornetzteil werden, wo das
Anzeigemodul ausgefallen ist.
Herzstück ist ein INA 219 und ein Arduino plus 3,5" TFT Display.
Alles war noch in der “Bastelkiste” vorhanden und ich wollte es gern dafür verwenden.

Hier der Code zur ersten Info (rudimentär und noch nicht “schön” und abgeschlossen).

#include <Wire.h>
#include <INA219.h> // by GitHub
#include <Adafruit_GFX.h>    // Core graphics library
#include <MCUFRIEND_kbv.h>   // Hardware-specific library
MCUFRIEND_kbv tft;

#include <Fonts/FreeSans30pt7b.h>

//color definitions

#define BLACK       0x0000      /*   0,   0,   0 */
#define NAVY        0x000F      /*   0,   0, 128 */
#define DARKGREEN   0x03E0      /*   0, 128,   0 */
#define DARKCYAN    0x03EF      /*   0, 128, 128 */
#define MAROON      0x7800      /* 128,   0,   0 */
#define PURPLE      0x780F      /* 128,   0, 128 */
#define OLIVE       0x7BE0      /* 128, 128,   0 */
#define LIGHTGREY   0xC618      /* 192, 192, 192 */
#define DARKGREY    0x7BEF      /* 128, 128, 128 */
#define BLUE        0x001F      /*   0,   0, 255 */
#define GREEN       0x07E0      /*   0, 255,   0 */
#define CYAN        0x07FF      /*   0, 255, 255 */
#define RED         0xF800      /* 255,   0,   0 */
#define MAGENTA     0xF81F      /* 255,   0, 255 */
#define YELLOW      0xFFE0      /* 255, 255,   0 */
#define WHITE       0xFFFF      /* 255, 255, 255 */
#define ORANGE      0xFDA0      /* 255, 180,   0 */
#define GREENYELLOW 0xB7E0      /* 180, 255,   0 */
#define PINK        0xFC9F
#define GREY        0x8410

INA219 ina;

float old_value1,old_value2,old_value3;

void setup() {
  // Serial.begin(115200);
  
   // Default INA219 address is 0x40
  ina.begin();

  old_value1 = ina.readBusVoltage();   // Update old_value only if it is changed
  old_value2 = ina.readShuntCurrent();   // Update old_value only if it is changed
  old_value3 = ina.readBusPower();   // Update old_value only if it is changed


  // Configure INA219

  ina.configure(INA219_RANGE_32V, INA219_GAIN_320MV, INA219_BUS_RES_10BIT,      INA219_SHUNT_RES_10BIT_1S);

  // Calibrate INA219. Rshunt = 0.1 ohm, Max excepted current = 2A

  ina.calibrate(0.104, 2); //  adjust

 
  uint16_t ID = tft.readID();
  if (ID == 0xD3) ID = 0x9481;

  tft.begin(ID);
  tft.setRotation(1);

  tft.fillScreen(BLACK);
  tft.setTextColor(GREENYELLOW);
  tft.setFont(&FreeSans30pt7b);
   
  tft.setTextSize(1);
    
   tft.setCursor(230, 120);
   tft.print(" W ");
   
   tft.setCursor(230, 200);
   tft.print(" A ");

   tft.setCursor(230, 280);
   tft.print(" V ");
}

void loop()
{
  
   ina.readBusVoltage();
   ina.readShuntCurrent();
   ina.readBusPower();
   
  if (ina.readBusVoltage() != old_value1)
  
 {  
   tft.fillRect(30,145, 225, 60,BLACK); 
   tft.setCursor(30 ,280);
   tft.print(ina.readBusVoltage(),2);
   
} 

     
if (ina.readShuntCurrent() != old_value2) 
{  
    
    tft.fillRect(30,145, 210, 60,BLACK);
    tft.setCursor(30, 200);
    tft.print(ina.readShuntCurrent(),2); 
    
}

 if(ina.readBusPower() != old_value3) 
   
    tft.fillRect(30,65, 210, 60,BLACK);
    tft.setCursor(30,120);
    tft.print(ina.readBusPower(),2);   
}

}

So fürs Erste “läuft” das erst einmal - aber die Ausgabe auf dem Display ist noch nicht optimal.
Die “Geisterschrift” habe ich durch Unterlegen eines schwarzen Rechtecks unterdrücken können.
Das geht so weit - aber das Flackern ist doch etwas nervig zumal bei nicht stabiler Eingangsgröße
die Anzeige auch entsprechend aktualisiert wird bzw. dann auch flackert.
Die Ausgabe auf das Display habe ich schon auf zwei Nachkommastellen begrenzt - bringt aber nichts.
Anscheinend wird “intern” mit noch mehr Nachkommastellen gerechnet (mehr als die Zwei bis Drei für das Dispaly) und das erklärt auch das Flackern der Anzeige obwohl die angezeigte Werte auf dem Display stabil sind.

Kann ich auch Variablen : old_value1 - old_value3 auf max. 2 oder 3 Nachkommastellen begrenzen ?
Wenn ja wie ?

Noch eine Idee ?

Nochmals vielen Dank und viele Grüße !

maik_s:
Kann ich auch Variablen : old_value1 - old_value3 auf max. 2 oder 3 Nachkommastellen begrenzen ?
Wenn ja wie ?

Wähle als Typ uint16_t und multipliziere mit 100.

uint16_t old_value1,old_value2,old_value3;
...
  if ((int) ina.readBusVoltage() * 100 != old_value1)

maik_s:
gibt es für die Arduinos auch eine Bibliothek die Framebuffer bei TFT ( 3,5") ünterstützt ?

Von wegen Profis, ich mache das nur als Hobby.

Schaue mal, ob die Bibliothek von Oli Kraus das für Deine Hardware anbietet.

Hi

maik_s:
...
Mittlerweile habe ich ein Onlienetool gefunden, welches ttf Schriften in die GFX Fonts konvertiert.
...

Damit zukünftige Schriftsetzer Deinen Leidensweg nicht ebenfalls durchlaufen müssen - wie wäre es mit einem Link dahin?

MfG

Hier der Link - hat mir viel Arbeit erspart.
Anscheinend nur für die o.g. GFX Library geeignet.

https://rop.nl/truetype2gfx/

Hi

Besten Dank - hab's Mal in die Lesezeichen gepackt ... da tummelt sich noch mehr so Zeugs ... für 'später' :slight_smile:

MfG