I would like to use an SH1106 I2C OLED in a project. Google and a search of the forum do not provide a clear answer of whether this is easily accomplished. Adafruit provides a library (Adafruit_SH1106-master) and an example of use. However, when I try to test the library on the Teensy 4.1 using the provided example program, the compiler generates a series of error messages when compiling the library files. Have any of you been able to get this library to work? Is there a functional alternative if not?
I have had no problems working with the Adafruit library for SH1306 OLEDs working with a Teensy 4.1. I have attached the example SH1106 I2C program from Adafruit. Here are the error messages that the compiler generates:
In file included from C:\Users\Michael\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.58.1\cores\teensy4/core_pins.h:33,
from C:\Users\Michael\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.58.1\cores\teensy4/wiring.h:39,
from C:\Users\Michael\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.58.1\cores\teensy4/WProgram.h:46,
from C:\Users\Michael\AppData\Local\Temp\arduino\sketches\A71F12D0E38BEF0A781D55C47A96A9A9/pch/Arduino.h:6,
from C:\Users\Michael\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.58.1\libraries\Wire/WireIMXRT.h:32,
from C:\Users\Michael\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.58.1\libraries\Wire/Wire.h:26,
from c:\Users\Michael\Documents\Arduino\libraries\Adafruit_SH1106-master\Adafruit_SH1106.cpp:35:
c:\Users\Michael\Documents\Arduino\libraries\Adafruit_SH1106-master\Adafruit_SH1106.cpp: In member function 'void Adafruit_SH1106::begin(uint8_t, uint8_t, bool)':
C:\Users\Michael\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.58.1\cores\teensy4/pins_arduino.h:142:71: error: cannot convert 'volatile uint32_t*' {aka 'volatile long unsigned int*'} to 'PortReg*' {aka 'volatile unsigned char*'} in assignment
142 | #define portOutputRegister(pin) ((digital_pin_to_info_PGM[(pin)].reg + 0))
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
| |
| volatile uint32_t* {aka volatile long unsigned int*}
c:\Users\Michael\Documents\Arduino\libraries\Adafruit_SH1106-master\Adafruit_SH1106.cpp:179:19: note: in expansion of macro 'portOutputRegister'
179 | csport = portOutputRegister(digitalPinToPort(cs));
| ^~~~~~~~~~~~~~~~~~
C:\Users\Michael\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.58.1\cores\teensy4/pins_arduino.h:142:71: error: cannot convert 'volatile uint32_t*' {aka 'volatile long unsigned int*'} to 'PortReg*' {aka 'volatile unsigned char*'} in assignment
142 | #define portOutputRegister(pin) ((digital_pin_to_info_PGM[(pin)].reg + 0))
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
| |
| volatile uint32_t* {aka volatile long unsigned int*}
c:\Users\Michael\Documents\Arduino\libraries\Adafruit_SH1106-master\Adafruit_SH1106.cpp:181:19: note: in expansion of macro 'portOutputRegister'
181 | dcport = portOutputRegister(digitalPinToPort(dc));
| ^~~~~~~~~~~~~~~~~~
C:\Users\Michael\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.58.1\cores\teensy4/pins_arduino.h:142:71: error: cannot convert 'volatile uint32_t*' {aka 'volatile long unsigned int*'} to 'PortReg*' {aka 'volatile unsigned char*'} in assignment
142 | #define portOutputRegister(pin) ((digital_pin_to_info_PGM[(pin)].reg + 0))
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
| |
| volatile uint32_t* {aka volatile long unsigned int*}
c:\Users\Michael\Documents\Arduino\libraries\Adafruit_SH1106-master\Adafruit_SH1106.cpp:187:21: note: in expansion of macro 'portOutputRegister'
187 | clkport = portOutputRegister(digitalPinToPort(sclk));
| ^~~~~~~~~~~~~~~~~~
C:\Users\Michael\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.58.1\cores\teensy4/pins_arduino.h:142:71: error: cannot convert 'volatile uint32_t*' {aka 'volatile long unsigned int*'} to 'PortReg*' {aka 'volatile unsigned char*'} in assignment
142 | #define portOutputRegister(pin) ((digital_pin_to_info_PGM[(pin)].reg + 0))
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
| |
| volatile uint32_t* {aka volatile long unsigned int*}
c:\Users\Michael\Documents\Arduino\libraries\Adafruit_SH1106-master\Adafruit_SH1106.cpp:189:21: note: in expansion of macro 'portOutputRegister'
189 | mosiport = portOutputRegister(digitalPinToPort(sid));
| ^~~~~~~~~~~~~~~~~~
exit status 1
Compilation error: exit status 1
I have had no problems working with the Adafruit library for SH1306 OLEDs working with a Teensy 4.1. I have attached the example SH1106 I2C program from Adafruit. Here are the error messages that the compiler generates:
In file included from C:\Users\Michael\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.58.1\cores\teensy4/core_pins.h:33,
from C:\Users\Michael\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.58.1\cores\teensy4/wiring.h:39,
from C:\Users\Michael\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.58.1\cores\teensy4/WProgram.h:46,
from C:\Users\Michael\AppData\Local\Temp\arduino\sketches\A71F12D0E38BEF0A781D55C47A96A9A9/pch/Arduino.h:6,
from C:\Users\Michael\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.58.1\libraries\Wire/WireIMXRT.h:32,
from C:\Users\Michael\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.58.1\libraries\Wire/Wire.h:26,
from c:\Users\Michael\Documents\Arduino\libraries\Adafruit_SH1106-master\Adafruit_SH1106.cpp:35:
c:\Users\Michael\Documents\Arduino\libraries\Adafruit_SH1106-master\Adafruit_SH1106.cpp: In member function 'void Adafruit_SH1106::begin(uint8_t, uint8_t, bool)':
C:\Users\Michael\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.58.1\cores\teensy4/pins_arduino.h:142:71: error: cannot convert 'volatile uint32_t*' {aka 'volatile long unsigned int*'} to 'PortReg*' {aka 'volatile unsigned char*'} in assignment
142 | #define portOutputRegister(pin) ((digital_pin_to_info_PGM[(pin)].reg + 0))
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
| |
| volatile uint32_t* {aka volatile long unsigned int*}
c:\Users\Michael\Documents\Arduino\libraries\Adafruit_SH1106-master\Adafruit_SH1106.cpp:179:19: note: in expansion of macro 'portOutputRegister'
179 | csport = portOutputRegister(digitalPinToPort(cs));
| ^~~~~~~~~~~~~~~~~~
C:\Users\Michael\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.58.1\cores\teensy4/pins_arduino.h:142:71: error: cannot convert 'volatile uint32_t*' {aka 'volatile long unsigned int*'} to 'PortReg*' {aka 'volatile unsigned char*'} in assignment
142 | #define portOutputRegister(pin) ((digital_pin_to_info_PGM[(pin)].reg + 0))
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
| |
| volatile uint32_t* {aka volatile long unsigned int*}
c:\Users\Michael\Documents\Arduino\libraries\Adafruit_SH1106-master\Adafruit_SH1106.cpp:181:19: note: in expansion of macro 'portOutputRegister'
181 | dcport = portOutputRegister(digitalPinToPort(dc));
| ^~~~~~~~~~~~~~~~~~
C:\Users\Michael\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.58.1\cores\teensy4/pins_arduino.h:142:71: error: cannot convert 'volatile uint32_t*' {aka 'volatile long unsigned int*'} to 'PortReg*' {aka 'volatile unsigned char*'} in assignment
142 | #define portOutputRegister(pin) ((digital_pin_to_info_PGM[(pin)].reg + 0))
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
| |
| volatile uint32_t* {aka volatile long unsigned int*}
c:\Users\Michael\Documents\Arduino\libraries\Adafruit_SH1106-master\Adafruit_SH1106.cpp:187:21: note: in expansion of macro 'portOutputRegister'
187 | clkport = portOutputRegister(digitalPinToPort(sclk));
| ^~~~~~~~~~~~~~~~~~
C:\Users\Michael\AppData\Local\Arduino15\packages\teensy\hardware\avr\1.58.1\cores\teensy4/pins_arduino.h:142:71: error: cannot convert 'volatile uint32_t*' {aka 'volatile long unsigned int*'} to 'PortReg*' {aka 'volatile unsigned char*'} in assignment
142 | #define portOutputRegister(pin) ((digital_pin_to_info_PGM[(pin)].reg + 0))
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
| |
| volatile uint32_t* {aka volatile long unsigned int*}
c:\Users\Michael\Documents\Arduino\libraries\Adafruit_SH1106-master\Adafruit_SH1106.cpp:189:21: note: in expansion of macro 'portOutputRegister'
189 | mosiport = portOutputRegister(digitalPinToPort(sid));
| ^~~~~~~~~~~~~~~~~~
exit status 1
Compilation error: exit status 1