PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Arduino IDE findet Display-Treiber nicht



frabe
23.10.2024, 14:32
Hallo zusammen.

Bei aktuellem Fehler benötige ich eure Tipps.

Nach langer Abstinenz beschäftige ich wieder mit der Teensy(3.2)-Programmierung.
Derzeit baue ich einen Spg-Messer mit Verhältnis-, Strom-, Leistungs- und Stromrichtungsberechnungen.
Diese Werte sollen in einem Display VELLEMANN VMA438 (I2C) angezeigt werden.
Um dessen Treiber geht bei den Compiler-Fehler.

Meine Lösungsversuche:

ARDUINO IDE habe ich von V1.xx auf V2.3.3 erneuert.
Unter /Sketch/Bibilothek einbinden/ , habe ich "Adafruit SSD1306" gewählt.
Als ich das Display vor Ewigkeiten (unter IDE V1.xx) mit nachfolgendem Code programmierte, klappe die Ansteuerung problemlos.




#include <_Teensy.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <splash.h>
#include <Fonts/FreeSans9pt7b.h>
#include <Fonts/FreeSans12pt7b.h>
#include <Fonts/FreeSansBold9pt7b.h>
#include <Fonts/FreeSansBold12pt7b.h>
...
display.setFont(&FreeSans12pt7b); //Schriftart, Schriftgröße
...


Primäre Fehlermeldung bei "IDE/Überprüfen";

Compilation error: 'class Adafruit_SSD1306' has no member named 'setFont'

frabe
24.10.2024, 11:50
Nachsatz:
Ich verstehe nicht warum es in dieser Fehlermeldung geht?
Treiber nicht gefunden? Synthax-Fehler im Code? Zuweisungsproblem? Falsche Deklaration?

Rabenauge
24.10.2024, 23:44
Ich schätze einfach, die Lib unterstützt das nicht.
Macht bei den kleinen Oled's auch nicht allzuviel Sinn.
GGf. kann man ne andere Bibliothek benutzen, aber mal ehrlich: da nimmt man auch ein etwas höher auflösendes Display.

frabe
25.10.2024, 09:09
Moin "Rabenauge"
Diese Displays habe ich noch in der Schublade - vorerst muss ich Versuchsweise das nutzen was da ist...

Welche und woher bekomme ich eine passende/kompatible Lib?

Liegt die Inkompatibilität an der akt IDE 2.3.3 ?

Holomino
25.10.2024, 10:33
Liegt die Inkompatibilität an der akt IDE 2.3.3 ?
Aus der Ferne:
Die Bibliotheken sind ja alle über Git im Netz einsehbar und veröffentlicht. Soweit ich verstanden habe, erbt der Datentyp Adafruit_SSD1306 die setFont()-Funktion von Adafruit_GFX.

Leider hast Du just die Deklaration Deines "display"-Objektes aus dem obigen Quellcode herausgelöscht. Kann also sein, dass Du versehentlich das display als irgendwas völlig Anderes deklariert hast.
Kann aber auch sein, dass der Compiler uralte, mehrfach installierte Bibliotheken auf Deiner Platte findet. Da kannst Du mal über die Dateisuche nach "Adafruit_GFX.h" stöbern und in den Dateien verifizieren, dass sie auch wirklich alle das setFont() enthalten.

An der IDE kann es nur indirekt liegen, wenn sie dem Compiler beim Start falsche Pfade vorgibt. Aber da würde ich zuletzt suchen. Das wäre wahrscheinlich schon früher aufgefallen.

frabe
29.10.2024, 13:40
Hallo "Holomino"

Ich habe Anfang Okt´24 die alte IDE-Version gelöscht und die IDE V2.3.3 neu installiert. Somit sollte der integrierte Compiler "nagelneu" sein.

Habe die Platten mal nach "adafruit_gfx.h"" durchsucht - und 3 mal gefunden.
Alle innerhalb diverser Ordner der gelöschten Arduino-Version v1.8.5 - teils unterschiedliche Dateigrößen zw. 6-12kB
Keiner dieser "adafruit_gfx.h" beinhaltete "setfont"!

