Hi.
Recently I found some really nice transparent OLED displays on AliExpress:
https://www.aliexpress.com/item/1005004207889866.html
Datasheet:
However, I cannot get them to work. I am on my third display now and cannot see what I am doing wrong. The displays draw a large amount of current (eg. 100+mA) at the recommended VCC of 16V (I have it current limited to 20mA as per expected current draw of 13mA in the datasheet), and does not show any response when running the example code provided by the manufacturer.
The display is connected to a breadboard through a 15-pin FPC to pin-header breakout board (connections have been checked to the LCD itself by measuring between the common ground pins). I have followed the schematic from the datasheet, and made sure that every component is exactly the value that is recommended:
Yes, I know it is not that easy to see the connections from the photo above, but you will just have to trust me.
Further on, I have programmed my Pi Pico (since it has 3.3V I/O which is within the recommended values on the datasheet and the controller datasheet) using the following initialization sequence that is specified in the datasheet of the display:
#include <SPI.h>
#define RST 21 // Reset pin
#define CS 17 // Chip select pin
#define DC 20 // Data/Command pin
void setup() {
// Initialize the SPI communication and OLED control pins
pinMode(CS, OUTPUT);
pinMode(RST, OUTPUT);
pinMode(DC, OUTPUT);
SPI.setCS(17);
SPI.setTX(19);
SPI.setSCK(18);
digitalWrite(DC, LOW); // Set DC low for command
digitalWrite(RST, LOW); // Set DC low for command
digitalWrite(CS, HIGH); // Select the OLED controller
// Start SPI and set parameters
SPI.begin();
SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));
// Reset the OLED
digitalWrite(RST, LOW); // Set RST low to reset
delay(1);
digitalWrite(RST, HIGH); // Set RST high for normal operation
delay(100);
OLED_SetInitCode(); // Call the setup function for the OLED display
OLED_Disp_Draw(); // Call the draw function in the loop to keep displaying
}
void loop() {
OLED_Disp_Draw(); // Call the draw function in the loop to keep displaying
delay(1000); // Add a delay for demonstration
}
// Function to send a command to the OLED display
void Command(uint8_t command) {
digitalWrite(DC, LOW); // Set DC low for command
digitalWrite(CS, LOW); // Select the OLED controller
SPI.transfer(command); // Send the command via SPI
digitalWrite(CS, HIGH); // Deselect the OLED controller
digitalWrite(DC, HIGH); // Set DC high
}
// Function to send a parameter to the OLED display
void Parameter(uint8_t data) {
digitalWrite(DC, HIGH); // Set DC high for data
digitalWrite(CS, LOW); // Select the OLED controller
SPI.transfer(data); // Send the data via SPI
digitalWrite(CS, HIGH); // Deselect the OLED controller
}
// OLED initialization code
void OLED_SetInitCode() { // 150cd/m2
Command(0x01);
Command(0x04);
Parameter(0x04);
Command(0x05);
Parameter(0x09);
Command(0x06);
Parameter(0x00);
Command(0x07);
Parameter(0x00);
Parameter(0x00);
Parameter(0x07);
Parameter(0x0F);
Parameter(0x00);
Parameter(0x00);
Parameter(0x03);
Parameter(0x0F);
Command(0x08);
Parameter(0x01);
Command(0x09);
Parameter(0x07);
Command(0x0A);
Parameter(0x00);
Parameter(0x00);
Parameter(0x07);
Parameter(0x0F);
Parameter(0x00);
Parameter(0x00);
Parameter(0x03);
Parameter(0x0F);
Command(0x0B);
Parameter(0x00);
Parameter(0x00);
Parameter(0x00);
Parameter(0x00);
Command(0x0E);
Parameter(0x02);
Parameter(0x03);
Parameter(0x01);
Parameter(0x02);
Parameter(0x01);
Parameter(0x0C);
Command(0x0F);
Parameter(0x00);
Parameter(0x00);
Parameter(0x00);
Command(0x10);
Parameter(0x01);
Command(0x1C);
Parameter(0x01);
Command(0x1D);
Parameter(0x01);
Parameter(0x01);
Parameter(0x01);
Command(0x1E);
Parameter(0x00);
Command(0x1F);
Parameter(0x00);
Command(0x30);
Parameter(0x10);
Command(0x34);
Parameter(0x00);
Command(0x03);
Parameter(0x00);
Command(0x02);
Parameter(0x01);
}
// OLED draw function to fill display with red
void OLED_Disp_Draw() { // Example: Full RED Draw
int iX, iY;
Command(0x0C);
for (iY = 0; iY < 128; iY++) {
for (iX = 0; iX < 128; iX++) {
Parameter(0xF8);
Parameter(0x00);
}
}
}
When I connect everything, I make sure that VCC > VDD > VSS at all times. Powering up the Pi Pico it sends the SPI initialization sequence, but then the display just draws 10 times the specified current, and I cannot figure out why.
I have triple-checked the connections based on the schematic and have measured every connection, and I cannot figure out what the issue is. The zener diode I am using is the 1N5221BCT-ND, which should be equivalent to the one mentioned in the datasheet, and I have confirmed that it is connected the correct way towards the "PRE"-pin.
The displays are 100% new and does not seem to have any signs of use. I know that it should possible to make them work, as I found this image in the listing:
I have contacted the seller on AliExpress but as you might have guessed they have no interest in giving support or guidance in any way (not that I expected that).
I cannot see the display pin numbers being flipped as as soon the SPI initialization sequence from the Pi Pico has been sent the current on VCC increases (it seems the display driver circuitry is enabled) but nothing shows up on the screen. The A0-pin is the same as DC (data/command).
Could someone please tell me what I am missing? Thank you!



