Esp8266 OLED SH1106 mit Adafruit Library

Hallo.

Ich probiere momentan mir eine Wetterstation mit einem NodeMCU (ESP8266), einem 1,3 Zoll OLED-Display (SH1106) und einem bme280 zubauen. Da ich diese Projekt als Einstieg zum programmieren nutzen wollte, habe ich nicht viel Ahnung vom programmieren.

In der Anleitung, die ich gefunden habe wurde immer ein SSD1306 Display verwendet. Deshalb habe ich nach einer Library für das SH1106 gesucht. Dabei habe ich eine abgewandelte Version der Adafruit_SSD1306 Library bei Github gefunden.
Doch leider funktioniert diese nicht mit dem Esp8266, denn wenn ich den folgenden Code kompiliere, bekomme ich folgenden Fehlercode.

Code:

#include <Wire.h>
#include <Adafruit_GFX.h>      
#include <Adafruit_SH1106.h>  
#include <Adafruit_BME280.h>   
 
#define OLED_RESET    -1

Adafruit_SH1106 display(OLED_RESET);
 
#define BME280_I2C_ADDRESS  0x76
Adafruit_BME280  bme280;
 
void setup(void)
{
  delay(1000);  

  display.begin(SH1106_SWITCHCAPVCC, 0x3c);
  display.clearDisplay();
 
  display.setTextSize(1);   
  display.setTextColor(WHITE, BLACK);  
 
  display.setTextWrap(false);           
  display.setCursor(0, 4);              
  display.print("W\nE\nA\nT\nH\nE\nR");
  display.setCursor(123, 4);            
  display.println("S");  display.setCursor(123, display.getCursorY());
  display.println("T");  display.setCursor(123, display.getCursorY());
  display.println("A");  display.setCursor(123, display.getCursorY());
  display.println("T");  display.setCursor(123, display.getCursorY());
  display.println("I");  display.setCursor(123, display.getCursorY());
  display.println("O");  display.setCursor(123, display.getCursorY());
  display.println("N");
  display.display();        
 
  
  if( bme280.begin(BME280_I2C_ADDRESS) == 0 )
  {  // connection error or device address wrong!
    display.setCursor(34, 23);
    display.print("Connection");
    display.setCursor(49, 33);
    display.print("Error");
    display.display();        
    while(1)  // stay here
      delay(1000);
  }
 
  display.setCursor(29, 0);
  display.print("TEMPERATURE:");
  display.setCursor(38, 23);
  display.print("HUMIDITY:");
  display.setCursor(38, 46);
  display.print("PRESSURE:");
  display.display();        /
}
 
void loop()
{

  float temp = bme280.readTemperature();    
  float humi = bme280.readHumidity();      
  float pres = bme280.readPressure();      
 
  delay(1000);  // wait a second
  display.setCursor(37, 10);
  if(temp < 0)
    display.printf("-%02u.%02u C", (int)abs(temp) % 100, (int)(abs(temp) * 100) % 100 );
  else
    display.printf(" %02u.%02u C", (int)temp % 100, (int)(temp * 100) % 100 );
 
  display.drawRect(75, 10, 3, 3, WHITE);
 
  // 2: print humidity
  display.setCursor(43, 33);
  display.printf("%02u.%02u %%", (int)humi, (int)(humi * 100) % 100 );
  
  // 3: print pressure
  display.setCursor(31, 56);
  display.printf("%04u.%02u hPa", (int)(pres/100), (int)((uint32_t)pres % 100) );
 
  display.display();
 
  delay(1000);  
 
}
 

Fehlercode:

Arduino: 1.8.17 Hourly Build 2021/09/06 02:33 (Windows 8.1), Board: "NodeMCU 1.0 (ESP-12E Module), 80 MHz, Flash, Disabled (new aborts on oom), Disabled, All SSL ciphers (most compatible), 32KB cache + 32KB IRAM (balanced), Use pgm_read macros for IRAM/PROGMEM, 4MB (FS:2MB OTA:~1019KB), 2, v2 Lower Memory, Disabled, None, Only Sketch, 115200"

 

 
C:\Users\MeinUserName\Documents\Arduino\libraries\Adafruit_SH1106-master\Adafruit_SH1106.cpp:31:10: fatal error: util/delay.h: No such file or directory 
   31 | #include <util/delay.h> 
      |          ^~~~~~ 
compilation terminated. 
exit status 1 
Fehler beim Kompilieren für das Board NodeMCU 1.0 (ESP-12E Module).

Ich weiß, dass es noch viele andere Libraries gibt. Doch ich würde gerne diese nutzen, denn für diese gibt es viele Anleitungen. Weiß jemand vielleicht, wie ich das Problem lösen kann.

MfG

SSD1306 ist ein I2C Display (meistens)
Und im keinem Beispiel wurde die Wire.h Bibliothek eigebunden?

Ist ein SPI Display

Ups, habe das ausversehen nicht mit kopiert. In meinem Sketch habe ich die aber eingebunden.

https://www.arduino.cc/reference/en/libraries/oled-ssd1306-sh1106/

mal die probieren

Nein, nicht zwangsläufig.
Ich verwende auch die SH1106 am ESP8266 mit I2C.

@elektron472
Ich poste später vom PC einen passenden Treiber.
Evtl. ist ja ein anderer User schneller. :wink:

Bei ESP ist da was nicht mit der Wire Bibliothek ?
Oder ist das normale Wire.h ?

Der ESP liefert im core seine eigene Wire mit.
Dann passt das.

:+1: :+1: Danke, hab noch nichts mit I2C am ESP8622 gemacht.

Grüße
Bernhard

Alles klar, kein Problem.
@elektron472
Hier ein optimaler Treiber.

Die von Oli Kraus hätte ich auch empfohlen:

U8G2_SH1106_128X64_NONAME_F_HW_I2C oled(U8G2_R0);

  • F = Full Buffer, denn der ESP hat genügend Speicher
  • HW_I2C = Hardware I²C

@agmue
Ich wollte noch einen Link zu deinem Thread, wo es um die Treiber geht, anhängen.
Leider finde ich den aktuell nicht.
Hast du den zur Hand ?

Welches Thema meinst Du?

Dieses Thema meinte ich. Das fiel mir zum Treiber ein.
@elektron472
Schau dir das mal an, da geht's zwar um den Font, aber du siehst, wie komfortabel das Teil ist.

Die Umgebung für ESP8266 habe ich nicht, aber ESP32 funktioniert bei mir auch nicht mit dieser Bibliothek. Sie ist recht alt und daher rate ich Dir als Anfänger, eine funktionierende Bibliothek zu verwenden, siehe #9 die von Oli Kraus.

@elektron472
Genau, und die Beispiele im Link von Post #13.
Außerdem findest du in der Library zahlreiche Beispiele, die dir sicher helfen.

Edit:
Oder als Alternative, diese Library.
Und da die SH1106Wire. Diese funktioniert bei mir auch.

Vielen Dank für eure Hilfe. Dann werde ich es mit dieser Library versuchen.