Взаимозаменяемость OLED 1.5" 128x128 на контроллерах SH1107 и SSD1327

Доброго дня, уважаемые форумчане!
Прошу помощи в выяснении совместимости (взаимозаменяемости) указанных в теме дисплеев. Суть проблемы такова: Есть реализованный мной проект блока питания. В какой-то “несчастный” момент дисплей на контроллере SSD1327 был разбит. Китайцы уже трижды мне прислали дисплей на контроллере SH1107, хотя перед оплатой я переспрашивал действительно ли мне отправят то, что указано в карточке товара. Автор проекта уже давно на связь не выходит. Вот оригинальный скетч:

#include <Wire.h>
#include <Adafruit_SSD1327.h>
#include <Adafruit_INA260.h>
#include <INA226_WE.h>
#include <Adafruit_INA219.h>

#define I2C_ADDRESS_5V 0x41
#define I2C_ADDRESS_3V 0x44
#define DISPLAY_BTN  16
#define LED_12V     20
#define LED_5V      19 //to display what is selected from the button on the screen
#define LED_3_3V    18

// Used for I2C or SPI
#define OLED_RESET -1

// I2C
Adafruit_SSD1327 display(128, 128, &Wire, OLED_RESET, 1000000);
Adafruit_INA260 ina260 = Adafruit_INA260();

//INA226_WE ina226 = INA226_WE(I2C_ADDRESS_5V);
Adafruit_INA219 ina219(I2C_ADDRESS_5V);

//INA226_WE ina22633v = INA226_WE(I2C_ADDRESS_3V);
Adafruit_INA219 ina21933v(I2C_ADDRESS_3V);

//displayDelay
unsigned long prevDisplayDelay = 0;
unsigned long prevDisplayBtnDelay = 0;
unsigned long prevReadDelay = 0;
unsigned long prevSerialSentDelay = 0;
bool dspBtnPressed = false;
int displaySelection = 0; // 0 = all 3 of them ,  1 = 12V, 2 = 5V, 3 = 3.3V

//read values:
float milliVolt12v = 0;
float milliCurent12v = 0;
float milliPower12v = 0;

float milliVolt5v = 0;
float milliCurent5v = 0;
float milliPower5v  = 0;

float milliVolt3v = 0;
float milliCurent3v = 0;
float milliPower3v = 0;

void setup()   {
  Wire.setSDA(0);
  Wire.setSCL(1);

  pinMode(DISPLAY_BTN, INPUT_PULLUP);
  pinMode(LED_12V, OUTPUT);
  pinMode(LED_5V, OUTPUT);
  pinMode(LED_3_3V, OUTPUT);

  Serial.begin(115200);

  if ( ! display.begin(0x3C) ) {
    //    Serial.println("Unable to initialize OLED");
    while (1) yield();
  }
  if (!ina260.begin()) {
    Serial.println("Couldn't find INA260 chip");
    while (1);
  }
   if (! ina219.begin()) {
    Serial.println("Failed to find INA219 chip");
    while (1) { delay(10); }
  }
   if (! ina21933v.begin()) {
    Serial.println("Failed to find ina21933v chip");
    while (1) { delay(10); }
  }
  
  display.clearDisplay();
  display.display();

  Serial.println(F("PowerBenchReady"));
}

void loop() {

  handleDisplayBtn();

  if (millis() - prevReadDelay < 500) {
    readValues();
    prevReadDelay = millis();
  }

  if (displaySelection == 0) {
    displayAllIna();
  } else if (displaySelection == 1) {
    displaySingle12V();
  } else if (displaySelection == 2) {
    displaySingle5V();
  } else if (displaySelection == 3) {
    displaySingle3V();
  }

  if (millis() - prevSerialSentDelay > 1000) {
    sendSerialValues();
    prevSerialSentDelay = millis();
  }
}

