Доброго дня, уважаемые форумчане!
Прошу помощи в выяснении совместимости (взаимозаменяемости) указанных в теме дисплеев. Суть проблемы такова: Есть реализованный мной проект блока питания. В какой-то “несчастный” момент дисплей на контроллере 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?