"Adafruit_SSD1306.h" ist 1 ,al vorhanden. Aber auch der beinhaltet kein "setfont".
Könnte hier der Generalfehler liegen?

Folgend die gesamte Deklaration und Einrichtung des Displays - fällt euch hier ein Fehler auf?


#include <_Teensy.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h> //Display-Ansteuerung
#include <splash.h>
#include <Fonts/FreeSans9pt7b.h> //Schriftarten, Sans, 9px hoch, normal
#include <Fonts/FreeSans12pt7b.h> //Schriftarten, Sans, 12px hoch, normal
#include <Fonts/FreeSansBold9pt7b.h> //Schriftarten, Sans, 9px hoch, fett
#include <Fonts/FreeSansBold12pt7b.h> //Schriftarten, Sans, 12px hoch, fett

#define OLED_RESET -1 //Display; Reset pin # (or -1, da kein Reset-Pin am Display)
#define SCREEN_WIDTH 128 //Display; OLED display Breite, in pixels
#define SCREEN_HEIGHT 64 //Display; OLED display Höhe, in pixels

const int ADC_Aufloesung = 8192; //Auflösungsstufen bei ADC=13bit (2^13bit) = 0,61mV
...

//Display initianlisieren
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); //Display, VELLEMAN VMA438

Holomino
29.10.2024, 15:17
Stronk!
Du könntest versuchen, die Libs direkt aus den Git-Repositories zu ziehen:
https://github.com/adafruit/Adafruit-GFX-Library
und
https://github.com/adafruit/Adafruit_SSD1306

Da ist jeweils ziemlich weit oben eine mit "<>Code" beschriftete knallgrüne Schaltfläche, wo Du nach dem Draufklicken "Download ZIP" wählen kannst. In diesen Quellen jedenfalls ist das setFont() auch deklariert.
In Arduino installiert bekommst Du den Kram dann über Sketch->Bibliothek einbinden->ZIP Bibliothek hinzufügen.
(Zumindest bei meiner alten Arduino-Version läuft das so)

Wenn das nicht funzt oder immer noch nichts bringt:
Im Git steht auch drin, wann der/ die Entwickler das letzte mal dran herumgefummelt haben.
Da steht bei der GFX zumindest was von vor drei Wochen und damit bestehen also gute Chancen, dass das Projekt noch aktiv ist und man bei (ganz liebevoll geschilderten) Fragen oder Problemen nicht nur Antworten bekommt, sondern auch ein bisschen über die Gründe hört. Unter "issues" kannst Du fragen und vorher auch schauen, ob es zu Deinem Problem nicht sogar schon eine Äußerung gibt.

Aber sei lieb zu diesen Menschen. Das ist Open Source und viele machen das freiwillig.

frabe
29.10.2024, 15:28
DAAAAAANKE :-)
Dein Hinweis war Gold wert - ich hatte endlich einen "Anpack" - habe alle adafruit_gxf.h und adafruit_ssd1306.h gelöscht und über IDE/Bibliotheksveraltung neu installiert.
Diese Fehlermeldung ist weg!

Jetzt habe ich eine Andere - wahrscheinlich ein Syntaxfehler;

Fehlermeldung;


Compilation error: no matching function for call to 'Adafruit_SSD1306::println(const char [14], int&, int, const char [3])'


Beispielcode,
wobei die "2" die Nachkommastellen begrenzen soll. Steckt hier der Fehler?
Solldarstellung im Display, Bsp: "Spannung MW2: 3,36 V"


int Vmw1 = 0;
...
display.println("Spannung MW2:", Vmw1, 2, " V");

Holomino
29.10.2024, 16:39
Ok, die Fehlermeldung besagt, dass es in dem display-Objekt keine zu den übergebenen Parametern passende println-Funktion gibt. (In C++ nennt sich das Funktionsüberladung, wenn mehrere gleichnamige Funktionen mit unterschiedlichen Parametern angeboten werden)

Offensichtlich erbt der Typ "Adafruit_GFX" über "print.h" das println vom irgendwo im Arduino-Core verborgenen "Print"-Typ.