void displayAllIna() {
  if (millis() - prevDisplayDelay > 1000) {
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextWrap(false);
    display.setTextColor(SSD1327_WHITE);
    display.drawRect(0, 0, 125, 42, SSD1327_WHITE);
    display.drawRect(0, 0, 125, 13, SSD1327_WHITE);
    display.setCursor(55, 3);
    display.print(F("12V"));

    display.setCursor(4, 15);
    //Voltage
    display.print(F("Voltage: "));
    display.print(milliVolt12v / 1000, 3);
    display.println(" V");
    display.print(F(" Current: "));
    display.print(milliCurent12v / 1000.00, 3);
    display.println(" A");
    display.print(F(" Power: "));
    display.print(milliPower12v / 1000.00, 3);
    display.println(" W");

    display.drawRect(0, 43, 125, 42, SSD1327_WHITE);
    display.drawRect(0, 43, 125, 13, SSD1327_WHITE);
    display.setCursor(55, 46);
    display.print(F("5V"));

    display.setCursor(4, 58);
    //INA226
    display.print(F("Voltage: "));
    display.print(milliVolt5v);
    display.println(" V");
    display.print(F(" Current: "));
    display.print(milliCurent5v / 1000.00, 3);
    display.println(" A");
    display.print(F(" Power: "));
    display.print(milliPower5v / 1000.00, 3);
    display.println(" W");


    display.drawRect(0, 86, 125, 42, SSD1327_WHITE);
    display.drawRect(0, 86, 125, 13, SSD1327_WHITE);
    display.setCursor(55, 89);
    display.print(F("3.3V"));

    display.setCursor(4, 101);
    display.print(F("Voltage: "));
    display.print(milliVolt3v);
    display.println(" V");
    display.print(F(" Current: "));
    display.print(milliCurent3v / 1000.00, 3);
    display.println(" A");
    display.print(F(" Power: "));
    display.print(milliPower3v / 1000.00, 3);
    display.println(" W");

    display.display();
    prevDisplayDelay = millis();
  }
}

void displaySingle12V() {

  if (millis() - prevDisplayDelay > 1000) {
    display.clearDisplay();
    display.setTextSize(2);
    display.setTextWrap(false);
    display.setTextColor(SSD1327_WHITE);
    display.drawRect(0, 0, 125, 125, SSD1327_WHITE);
    display.drawRect(0, 0, 125, 33, SSD1327_WHITE);
    display.setCursor(45, 10);
    display.print(F("12V"));

    display.setCursor(0, 40);

    //Voltage
    display.print("  ");
    display.print(milliVolt12v / 1000.0, 3);
    display.println(" V");
    display.print("  ");
    display.print(milliCurent12v / 1000.00, 3);
    display.println(" A");
    display.print("  ");
    display.print(milliPower12v / 1000.0, 3);
    display.println(" W");
    display.display();
    prevDisplayDelay = millis();
  }
}

void displaySingle5V() {

  if (millis() - prevDisplayDelay > 1000) {
    display.clearDisplay();
    display.setTextSize(2);
    display.setTextWrap(false);
    display.setTextColor(SSD1327_WHITE);
    display.drawRect(0, 0, 125, 125, SSD1327_WHITE);
    display.drawRect(0, 0, 125, 32, SSD1327_WHITE);
    display.setCursor(48, 10);
    display.print(F("5V"));

    display.setCursor(0, 40);

    //Voltage
    display.print("  ");
    display.print(milliVolt5v, 3);
    display.println(" V");
    display.print("  ");
    display.print(milliCurent5v / 1000.0, 3);
    display.println(" A");
    display.print("  ");
    display.print(milliPower5v / 1000.0, 3);
    display.println(" W");
    display.display();
    prevDisplayDelay = millis();
  }
}

void displaySingle3V() {

  if (millis() - prevDisplayDelay > 1000) {
    display.clearDisplay();
    display.setTextSize(2);
    display.setTextWrap(false);
    display.setTextColor(SSD1327_WHITE);
    display.drawRect(0, 0, 125, 125, SSD1327_WHITE);
    display.drawRect(0, 0, 125, 33, SSD1327_WHITE);
    display.setCursor(43, 10);
    display.print(F("3.3V"));

    display.setCursor(0, 40);

    //Voltage
    display.print("  ");
    display.print(milliVolt3v, 3);
    display.println(" V");
    display.print("  ");
    display.print(milliCurent3v / 1000.00, 3);
    display.println(" A");
    display.print("  ");
    display.print(milliPower3v / 1000.0, 3);


    display.println(" W");
    display.display();
    prevDisplayDelay = millis();
  }
}

