I am trying connecting I2C OLED SSD1306 and I2C INA219 on ESP32 but without success.
First try:
#include <WiFi.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_INA219.h>
Adafruit_INA219 ina219;
#define SDA1 21 //OLED SSD1306
#define SCL1 22 //OLED SSD1306
#define SDA2 5 //INA219
#define SCL2 4 //INA219
float shuntvoltage = 0;
float busvoltage = 0;
float current_mA = 0;
float current_A = 0;
float loadvoltage = 0;
float power_W = 0;
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET 0
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const char* ssid = "SSID";
const char* password = "PASSWORD";
IPAddress local_IP(192, 168, 0, 241);
IPAddress gateway(192, 168, 0, 230);
IPAddress subnet(255, 255, 255, 0);
IPAddress primaryDNS(8, 8, 8, 8);
IPAddress secondaryDNS(8, 8, 4, 4);
void setup()
{
Serial.begin(115200);
Wire.begin(SDA1, SCL1);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
display.fillScreen(BLACK);
display.setTextColor(WHITE);
display.setTextWrap(false);
startWiFi();
Wire.begin(SDA2, SCL2);
ina219.begin();
display.ssd1306_command(SSD1306_DISPLAYOFF);
delay(5000);
display.ssd1306_command(SSD1306_DISPLAYON);
display.println("Awake!");
display.display();
}
void loop()
{
shuntvoltage = ina219.getShuntVoltage_mV();
busvoltage = ina219.getBusVoltage_V();
current_mA = ina219.getCurrent_mA();
loadvoltage = busvoltage + (shuntvoltage / 1000);
current_A = current_mA / 1000;
power_W = current_A * loadvoltage;
Serial.println("");
Serial.print("Bus Voltage: "); Serial.print(busvoltage); Serial.println(" V");
Serial.print("Shunt Voltage: "); Serial.print(shuntvoltage); Serial.println(" mV");
Serial.print("Load Voltage: "); Serial.print(loadvoltage); Serial.println(" V");
Serial.print("Current: "); Serial.print(current_mA); Serial.println(" mA");
Serial.print("Power: "); Serial.print(power_W); Serial.println(" w");
Serial.println("");
delay(1000);
display.stopscroll();
display.fillScreen(BLACK);
display.invertDisplay(0);
testscrolltext("TESTING"); // Draw scrolling text
}
const char* wl_status_to_string(wl_status_t status) {
switch (status) {
case WL_NO_SHIELD: return "WL_NO_SHIELD";
case WL_IDLE_STATUS: return "WL_IDLE_STATUS";
case WL_NO_SSID_AVAIL: return "WL_NO_SSID_AVAIL";
case WL_SCAN_COMPLETED: return "WL_SCAN_COMPLETED";
case WL_CONNECTED: return "WL_CONNECTED";
case WL_CONNECT_FAILED: return "WL_CONNECT_FAILED";
case WL_CONNECTION_LOST: return "WL_CONNECTION_LOST";
case WL_DISCONNECTED: return "WL_DISCONNECTED";
}
}
void printWifiStatus() {
Serial.println("");
Serial.println("WiFi connected.");
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
Serial.print("Gateway: ");
Serial.println(WiFi.gatewayIP());
Serial.print("Subnet: ");
Serial.println(WiFi.subnetMask());
Serial.print("Primary DNS: ");
Serial.println(primaryDNS);
long rssi = WiFi.RSSI();
Serial.print("signal strength (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
Serial.printf("BSSID: %s\n", WiFi.BSSIDstr().c_str());
Serial.println("Connected to wifi");
}
void startWiFi() { // Start a Wi-Fi access point, and try to connect to some given access points. Then wait for either an AP or STA connection
typedef enum {
WL_NO_SHIELD = 255, // for compatibility with WiFi Shield library
WL_IDLE_STATUS = 0,
WL_NO_SSID_AVAIL = 1,
WL_SCAN_COMPLETED = 2,
WL_CONNECTED = 3,
WL_CONNECT_FAILED = 4,
WL_CONNECTION_LOST = 5,
WL_DISCONNECTED = 6
} wl_status_t;
WiFi.begin(ssid, password);
Serial.print("MAC Address: ");
Serial.println(WiFi.macAddress());
WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS);
WiFi.mode(WIFI_STA);
Serial.println("Connecting Wifi...");
delay(5000);
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
Serial.println("NOT Connected to wifi");
Serial.print("Status: ");
Serial.println(wl_status_to_string(WiFi.status()));
WiFi.begin(ssid, password);
WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS);
WiFi.mode(WIFI_STA);
delay(5000);
ESP.restart();
}
//If connection successful show IP address in serial monitor
Serial.println("Connected to wifi");
printWifiStatus();
}
void testscrolltext(char * text) {
display.clearDisplay();
display.setTextSize(2); // Draw 2X-scale text
display.setTextColor(WHITE);
display.setCursor(10, 0);
display.println(F(text));
display.display(); // Show initial text
delay(100);
// Scroll in various directions, pausing in-between:
display.startscrollright(0x00, 0x0F);
delay(2000);
display.stopscroll();
delay(1000);
display.startscrollleft(0x00, 0x0F);
delay(2000);
display.stopscroll();
delay(1000);
display.startscrolldiagright(0x00, 0x07);
delay(2000);
display.startscrolldiagleft(0x00, 0x07);
delay(2000);
display.stopscroll();
delay(1000);
}
OLED doesn’t work. But INA219 working perfectly.
Second try:
#include <WiFi.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_INA219.h>
Adafruit_INA219 ina219;
#define SDA1 21 //OLED SSD1306
#define SCL1 22 //OLED SSD1306
#define SDA2 5 //INA219
#define SCL2 4 //INA219
TwoWire I2Cone = TwoWire(0);
TwoWire I2Ctwo = TwoWire(1);
float shuntvoltage = 0;
float busvoltage = 0;
float current_mA = 0;
float current_A = 0;
float loadvoltage = 0;
float power_W = 0;
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET 0
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const char* ssid = "SSID";
const char* password = "PASSWORD";
IPAddress local_IP(192, 168, 0, 241);
IPAddress gateway(192, 168, 0, 230);
IPAddress subnet(255, 255, 255, 0);
IPAddress primaryDNS(8, 8, 8, 8);
IPAddress secondaryDNS(8, 8, 4, 4);
void setup()
{
Serial.begin(115200);
I2Cone.begin(SDA1,SCL1,400000);
I2Ctwo.begin(SDA2,SCL2,400000);
I2Cone.beginTransmission(0x3C);
I2Ctwo.beginTransmission(0x40);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
display.fillScreen(BLACK);
display.setTextColor(WHITE);
display.setTextWrap(false);
startWiFi();
ina219.begin();
display.ssd1306_command(SSD1306_DISPLAYOFF);
delay(5000);
display.ssd1306_command(SSD1306_DISPLAYON);
display.println("Awake!");
display.display();
}
void loop()
{
shuntvoltage = ina219.getShuntVoltage_mV();
busvoltage = ina219.getBusVoltage_V();
current_mA = ina219.getCurrent_mA();
loadvoltage = busvoltage + (shuntvoltage / 1000);
current_A = current_mA / 1000;
power_W = current_A * loadvoltage;
Serial.println("");
Serial.print("Bus Voltage: "); Serial.print(busvoltage); Serial.println(" V");
Serial.print("Shunt Voltage: "); Serial.print(shuntvoltage); Serial.println(" mV");
Serial.print("Load Voltage: "); Serial.print(loadvoltage); Serial.println(" V");
Serial.print("Current: "); Serial.print(current_mA); Serial.println(" mA");
Serial.print("Power: "); Serial.print(power_W); Serial.println(" w");
Serial.println("");
delay(1000);
display.stopscroll();
display.fillScreen(BLACK);
display.invertDisplay(0);
testscrolltext("TESTING"); // Draw scrolling text
}
OLED working perfectly. But INA219 doesn’t work.
How to make both OLED SSD1306 and INA219 works simultaneously?
Please help…