OLED 128X64 SSD1306 WEIRD PROBLEM ABOUT BRIGHTNESS. NEED HELP?

Hi guys,
I've been struggling....
I've just bought a OLED display SSD1306 I2C 128x64. It worked really great at first but after using it for about 2 days it turned out to be so weird.
The display used to be normal, but these days it's getting darker.
It's still bright when i supply the power but after that it independently decrease the brightness while it's running, and after just 5 minutes i can't see anything from the OLED screen.
The problem happens again on the next time I use it. (I have to wait for more than 30 minutes ultil it can be bright again)
I'm using Arduino Pro mini 3.3V 8MHz to upload the code to OLED, 1.2KOhm pull-up registors, and using the examples from Adafruit_SSD1306 library.
I have spent a lot of time on searching this problems but still hopeless.

And these are 3 pictures to help you guys understand my problem. I really need help!
Thanks for reading this!

I have two SSD1306 displays, a 128x64 and a 128x32, and both have built-in pull-up resistors on the OLED circuit card. I have not used any external pull-up resistors and both displays have worked correctly. Both of my OLED's have been used on an Arduino Uno and Nano, both 5v. I have not used the OLED's with 3.3v.

I would try removing both of your external pull-up resistors (not registors) and not use them, removing the orange jumper wire that goes from row 22 to row 25 on your breadboard and not use it, and move the yellow power wire that is on row 25 to row 22 (the OLED's VCC input). If that doesn't help, it might be a power or hardware problem.

Here is a simple sketch that toggles an SSD1306 OLED between full-bright and full-dim every second (requires Adafruit GFX library and Adafruit SSD1306 library):

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

void setup()   {
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.fillScreen(WHITE);
}

void loop() {
  display.dim(false);
  display.display();
  delay(1000);
  display.dim(true);
  display.display();
  delay(1000);
}

am2590:
I have two SSD1306 displays, a 128x64 and a 128x32, and both have built-in pull-up resistors on the OLED circuit card. I have not used any external pull-up resistors and both displays have worked correctly. Both of my OLED's have been used on an Arduino Uno and Nano, both 5v. I have not used the OLED's with 3.3v.

I would try removing both of your external pull-up resistors (not registors) and not use them, removing the orange jumper wire that goes from row 22 to row 25 on your breadboard and not use it, and move the yellow power wire that is on row 25 to row 22 (the OLED's VCC input). If that doesn't help, it might be a power or hardware problem.

Here is a simple sketch that toggles an SSD1306 OLED between full-bright and full-dim every second (requires Adafruit GFX library and Adafruit SSD1306 library):

#include <SPI.h>

#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

void setup()  {
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.fillScreen(WHITE);
}

void loop() {
  display.dim(false);
  display.display();
  delay(1000);
  display.dim(true);
  display.display();
  delay(1000);
}

Thanks for your reply. I'm gonna try it and tell you the result later

am2590:
I have two SSD1306 displays, a 128x64 and a 128x32, and both have built-in pull-up resistors on the OLED circuit card. I have not used any external pull-up resistors and both displays have worked correctly. Both of my OLED's have been used on an Arduino Uno and Nano, both 5v. I have not used the OLED's with 3.3v.

I would try removing both of your external pull-up resistors (not registors) and not use them, removing the orange jumper wire that goes from row 22 to row 25 on your breadboard and not use it, and move the yellow power wire that is on row 25 to row 22 (the OLED's VCC input). If that doesn't help, it might be a power or hardware problem.

Here is a simple sketch that toggles an SSD1306 OLED between full-bright and full-dim every second (requires Adafruit GFX library and Adafruit SSD1306 library):

#include <SPI.h>

#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

void setup()  {
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.fillScreen(WHITE);
}

void loop() {
  display.dim(false);
  display.display();
  delay(1000);
  display.dim(true);
  display.display();
  delay(1000);
}

Oh i forgot to write on my post. I did use OLED without the pull-up resistors but the OLED didn't show anything. It only works with the pull-up resistors. And the power supply is 5V, I checked by using VOM, i'm sorry for this wrong information. So the problem is might be from my Arduino Pro mini ? Are there any different cases?

Look at everything that you are using and then try to eliminate each item one at a time to try and figure out what the problem is:

  • OLED
  • Arduino
  • Breadboard
  • Wiring
  • Pull-Up Resistors
  • Code

I am guessing that you don't have an extra Arduino or OLED to try because hopefully you would have tried that already. If you do, try swapping them one at a time to see if replacing them fixes your problem.

If you don't have any replacement parts to try, then try to figure out if the parts you have are good or bad.

  • Arduino: If you are powering the OLED from an Arduino voltage output pin, measure the voltage at the output pin with a voltmeter/multimeter. Also measure the voltage at the VCC input to the OLED. If voltage is good there, then you know that the voltage coming out of the Arduino is good, the wires are good, and the breadboard is good. Make these measurements when the OLED is working correctly and when it is starting to fade out/go bad. Compare them.
  • OLED: Not much you can do here except check that is getting good voltage.
  • Breadboard: Try moving the OLED to a different set of rows on the breadboard. Probably not the problem, but it's a quick and free way to see if it affects anything.
  • Wiring: Try different jumper wires. This probably isn't the problem either. Most wiring problem are either constantly good/bad, or intermittent. Your problem seems to be repeatable.
  • Pull-Up Resistors: I'd try removing them and see what happens. If your OLED doesn't work, then maybe your OLED doesn't have built-in pull-up resistors. I don't have much experience with pull-up resistors, so maybe someone else could say if they could cause a problem like this or not.
  • Code: To me this sounds like a hardware/power problem, not code. I'm fairly new to programming though. Have you messed with changing any of the settings/configurations on the OLED (through software) manually? I know you can send manual commands to the OLED over I2C, and if you don't know what you are doing, you can mess things up.

If I had to guess, I'd say it's either:

  1. Bad OLED.
  2. Bad power coming out of your Arduino after a certain amount of time (which you can check with your voltmeter).

Thank you very much. I guess the problem comes from the OLED too. I'll try everything as you said anyway. Hope i can find the problem as soon as possible

am2590:
Look at everything that you are using and then try to eliminate each item one at a time to try and figure out what the problem is:

  • OLED
  • Arduino
  • Breadboard
  • Wiring
  • Pull-Up Resistors
  • Code

I am guessing that you don't have an extra Arduino or OLED to try because hopefully you would have tried that already. If you do, try swapping them one at a time to see if replacing them fixes your problem.

If you don't have any replacement parts to try, then try to figure out if the parts you have are good or bad.

  • Arduino: If you are powering the OLED from an Arduino voltage output pin, measure the voltage at the output pin with a voltmeter/multimeter. Also measure the voltage at the VCC input to the OLED. If voltage is good there, then you know that the voltage coming out of the Arduino is good, the wires are good, and the breadboard is good. Make these measurements when the OLED is working correctly and when it is starting to fade out/go bad. Compare them.
  • OLED: Not much you can do here except check that is getting good voltage.
  • Breadboard: Try moving the OLED to a different set of rows on the breadboard. Probably not the problem, but it's a quick and free way to see if it affects anything.
  • Wiring: Try different jumper wires. This probably isn't the problem either. Most wiring problem are either constantly good/bad, or intermittent. Your problem seems to be repeatable.
  • Pull-Up Resistors: I'd try removing them and see what happens. If your OLED doesn't work, then maybe your OLED doesn't have built-in pull-up resistors. I don't have much experience with pull-up resistors, so maybe someone else could say if they could cause a problem like this or not.
  • Code: To me this sounds like a hardware/power problem, not code. I'm fairly new to programming though. Have you messed with changing any of the settings/configurations on the OLED (through software) manually? I know you can send manual commands to the OLED over I2C, and if you don't know what you are doing, you can mess things up.

If I had to guess, I'd say it's either:

  1. Bad OLED.
  2. Bad power coming out of your Arduino after a certain amount of time (which you can check with your voltmeter).

I din't do anything with the code. I just uploaded the code to test OLED by using the example from the library and only changed the address from 0x3D to 0x3C.

Most modules have onboard pullup resistors.
Most modules have onboard 3.3V LDO regulators.

This means that for your 3.3V system, you short the LDO regulator.

In an ideal world you have one set of I2C pullup resistors.
They should go to the MCU logic level e.g. 5V on a 5V system or 3.3V on a 3.3V system.
But your OLED is a 3.3V I2C device. So would expect 3.3V pullups.

In practice, the onboard pullups are 10k. Multiple pullups will probably work ok. Just be aware that the effective value is reduced. Pullup values from 820R to 10k should be ok for a 3.3V system.
In practice, the OLED current is so small that it will "work" even if the LDO regulator is not bypassed.

There are slight differences between the SSD1306 and the SH1106 controller. Make sure that you use the correct constructor.

David.

All OLEDs require a voltage of more than 10V. This voltage is generated with the help of several external components (ceramic caps). If these extern caps are broken or not correctly connected, then the charge pump circuit can not generate the voltage any more (display will be dark or completly black).

According to your description, I assume a thermal problem in the charge pump circuit related to the connection of the external ceramic caps (bad solder connection).
My suggestion is to locate the ceramic caps (SMD bricks which do not contain any number) and resolder these caps:

  1. Heat up one side of the cap until the solder melts
  2. Remove solder iron and wait for 20 seconds
  3. Heat up the other side of the cap until the solder melts.
  4. Remove solder iron and wait for 20 seconds, proceed with the next ceramic cap.

There are up to six ceramic caps on one OLED.

Oliver