void handleDisplayBtn() {

  int dspBtn = digitalRead(DISPLAY_BTN);
  if (dspBtn == LOW && ( millis() - prevDisplayBtnDelay) > 300 && !dspBtnPressed) {

    displaySelection++;

    if (displaySelection == 1) {
      digitalWrite(LED_12V, HIGH);
      digitalWrite(LED_5V, LOW);
      digitalWrite(LED_3_3V, LOW);
    } else if (displaySelection == 2) {
      digitalWrite(LED_12V, LOW);
      digitalWrite(LED_5V, HIGH);
      digitalWrite(LED_3_3V, LOW);
    } else if (displaySelection == 3) {
      digitalWrite(LED_12V, LOW);
      digitalWrite(LED_5V, LOW);
      digitalWrite(LED_3_3V, HIGH);
    } else if (displaySelection > 3) {
      displaySelection = 0;
      digitalWrite(LED_12V, LOW);
      digitalWrite(LED_5V, LOW);
      digitalWrite(LED_3_3V, LOW);
    }

    dspBtnPressed = true;
    prevDisplayBtnDelay = millis();
    prevDisplayDelay = millis() - 1000; // to trigger the display right away


  } else if (dspBtn == HIGH) {
    dspBtnPressed = false;
  }
}

void readValues() {
  milliVolt12v = ina260.readBusVoltage();
  milliCurent12v = ina260.readCurrent();
  milliPower12v = ina260.readPower();

  milliVolt5v = ina219.getBusVoltage_V();
  milliCurent5v = ina219.getCurrent_mA();
  milliPower5v  = ina219.getPower_mW();

  milliVolt3v = ina21933v.getBusVoltage_V();
  milliCurent3v = ina21933v.getCurrent_mA();
  milliPower3v = ina21933v.getPower_mW();
}

void sendSerialValues() {
  Serial.print('<');
  Serial.print(milliVolt12v);
  Serial.print(',');
  Serial.print(milliCurent12v);
  Serial.print(',');
  Serial.print(milliPower12v);
  Serial.print(',');
  Serial.print(milliVolt5v);
  Serial.print(',');
  Serial.print(milliCurent5v);
  Serial.print(',');
  Serial.print(milliPower5v);
  Serial.print(',');
  Serial.print(milliVolt3v);
  Serial.print(',');
  Serial.print(milliCurent3v);
  Serial.print(',');
  Serial.print(milliPower3v);
  Serial.print('>');
}

Возможно ли адаптировать этот скетч под связку Raspberry Pi Pico и дисплей на контроллере SH1107?

а в чём сложности?

"E:\\arduino-ESP32C3\\portable\\packages\\rp2040\\tools\\pqt-gcc\\1.5.0-b-c7bab52/bin/arm-none-eabi-size" -A "C:\\Temp\\arduino_build_964807/Blok_Pitaniya.ino.elf"
Скетч использует 328276 байт (15%) памяти устройства. Всего доступно 2093056 байт.
Глобальные переменные используют 71992 байт (27%) динамической памяти, оставляя 190152 байт для локальных переменных. Максимум: 262144 байт.

#include <Wire.h>
//#include <Adafruit_SSD1327.h>
#include <Adafruit_SH110X.h>
#include <Adafruit_INA260.h>
#include <INA226_WE.h>
#include <Adafruit_INA219.h>

#define I2C_ADDRESS_5V 0x41
#define I2C_ADDRESS_3V 0x44
#define DISPLAY_BTN  16
#define LED_12V     20
#define LED_5V      19 //to display what is selected from the button on the screen
#define LED_3_3V    18

// Used for I2C or SPI
#define OLED_RESET -1

// I2C
//Adafruit_SSD1327 display(128, 128, &Wire, OLED_RESET, 1000000);
Adafruit_SH1107 display(128, 128, &Wire, OLED_RESET, 1000000,100000);
Adafruit_INA260 ina260 = Adafruit_INA260();

