显示 SSD1306 在 esp32 上片刻后停止工作

Display SSD1306 stops working after a short while on esp32

我目前正在开发一个传感器盒,它在通过 I2C(21 和 22)连接的 SSD1306 显示器上的 ESP32 节点 MCU 循环中不间断地显示传感器数据。但是然后显示会出现奇怪的东西。

我现在不能分享所有的 ESP32 代码,但我想这应该是所有需要的东西了:

#include <Wire.h>
#include <Adafruit_SSD1306.h>

void setup() {
    Wire.begin();
    initializeDisplay();
}

void loop() {
    ...
    writeToDisplay(.......);
}

#define SCREEN_WIDTH 128     // OLED display width, in pixels
#define SCREEN_HEIGHT 64     // OLED display height, in pixels
#define OLED_RESET -1         // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C 
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
bool initializeDisplay() {
  if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    return false;
  }
  display.display();
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 0);
  display.println("Display initialized!");
  display.display();
  display.clearDisplay();
  return true;
}




void writeToDisplay(float colorTemp, float lux, float dbValue, String temperature, String relH, String co2) {
      display.clearDisplay();
      displayText ="";
      displayText += "Lux ";
      displayText += String(lux,1);
      displayText += "lx\n";
    
      displayText += "Color Temp. ";
      displayText += String(colorTemp, 1);
      displayText += "K\n";
    
      displayText += "Noise level: ";
      displayText += String(dbValue, 1);
      displayText += "dbA\n";
    
      displayText += "Temperature: ";
      displayText += temperature;
      displayText += "C\n";
    
      displayText += "relH ";
      displayText += relH;
      displayText += "%\n";
    
      displayText += "CO2 ";
      displayText += co2;
      displayText += "ppm\n";
      if(isPortable()) {
        displayText += "Portable Mode";
      }
      display.println(displayText);
      display.display();
    }

开始时一切正常,但大约一分钟后发生了这种情况:

这是内存还是闪存问题?有人有什么主意吗?我认为这不是电源问题。

显然问题出在同一条 I2C 总线上连接了太多设备。 那么是什么解决了这个问题:

  • 我没有将显示器、两个传感器和一个实时时钟焊接到 GPIO 21 和 22,而是将显示器焊接到 GPIO 32 和 33。

  • 已将 Wire1.begin(32, 33); 添加到设置中

  • 将显示的构造函数更改为 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire1, -1);

我想一旦公交车上的交通太多,显示器就会停止工作。所以这不是内存问题