Problema libreria per display I2C

Ciao a tutti,

vi scrivo per un errore che non riesco a risolvere: per utilizzare un display OLED con interfaccia I2C, sto usando questa libreria.
Già durante il primo smanettamento, sono apparsi alcuni errori di compilazione che non riesco a capire da dove provengano… questo è il codice incriminato:

#include <oled.h>

//class constructor declaration
OLED Display = OLED(4,     // sda pin for I2C communication
                    5,     // scl pin for I2C communication   
                    128,   // Pixel width
                    64,    // Pixel Height
                    false  // Display type: true for SSD1306, false for SH1106 (default: false)  
);


void setup() {
  display.begin();
}

void loop() {
  display.draw_string(0, 0, "Hello world");
}

che produce i seguenti errori di compilazione:

Arduino:1.8.13 (Mac OS X), Scheda:"Arduino Uno"

In file included from /Users//Desktop/smart_bottle_V2//.ino:1:0:
/Users//Documents/Arduino/libraries/OLED_SSD1306___SH1106-1.0.0/src/oled.h:306:18: error: no members matching 'Print::printf' in 'class Print'
     using Print::printf;
                  ^~~~~~
/Users//Desktop/smart_bottle_V2//.ino: In function 'void setup()'::13:3: error: 'display' was not declared in this scope
   display.begin();
   ^~~~~~~
/Users///.ino:13:3: note: suggested alternative: 'Display'
   display.begin();
   ^~~~~~~
   Display
/Users/gregorio: In function 'void loop()':
provaprova1:17:3: error: 'display' was not declared in this scope
   display.draw_string(0, 0, "Hello world");
   ^~~~~~~
/Users/gregorio: note: suggested alternative: 'Display'
   display.draw_string(0, 0, "Hello world");
   ^~~~~~~
   Display
exit status 1
'display' was not declared in this scope

Per cercare di risolvere ho scritto il “Display.begin” ed il “Display.draw_string” con la “D” iniziale maiuscola, e così facendo l’errore è mutato in:

Arduino/libraries/OLED_SSD1306___SH1106-1.0.0/src/oled.h:306:18: error: no members matching 'Print::printf' in 'class Print'
     using Print::printf;
                  ^~~~~~
exit status 1
Errore durante la compilazione per la scheda Arduino Uno.

Che devo fa?!

greg_bocca: Che devo fa?!

... devi porre più attenzione!

Dichiari:

OLED Display = OLED(4,     // sda pin for I2C comunication
...

mentre poi usi:

display.begin();
...

In 'C' le maiuscole e le minuscole sono due cose differenti !

Guglielmo

Infatti poi, aggiustato il problema delle maiuscole, ricevo comunque il messaggio di errore:

Arduino/libraries/OLED_SSD1306___SH1106-1.0.0/src/oled.h:306:18: error: no members matching 'Print::printf' in 'class Print'
     using Print::printf;
                  ^~~~~~
exit status 1
Errore durante la compilazione per la scheda Arduino Uno.

Quella libreria non è per Arduino ma per NodeMCU (esp8266). Le librerie base di Arduino (Uno, Nano, Mega, etc. ovvero atmega328p/atmega2560) non hanno la printf nella classe Print. Invece le librerie base del core di Esp8266 e Esp32 hanno la printf. Se vedi la riga che da errore, chiede di usare (using) la funzione printf della classe base Print che su Arduino core degli atmega (avr) non c'e'

Arggggg, queste librerie mi stanno facendo impazzire... quindi cosa posso usare?

Adafruit ha la sua libreria per gli SSD1306
Se guardi nelle librerie disponibili da IDE (gestione librerie) ne trovi diverse.

Non trovo nulla per SH1106, e comunque guardando la pagina di GitHub di quella libreria, sembra pensata proprio per Arduino... com'è possibile che non sia compatibile? Ho anche provato ad utilizzare la classica u8glib, che occupa poca memoria(a differenza della u8g2) e sembra funzionare, ma scrivendo un codice senza errori e caricandolo su arduino, il display si blocca senza un apparente motivo!

Devi cercare SSD1306 (sperando sia compatibile al 100%) Oppure io su internet ho visto questa (non l'ho provata): https://github.com/wonho-maker/Adafruit_SH1106 Trovato tramite: https://www.danielealberti.it/2020/04/arduino-e-ssh1106-display-oled-13.html

greg_bocca: Non trovo nulla per SH1106, e comunque guardando la pagina di GitHub di quella libreria, sembra pensata proprio per Arduino... com'è possibile che non sia compatibile?

Nella pagina ad un certo punto parla di NodeMcu "That's for OLED display mounted directly on NodeMCU WiFi_KIT_8 model from Heltec"

E nelle issues di quella lib c'e' già segnalato che non funziona con avr: https://github.com/durydevelop/arduino-lib-oled/issues/9

nid69ita: Quella libreria non è per Arduino ma per NodeMCU (esp8266).

Scusa Nid, ma proprio Arduino la segnala per TUTTE le piattaforme ... QUI ...

This library is compatible with all architectures so you should be able to use it on all the Arduino boards.

... cosa è allora successo? Non è che c'è qualche paramentro da settare?

Guglielmo

nid69ita: Devi cercare SSD1306 (sperando sia compatibile al 100%)

Allora, SE e ribadisco SE quel display e quel controller è compatibile con il SSD1306 allota la migliore libreria, più compatta e più efficiente è quella di Rinky-Dink Electronics che si trova QUI, però ribadisco, occorre vedere se il SH1106 è veramente compatibile con il SSD1306 ... cosa di cui però non sono sicuro ... ::)

Guglielmo

gpb01: ... cosa è allora successo? Non è che c'è qualche paramentro da settare?

Mi autoquoto ... :D

Mi sa tanto che l'autore, per voler strafare, espandendola e modificandola ... l'ha resa incompatibile con Arduino ... ::)

Mah ...

Guglielmo

Mannaggia all’autore :sob:
I chip SH1106 ed SSD1306 purtroppo NON sono intercambiabili, e questa libreria infatti non funziona.
In ogni caso, la classica u8glib per OLED I2C(che supporta qualsiasi chip) è efficiente tanto quanto compatta, ma non capisco perchè mi dia questi problemi di “freeze” del display apparentemente senza senso.
Mi chiesto, a questo punto, se il mio specifico display è fatto per essere utilizzato solo tramite u8g2… che ne pensate? A me pare strano, ma al contempo è l’unica spiegazione.

… purtroppo come immaginavo … leggendo i sorgenti … ::slight_smile:

Hai già provato QUESTA libreria? Sembra essere piuttosto compatta e non richiedere grandi risorse.

Guglielmo

E modificare la libreria che non è più compatibile ? Secondo me basta rimuovere dal oled.h la riga 306 "using Print::printf;"

nid69ita: Secondo me basta rimuovere dal oled.h la riga 306 "using Print::printf;"

... probabilmente bisogna levare la funzione sia dal .h (riga 306) che dal .cpp (righe 902 .. 926) ... ::)

Guglielmo

Si Guglielmo, vero, non avevo controllato il cpp
Meglio ancora sarebbe mettere quelle righe in condizione #if solo per esp8266 e esp32
#if defined(ESP8266) || defined(ESP32)
using Print::printf;
#endif
e anche modificare le righe 939,946,958

Allego le modifiche, con board “Uno” mi compila

oled.h (14.6 KB)

oled.cpp (25.9 KB)

Nid, perché non vai su github e ... fork, metti le tue modifiche, commit e alla fine fai pull request ? :D

Guglielmo

Perchè mi pare l'issue sia vecchio e il tipo mi sa che... non caca molto la sua lib

comunque, ci provo...

nid69ita: ... e il tipo mi sa che... non caca molto la sua lib

Guglielmo