//INA226_WE ina226 = INA226_WE(I2C_ADDRESS_5V);
Adafruit_INA219 ina219(I2C_ADDRESS_5V);

//INA226_WE ina22633v = INA226_WE(I2C_ADDRESS_3V);
Adafruit_INA219 ina21933v(I2C_ADDRESS_3V);

//displayDelay
unsigned long prevDisplayDelay = 0;
unsigned long prevDisplayBtnDelay = 0;
unsigned long prevReadDelay = 0;
unsigned long prevSerialSentDelay = 0;
bool dspBtnPressed = false;
int displaySelection = 0; // 0 = all 3 of them ,  1 = 12V, 2 = 5V, 3 = 3.3V

//read values:
float milliVolt12v = 0;
float milliCurent12v = 0;
float milliPower12v = 0;

float milliVolt5v = 0;
float milliCurent5v = 0;
float milliPower5v  = 0;

float milliVolt3v = 0;
float milliCurent3v = 0;
float milliPower3v = 0;

void setup()   {
  Wire.setSDA(0);
  Wire.setSCL(1);

  pinMode(DISPLAY_BTN, INPUT_PULLUP);
  pinMode(LED_12V, OUTPUT);
  pinMode(LED_5V, OUTPUT);
  pinMode(LED_3_3V, OUTPUT);

  Serial.begin(115200);

  if ( ! display.begin(0x3C) ) {
    //    Serial.println("Unable to initialize OLED");
    while (1) yield();
  }
  if (!ina260.begin()) {
    Serial.println("Couldn't find INA260 chip");
    while (1);
  }
   if (! ina219.begin()) {
    Serial.println("Failed to find INA219 chip");
    while (1) { delay(10); }
  }
   if (! ina21933v.begin()) {
    Serial.println("Failed to find ina21933v chip");
    while (1) { delay(10); }
  }
  
  display.clearDisplay();
  display.display();

  Serial.println(F("PowerBenchReady"));
}

void loop() {

  handleDisplayBtn();

  if (millis() - prevReadDelay < 500) {
    readValues();
    prevReadDelay = millis();
  }

  if (displaySelection == 0) {
    displayAllIna();
  } else if (displaySelection == 1) {
    displaySingle12V();
  } else if (displaySelection == 2) {
    displaySingle5V();
  } else if (displaySelection == 3) {
    displaySingle3V();
  }

  if (millis() - prevSerialSentDelay > 1000) {
    sendSerialValues();
    prevSerialSentDelay = millis();
  }
}

void displayAllIna() {
  if (millis() - prevDisplayDelay > 1000) {
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextWrap(false);
    display.setTextColor(SH110X_WHITE);
    display.drawRect(0, 0, 125, 42, SH110X_WHITE);
    display.drawRect(0, 0, 125, 13, SH110X_WHITE);
    display.setCursor(55, 3);
    display.print(F("12V"));

    display.setCursor(4, 15);
    //Voltage
    display.print(F("Voltage: "));
    display.print(milliVolt12v / 1000, 3);
    display.println(" V");
    display.print(F(" Current: "));
    display.print(milliCurent12v / 1000.00, 3);
    display.println(" A");
    display.print(F(" Power: "));
    display.print(milliPower12v / 1000.00, 3);
    display.println(" W");

    display.drawRect(0, 43, 125, 42, SH110X_WHITE);
    display.drawRect(0, 43, 125, 13, SH110X_WHITE);
    display.setCursor(55, 46);
    display.print(F("5V"));

    display.setCursor(4, 58);
    //INA226
    display.print(F("Voltage: "));
    display.print(milliVolt5v);
    display.println(" V");
    display.print(F(" Current: "));
    display.print(milliCurent5v / 1000.00, 3);
    display.println(" A");
    display.print(F(" Power: "));
    display.print(milliPower5v / 1000.00, 3);
    display.println(" W");


    display.drawRect(0, 86, 125, 42, SH110X_WHITE);
    display.drawRect(0, 86, 125, 13, SH110X_WHITE);
    display.setCursor(55, 89);
    display.print(F("3.3V"));

    display.setCursor(4, 101);
    display.print(F("Voltage: "));
    display.print(milliVolt3v);
    display.println(" V");
    display.print(F(" Current: "));
    display.print(milliCurent3v / 1000.00, 3);
    display.println(" A");
    display.print(F(" Power: "));
    display.print(milliPower3v / 1000.00, 3);
    display.println(" W");

    display.display();
    prevDisplayDelay = millis();
  }
}

