Trovato l'inghippo.
Come avevo letto in giro, le due librerie allocano il frame buffer in modo differente, ma ai fini della occupazione di ram sono equivalenti.
Flash su Arduino Uno:
SSD1306
Lo sketch usa 14930 byte (48%) dello spazio disponibile per i programmi. Il massimo è 32256 byte.
Le variabili globali usano 567 byte (27%) di memoria dinamica, lasciando altri 1481 byte liberi per le variabili locali. Il massimo è 2048 byte.
avrdude: writing flash (14930 bytes):
SH1106
Lo sketch usa 13142 byte (42%) dello spazio disponibile per i programmi. Il massimo è 32256 byte.
Le variabili globali usano 1584 byte (77%) di memoria dinamica, lasciando altri 464 byte liberi per le variabili locali. Il massimo è 2048 byte.
avrdude: writing flash (13142 bytes):
Se si esegue lo sketch che allego il risultato al runtime è quasi identico:
- 464 byte liberi per la SH1106
- 455 byte liberi per la SSD1306.
Il display da 0,96 pollici bicolore giallo/azzuro di cui dispongo funziona con tutte e due le librerie.
L'altro da 1,3 pollici invece funziona soltanto con la SH1106.
//************************************************************************
// This example investigate on amount of ram used by oled display device
// Monochrome OLEDs based on SSD1306 drivers
// Monochrome OLEDs based on SH1106 drivers
//************************************************************************
// Uncomment only one display type
#define DISPLAY_TYPE_SH1106
//#define DISPLAY_TYPE_SSD1306
#include <Wire.h>
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C
#ifdef DISPLAY_TYPE_SSD1306
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define POWERMODE SSD1306_SWITCHCAPVCC
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
char DISPLAY_TYPE[] = "SD1306";
#endif
#ifdef DISPLAY_TYPE_SH1106
#include <Adafruit_SH1106.h>
#define POWERMODE SH1106_SWITCHCAPVCC
Adafruit_SH1106 display(OLED_RESET);
char DISPLAY_TYPE[] = "SH1106";
#endif
#define SMALL 1
#define BIG 2
int ramBefore = 0;
int ramAfter = 0;
void setup() {
display.clearDisplay();
Serial.begin(9600);
Serial.print(F("\n--------------------------------------\n"));
Serial.print(F("Whit library: "));
Serial.println(DISPLAY_TYPE);
Serial.print(F("--------------------------------------\n"));
ramBefore = getFreeRam() + 14;
Serial.print(F("Free ram before display init:\t")); Serial.println(ramBefore);
//------------------------------------------------------------
// Display initialization
//------------------------------------------------------------
display.begin(POWERMODE, SCREEN_ADDRESS);
//------------------------------------------------------------
ramAfter = getFreeRam() + 14;
Serial.print(F("Free ram after display init:\t")); Serial.println(ramAfter);
}
void loop() {
char ram[10];
delay(3000);
display.clearDisplay();
displayText(25, 1, DISPLAY_TYPE, WHITE, BLACK, BIG);
displayText(15, 30, "FREE RAM", WHITE, BLACK, BIG);
delay(3000);
display.clearDisplay();
displayText(25, 1, "BEFORE", WHITE, BLACK, BIG);
displayText(38, 18, "INIT", WHITE, BLACK, BIG);
itoa(ramBefore, ram, 10);
displayText(5, 40, ram, WHITE, BLACK, BIG);
displayText(60, 40, "bytes", WHITE, BLACK, BIG);
delay(3000);
display.clearDisplay();
displayText(28, 1, "AFTER", WHITE, BLACK, BIG);
displayText(38, 18, "INIT", WHITE, BLACK, BIG);
itoa(ramAfter, ram, 10);
displayText(10, 40, ram, WHITE, BLACK, BIG);
displayText(60, 40, "bytes", WHITE, BLACK, BIG);
}
void displayText(byte x, byte y, const char *str, byte foreColor, byte backColor, byte textSize) {
display.setTextSize(textSize);
display.setTextColor(foreColor, backColor);
display.setCursor(x, y);
display.print(str);
display.display();
}
int getFreeRam () {
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval) ;
}
Nota: ho aggiunto 14 ai bytes restituiti dalla funzione getFreeRam() (trovata sul web) in quanto questa restituisce un valore inferiore di 14 byte rispetto a quanto indicato all'IDE.