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

#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 лайк