void displaySingle12V() {

  if (millis() - prevDisplayDelay > 1000) {
    display.clearDisplay();
    display.setTextSize(2);
    display.setTextWrap(false);
    display.setTextColor(SH110X_WHITE);
    display.drawRect(0, 0, 125, 125, SH110X_WHITE);
    display.drawRect(0, 0, 125, 33, SH110X_WHITE);
    display.setCursor(45, 10);
    display.print(F("12V"));

    display.setCursor(0, 40);

    //Voltage
    display.print("  ");
    display.print(milliVolt12v / 1000.0, 3);
    display.println(" V");
    display.print("  ");
    display.print(milliCurent12v / 1000.00, 3);
    display.println(" A");
    display.print("  ");
    display.print(milliPower12v / 1000.0, 3);
    display.println(" W");
    display.display();
    prevDisplayDelay = millis();
  }
}

void displaySingle5V() {

  if (millis() - prevDisplayDelay > 1000) {
    display.clearDisplay();
    display.setTextSize(2);
    display.setTextWrap(false);
    display.setTextColor(SH110X_WHITE);
    display.drawRect(0, 0, 125, 125, SH110X_WHITE);
    display.drawRect(0, 0, 125, 32, SH110X_WHITE);
    display.setCursor(48, 10);
    display.print(F("5V"));

    display.setCursor(0, 40);

    //Voltage
    display.print("  ");
    display.print(milliVolt5v, 3);
    display.println(" V");
    display.print("  ");
    display.print(milliCurent5v / 1000.0, 3);
    display.println(" A");
    display.print("  ");
    display.print(milliPower5v / 1000.0, 3);
    display.println(" W");
    display.display();
    prevDisplayDelay = millis();
  }
}

void displaySingle3V() {

  if (millis() - prevDisplayDelay > 1000) {
    display.clearDisplay();
    display.setTextSize(2);
    display.setTextWrap(false);
    display.setTextColor(SH110X_WHITE);
    display.drawRect(0, 0, 125, 125, SH110X_WHITE);
    display.drawRect(0, 0, 125, 33, SH110X_WHITE);
    display.setCursor(43, 10);
    display.print(F("3.3V"));

    display.setCursor(0, 40);

    //Voltage
    display.print("  ");
    display.print(milliVolt3v, 3);
    display.println(" V");
    display.print("  ");
    display.print(milliCurent3v / 1000.00, 3);
    display.println(" A");
    display.print("  ");
    display.print(milliPower3v / 1000.0, 3);


    display.println(" W");
    display.display();
    prevDisplayDelay = millis();
  }
}

void handleDisplayBtn() {

  int dspBtn = digitalRead(DISPLAY_BTN);
  if (dspBtn == LOW && ( millis() - prevDisplayBtnDelay) > 300 && !dspBtnPressed) {

    displaySelection++;

    if (displaySelection == 1) {
      digitalWrite(LED_12V, HIGH);
      digitalWrite(LED_5V, LOW);
      digitalWrite(LED_3_3V, LOW);
    } else if (displaySelection == 2) {
      digitalWrite(LED_12V, LOW);
      digitalWrite(LED_5V, HIGH);
      digitalWrite(LED_3_3V, LOW);
    } else if (displaySelection == 3) {
      digitalWrite(LED_12V, LOW);
      digitalWrite(LED_5V, LOW);
      digitalWrite(LED_3_3V, HIGH);
    } else if (displaySelection > 3) {
      displaySelection = 0;
      digitalWrite(LED_12V, LOW);
      digitalWrite(LED_5V, LOW);
      digitalWrite(LED_3_3V, LOW);
    }

    dspBtnPressed = true;
    prevDisplayBtnDelay = millis();
    prevDisplayDelay = millis() - 1000; // to trigger the display right away


  } else if (dspBtn == HIGH) {
    dspBtnPressed = false;
  }
}