Das Miese: Den "Print"-Datentyp finde ich zwar als Git, aber ohne Kommentare und die Parameternamen sagen mir auch nix.
Das Gute: Wenn's im Core liegt, gibt's üblicherweise auch eine Hilfe als Referenz (suchmaschinere mal nach "Arduino Print").
Das Miese: Irgendwas hat zur Zeit die Referenz zerschossen, zumindest bei mir.
Das Gute: Es gibt noch ein Serial.Println() in der Referenz. Das sieht ganz ähnlich aus.

Da müsstest Du sehen, was mit dem println() geht und was Du davon brauchen kannst.

frabe
30.10.2024, 09:30
Moin und Danke.

Auch ich habe ähnliche Nicht-Infos über println() gefunden.
Vielleicht ist es auch der falsche Weg, die variable "Vmw1" erst innerhalb der Display-Anzeige zu kürzen.
Ich werde mich heute einmal über Nachkommastellen einlesen.

frabe
30.10.2024, 14:07
Ja, das wars! Programm läuft jetzt.

statt:


...
display.println("Spannung MW1: ", Vmw1, 2, " V");
...


folgenden Syntax:


...
String Anz_Vmw1 = "Spannung MW1: " + String(Vmw1, 2) + " V";
display.println(Anz_Vmw2);
...


Hintergrund:
println() (aus der Bibliothek adafruit_1306.h) kann nur 1 Parameter übergeben.

frabe
06.11.2024, 10:27
=Rabenauge;670827...
Macht bei den kleinen Oled's auch nicht allzuviel Sinn.
GGf. kann man ne andere Bibliothek benutzen, aber mal ehrlich: da nimmt man auch ein etwas höher auflösendes Display.

@Rabenauge, merke ich jetzt auch...
Nachdem alles läuft, ist bei Texten das Darstellungslimit sehr schnell erschöpft. Nach 3 Zeilen hört der Sinn auf.