void readValues() {
  milliVolt12v = ina260.readBusVoltage();
  milliCurent12v = ina260.readCurrent();
  milliPower12v = ina260.readPower();

  milliVolt5v = ina219.getBusVoltage_V();
  milliCurent5v = ina219.getCurrent_mA();
  milliPower5v  = ina219.getPower_mW();

  milliVolt3v = ina21933v.getBusVoltage_V();
  milliCurent3v = ina21933v.getCurrent_mA();
  milliPower3v = ina21933v.getPower_mW();
}

void sendSerialValues() {
  Serial.print('<');
  Serial.print(milliVolt12v);
  Serial.print(',');
  Serial.print(milliCurent12v);
  Serial.print(',');
  Serial.print(milliPower12v);
  Serial.print(',');
  Serial.print(milliVolt5v);
  Serial.print(',');
  Serial.print(milliCurent5v);
  Serial.print(',');
  Serial.print(milliPower5v);
  Serial.print(',');
  Serial.print(milliVolt3v);
  Serial.print(',');
  Serial.print(milliCurent3v);
  Serial.print(',');
  Serial.print(milliPower3v);
  Serial.print('>');
}
1 лайк

Прям вот вообще не понял ответ… :thinking:
У дисплеев как минимум разные аппаратные реализации, разные библиотеки… То, что память не перегружена у rp2040 - это понятно. Я не программист, от слова “совсем”, но настойчивый и интересующийся. Хотелось бы получить более понятный ответ на вопрос справиться ли дисплей SH1107 с выводом поступающей на него информации от датчиков тока/напряжения?

Интересная формулировка. Как должно выглядеть “не справился” ?

Компиляция прошла успешно, но после загрузки никакая информация на дисплей не выводится. Чтобы предотвратить обычные в этом случае советы:
-питание на все модули подается;
-сканер I2C выдает адрес дисплея 0Х3С и адреса датчиков тока 0Х40, 0Х41 и 0Х44. Т.е. все электрические соединения в порядке;
-дисплей исправен, при загрузке тестового скетча из библиотеки “Adafruit_SH110X.h” логотип Adafruit, все линии, квадратики и снежинки отображаются нормально.

Прошу не придираться к формулировкам, я достаточно далек от аппаратного устройства OLED дисплеев. Но могу предположить, что, если их такое разнообразие, то и возможности у них должны быть разные. Иначе не было бы смысла их плодить.
На простую замену библиотеки и строки инициализации моих знаний хватило, но, увы, результата не было. Отсюда и предположение, что, возможно, аппаратно SH1107 “слабее”, чем SSD1327

1 лайк

а серийный порт что выводит?

Вот тут везде пишут ssd1327. Неужели обманут?

тебя нет, ты не станешь покупать дисплей за 1000 если можно купить за 200

что конечно? ты мне вывод при работе прошитого девайса покажи, что там?

Каковы критерии оценки “слабости”?

Слабость или сильность тока выражается в амперах. А у дисплеев в чем сила измеряется? Допустим, я напишу что второй сильнее - какую объективную оценку сумеете извлечь из этого утверждения?

На экране картинка и в полном описании указание на ssd1327. Какой смысл обманывать покупателя на такой ерунде?
…ну может модули-дисплеи настолько похожи, что продавец не может их отличить. Как вы сами отличаете?

Хочу, чтобы вы поняли бессмысленность своего вопроса.

Какой смысл обманывать мне тоже не понятно, деньги же через спор приходится возвращать. Отсюда у меня возникло предположение, что дисплеи аналогичные с точки зрения продавца. Хотя разница в цене у них почти в два раза в пользу 1327. Модули действительно похожи, но не настолько, чтобы их перепутать, тем более, что с обратной стороны есть маркировка.
SSD1327

SH1107

Распиновка у них разная, плюс с минусом местами переставлены. Это случайно не пропустили?

вот именно, номер порта мне зачем?

Нет! Написал же, что тестовый скетч от производителя отрабатывается нормально…
Схема соединения верная! Все модули исправные!

Скрин монитора порта

не сканера, а залитого скетча