Welche Standardgrößen mit I2C sind empfehlenswert (und kostengünstig)?
128x128px (https://www.amazon.de/DollaTek-OLED-Anzeigemodul-Seriell-128x128-OLED-LCD-Anzeigemodul/dp/B07QFVBMMB),
oder 128x160px (https://www.amazon.de/AZDelivery-TFT-Display-128x160-Pixeln-Arduino/dp/B07FYCKYP1/ref=vse_cards_3?_encoding=UTF8&pd_rd_w=Pnz0t&content-id=amzn1.sym.051b5cb0-d038-435f-a828-1e0d87fc61bd&pf_rd_p=051b5cb0-d038-435f-a828-1e0d87fc61bd&pf_rd_r=DHEDAJ13DHBTEGG2REKX&pd_rd_wg=n4DOb&pd_rd_r=ced9fb21-32b2-4e6c-b897-4ea934520aeb&th=1) ?

Mir geht es primär um die Darstellung mehrerer Messwerte, zzgl. Ein-Wort-Beschreibung dieser MW.

Rabenauge
09.11.2024, 08:03
Bei I2C-isplays wird die Auswahl recht schnell eng.
Diese kleinen Oled's gibts noch in minimal grösser, aber ich glaub, die haben dann die doppelte Auflösung.
Allerdings brauchen die dann auch sehr viel mehr Speicher...
Warum nicht ein SPI- Display?
Da fängts bei den kleinen 1.8"-Dingern an, die kriegt man auch fürn Appel und'n Ei.
Das kann schon 128x160.
Das wäre dann nach oben offen, die gibts in grösser dann auch noch mit Touch-Funktion.
Allerdings dann alles SPI.

Ansonsten hab ich auch mal mit nem grafikfähigen LCD-Display was gemacht, das ist zwar mechanisch wesentlich grösser, kann aber auch nur 128x64, und ich bin nicht sicher, ob das mit i2C läuft.

oberallgeier
10.11.2024, 11:47
.. Welche Standardgrößen mit I2C sind empfehlenswert (und kostengünstig) .. primär .. Darstellung .. Messwerte, .. Ein-Wort-Beschreibung ..
Displays, 0.96 "Zoll oled -128x64, gibts für n Appel und n Ei beim Chinesen (https://de.aliexpress.com/item/1005007104575524.html?spm=a2g0o.productlist.main.1 7.99201d7fOwleks&algo_pvid=c88dec90-a071-4d6e-9ce3-7349f30d4131&algo_exp_id=c88dec90-a071-4d6e-9ce3-7349f30d4131-8&pdp_npi=4%40dis%21EUR%213.76%210.99%21%21%2128.30% 217.44%21%40211b876717312301869252198e1953%2112000 039417151942%21sea%21DE%210%21ABX&curPageLogUid=vUHzMjKvsQ99&utparam-url=scene%3Asearch%7Cquery_from%3A) (1 bis 2 €). Darauf ist die Darstellung von alfanumerischen Zeichen mit im internet verfügbaren Bibliotheken p.p.einfach - z.B. im Format ca. 2,5 mm, 4 Zeilen à 10 Zeichen. Ich habe so etwas bei einigen Experimenten - siehe Bilder von (m)einer Bastelplatine mit nano328.

Beispiele :
Anordnung (https://www.dropbox.com/scl/fi/sb592mhne4vkc30n1pktd/20241109_img_104451.JPG?rlkey=0o63isazjjpdu7kudqxl q59kd&st=uv5o2exz&dl=1) <<>> Normal Double (https://www.dropbox.com/scl/fi/xh5yni64593p2u5va42si/20241109_img_104610.JPG?rlkey=c6by5k35ga7d7xnrw1y8 6129p&st=q3a5foog&dl=1) <<>> weiß auf schwarz (https://www.dropbox.com/scl/fi/ynjv3qs02dwhzmavnr9hz/20241109_img_104645.JPG?rlkey=iq3fitpd2pnwnm9uel02 7aek5&st=1pzwmbha&dl=1) <<>> schwarz auf weiß (https://www.dropbox.com/scl/fi/4xmuvdrpmxgfnurtczt67/20241109_img_104656.JPG?rlkey=z01yowrcz1fx128oldr0 pgy2e&st=4i6l59ea&dl=1)

frabe
12.11.2024, 11:55
Hallo!
@oberallgeier, wie hast du dieses kleine Schriftart aus dein Bsp: "Anordnung" hin bekommen?
Als kleinster Schriftart nutze ich Fonts/FreeSans9pt7b.h aus Adafruit_GFX.h - hierbei schaffe ich gerade mal 4 Zeilen á 12Zeichen.

@Rabenauge, Danke für den Wegweisen zur SPI-Schnittstellen. Scheint etwas aufwendiger, aber zukunftsorientiert und flexibler.

oberallgeier
12.11.2024, 13:22
.. wie hast du dieses kleine Schriftart aus dein Bsp: "Anordnung" hin bekommen ..Falsch gefragt. Richtige Frage: Wo .. hergenommen *gg*. Antwort: von hier (https://github.com/Sylaina/oled-display).


.. schaffe ich gerade mal 4 Zeilen á 12Zeichen ..Hmmm - is ja schon was. Ich bekomme in der grösseren Schrift nur zehn Zeichen aufs Display (siehe meine Beispiele).

Viel Erfolg

frabe
12.11.2024, 15:27
Bei mir siehts derzeit folgend aus
36025
Werde deinen Tipp lcd.h ausprobieren.

oberallgeier
12.11.2024, 16:07
Bei mir siehts derzeit folgend aus ..Das sieht (nach meinem Geschmack) doch gut aus; die Linien geben ja dem Ganzen ne Ordnung. Fragt sich ob die anderen Zeichen (für Dich) besser lesbar sind.

frabe
13.11.2024, 14:24
Das sieht (nach meinem Geschmack) doch gut aus; die Linien geben ja dem Ganzen ne Ordnung. Fragt sich ob die anderen Zeichen (für Dich) besser lesbar sind.

Schon Schön - aber zu wenig Zeichen. Mein Wunsch, min.6Zeilen, á20Zeichen.
Ich würde gerne statt Zahlen, Klartexte eintragen, Bsp. "Messerwert1= " etc. Dafür muss die Schrift wesentlich kleiner (die Hälfte) sein.



Antwort: von hier (https://github.com/Sylaina/oled-display).

Wie kann ich lcd.h manuell installieren?
Den Bsp-code versethe ich nicht. Kannst du mir DEIN Bsp. als code bitte zur Verfügung stellen?

Hier habe ich noch eine Schöne Schrift (https://oleddisplay.squix.ch/#/home) gefunden.
OLED, DejaVu Sans Light, Pain, 8, Adafruit GFX Font
Diese Schriftart finde ich super schön. Wie code´et man hier? Eine Librarie mit ".h" finde ich nicht. Ist das eher ein Thema für Fortgeschrittenen?

oberallgeier
14.11.2024, 12:05
Schon Schön - aber zu wenig Zeichen. Mein Wunsch, min.6Zeilen, á20Zeichen.
Ich würde gerne statt Zahlen, Klartexte eintragen, Bsp. "Messerwert1= " etc. Dafür muss die Schrift wesentlich kleiner (die Hälfte) sein..Na ja, das Display besteht im Prinzig aus einer BEGRENZTEN Anzahl von Pixeln. Viele der einfachen Schriften sind dann in 5x8-Pixeln dargestellt. Ich hatte das mal in C so programmiert (siehe Doppelpfeil schräg - mit Anmerkungen)


/* >>
Stand .......\C5_Ronny-5_etc\R5M30\R5M3kalij.c
================================================== ============================= =
...
*** Versionsgeschichte:
==================
x23 19Sep22 1640 Aktualisierung File-Nummer
...
================================================== ============================== =
*** Aufgabenstellung : Software für RJjr / Ronny5
Original: ..\C5_Ronny-5_etc\R5M_x01\R5M_kal80.c x80 14Apr19 1706 Gute V...
================================================== ============================= */
...
...
// ================================================== ============================ =
// Generierung von LCD-Sonderzeichen für DEM162xx, Satz 4 = RETURN
// ================================================== ============================ =
void LCD_SZ4(void) // LCD-Sonderzeichen, NUR RETURN à la pololu
{ //
// - - - - - - - - - - - - - - - -
...
// - - - - - - - - - - - - - - - -
// Pfeil auf
uint8_t LCD_c_1[8] = { // LCD-Character 1
0b00000000, // -----
0b00000000, // -----
0b00000100, // --X--
0b00001110, // -XXX-
0b00010101, // X-X-X
0b00000100, // --X--
0b00000100, // --X--
0b00000000 // -----
};
lcd_generatechar(LCD_GC_CHAR1, LCD_c_1);
// - - - - - - - - - - - - - - - -
...
// - - - - - - - - - - - - - - - -
// Doppelpfeil schräg linksunten<=>rechtsoben
uint8_t LCD_c_4[8] = { // LCD-Character 4 => Pfeil-lu-ro
0b00000000, // ----- Zeile oben, Spalte (7)4..0
0b00000111, // --XXX
0b00000011, // ---XX
0b00010101, // X-X-X
0b00011000, // XX---
0b00011100, // XXX--
0b00000000, // -----
0b00000000 // -----
}; //
lcd_generatechar(LCD_GC_CHAR4, LCD_c_4);
// Anmerkung für RN-frabe 14Nov24-10h22: <<<<<<<<!!!!!!!! <<<<<<<<!!!!!!!!
// Definition der Zeichen oben für 8x5 Pixel, daher sind die Pixel
// Nr 7, 6 u 5 der obigen Binärzahlen immer "0" (eigentlich egal)
// - - - - - - - - - - - - - - - -
// linke Hälfte Copyright ©
uint8_t LCD_c_5[8] = { // LCD-Character 5 => © linke Hälfte
0b00000011, // ---XX
0b00000100, // --X--
0b00001001, // -X--X
0b00001010, // -X-X-
0b00001010, // -X-X-
0b00001001, // -X--X
0b00000100, // --X--
0b00000011 // ---XX
};
lcd_generatechar(LCD_GC_CHAR5, LCD_c_5);

// - - - - - - - - - - - - - - - -
// Rechte Hälfte Copyright ©
uint8_t LCD_c_6[8] = { // LCD-Character 6 => © rechte Hälfte
0b00011000, // XX---
0b00000100, // --X--
0b00010010, // X--X-
0b00000010, // ---X-
0b00000010, // ---X-
0b00010010, // X--X-
0b00000100, // --X--
0b00011000 // XX---
};
lcd_generatechar(LCD_GC_CHAR6, LCD_c_6);

return; //
} // Ende void LCD_SZ4(void)
// === Ende
// ================================================== ============================ =


// ================================================== ============================ =
// ===== ENDE Subroutinen
// ================================================== ============================ =

Natürlich muss nun zwischen den einzelnen Zeichen ein oder zwei Pixel frei bleiben, ebenso zwischen den Zeilen. Daher ist eine VOLLE Ausnützung der Fläche an das Vielfache EINER Buchstabendefinition plus den Zwischenräumen gebunden. Und, soweit ich es beurteilen kann, ist die hier diskutierte klein(st)e Schriftgrösse eben das (untere*gg*) Ende der Fahnenstange. Natürlich kann man da variieren und evtl. nen kleinen TEil der Fläche unbeschreibbar machen - wenn das Vielfache EINES Zeichens eben nicht mehr vollständig reinginge.


.. Wie kann ich lcd.h manuell installieren? Den Bsp-code versethe ich nicht. Kannst du mir DEIN Bsp. als code bitte zur Verfügung stellen? ..Mal ein Auszug der Anwendung des obigen Codes (und ein bisschen Notizen aus meinem "Labor"Handbuch zum Roboterbasteln)


4. Mai 2019 C4\arduino-cube mit oled (aco) Die Software für das oled SSD1306 läuft sehr gut mit einem C-Code-Progamm.
Quellen siehe unten, 27.April. Die Darstellung am oled geht in der schwierig lesbaren Normalgröße und in der – immer noch
brillenpflichtigen – Doppelgröße ziemlich gut.
D:\D_pro-fils\compu_MC\C4\aco4\aco4_x21.c


27. April 2019 C4\arduino-cube mit oled (aco)
Wartezeit auf Kleinteile zum arduino-cube von Andree-HB. Es wird das Programm von Michael Köhler, siehe
https://www.mikrocontroller.net/topic/415651#new
aus github übernommen, siehe
https://github.com/Sylaina/oled-display
und leicht modifiziert.


// ================================================== =========================== =
// == LCDausgabe, Folge 1
// ================================================== =========================== =
void lcd_01 (void) // LCDausgabe "1"
{ //
LCD_SZ4 (); // Eigen Sonderzeichen, Satz 4 mit © kal
lcd_clear(); // Vor LCD-Ausgabe Display leeren lcd
lcd_string( Revdat_lcd ); // #define/info01/main "R5M30 Archie xxx"
Line2(); // An den Anfang der 2. Zeile springen
lcd_data( 5 ); lcd_data( 6 ); // Hier NUR "©" - in zwei Hälften
lcd_string( Revdat_lc2 ); // #define/info01/main " JWT2020 xxxxx"
waitms ( 500); //
Line2(); // An den Anfang der 2. Zeile springen
lcd_string(" "); // Zeile löschen

// Selbst definierte Zeichen ausgeben, Hier Zappelphilip
// =: SetCursor (2, 10) heisst SetCursor (x,y), x=zeile {1,2}, y=Pos {0, 15}
LCD_SZ1 (); // Eigene Sonderzeichen generieren, Satz 1 kal
u8 llptr = 1; // Pointer auf Zeichen
s8 llinc = 1;
for ( u8 ll=1; ll<16; ll++ ) // Zappelphilip-Testloop
{ //
SetCursor (2, 10);
if ( llptr < 8 ) lcd_data ( llptr );
if ( llptr == 8 ) lcd_data ( 255 );
if ( llptr == 8 ) waitms ( 300);
llptr = llptr + llinc;
if ( llptr == 8 ) llinc = -1;
if ( llptr == 1 ) llinc = 1;
waitms ( 50);
}

Ich weiß aber jetzt nicht, ob Dich das weiter bringt.