ESP, IoT Как подключить ina219 ко второй шине I2C? esp32

Pavel K.

✩✩✩✩✩✩✩
14 Апр 2022
3
0
Здравствуйте, есть нужда подключить ina219 и Lan8720 к esp32. Проблема в том, что они подключаются по шине i2c и отказываются работать вместе.
lan8720 постоянно пишет коннект..... дисконнект.....
Нашел статью, где подключают 2 устройства i2c на разные шины.
Код из примера:


C++:
#include <Wire.h>

#include <Adafruit_Sensor.h>

#include <Adafruit_BME280.h>



#define SDA_2 33

#define SCL_2 32



Adafruit_BME280 bme1;

Adafruit_BME280 bme2;



void setup() {

  Serial.begin(115200);

  Serial.println(F("BME280 test"));



  Wire.begin();

  Wire1.begin(SDA_2, SCL_2);



  bool status1 = bme1.begin(0x76);

  if (!status1) {

    Serial.println("Could not find a valid BME280_1 sensor, check wiring!");

    while (1);

  }



  bool status2 = bme2.begin(0x76, &Wire1);

  if (!status2) {

    Serial.println("Could not find a valid BME280_2 sensor, check wiring!");

    while (1);

  }



  Serial.println();

}



void loop() {



  Serial.print("Temperature from BME1= ");

  Serial.print(bme1.readTemperature());

  Serial.println(" *C");



  Serial.print("Humidity from BME1 = ");

  Serial.print(bme1.readHumidity());

  Serial.println(" %");



  Serial.print("Pressure from BME1 = ");

  Serial.print(bme1.readPressure() / 100.0F);

  Serial.println(" hPa");



  Serial.println("--------------------");





  Serial.print("Temperature from BME2 = ");

  Serial.print(bme2.readTemperature());

  Serial.println(" *C");



  Serial.print("Humidity from BME2 = ");

  Serial.print(bme2.readHumidity());

  Serial.println(" %");



  Serial.print("Pressure from BME2 = ");

  Serial.print(bme2.readPressure() / 100.0F);

  Serial.println(" hPa");



  Serial.println("--------------------");

  delay(5000);

}
источник: http://digitrode.ru/computing-devices/mcu_cpu/2297-esp32-i-interfeys-i2c.html

пытаюсь сделать аналогично, но получаю ошибку:
no matching function for call to 'Adafruit_INA219::begin(int, TwoWire&)'

C++:
#include <Wire.h>
#include <Adafruit_INA219.h>

#define SDA_2 33
#define SCL_2 32
Adafruit_INA219 ina219;

uint32_t myTimer1 = 0;
void setup() {
  Serial.begin(115200);
  uint32_t currentFrequency;

  Wire1.begin(SDA_2, SCL_2);
  ina219.begin(0x44, Wire1);

}

void loop() {

  if (millis() - myTimer1 >= 5000) {
  
        float shuntvoltage = 0;     // Создаем переменную shuntvoltage
  float busvoltage = 0;       // Создаем переменную busvoltage
  float current_mA = 0;       // Создаем переменную current_mA
  float loadvoltage = 0;      // Создаем переменную loadvoltage
  float power_mW = 0;         // Создаем переменную power_mW

  shuntvoltage = ina219.getShuntVoltage_mV();       // Получение напряжение на шунте
  busvoltage = ina219.getBusVoltage_V();            // Получение значение напряжения V
  current_mA = ina219.getCurrent_mA();              // Получение значение тока в мА
  power_mW = ina219.getPower_mW();                  // Получение значение мощности
  loadvoltage = busvoltage + (shuntvoltage / 1000); // Расчет напряжение на нагрузки

  // Поочередно отправляем полученные значение в последовательный порт.
  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_mW); Serial.println(" mW");
  Serial.println("");
    myTimer1 = millis();
  }
в идеале бы заставить ina219 работать по другой шине с библиотекой GyverINA, а то в Adafruit_INA219 мало функционала.
Помогите пожалуйста, идеи совсем закончились:(
 
Изменено:

Pavel K.

✩✩✩✩✩✩✩
14 Апр 2022
3
0
Решено!
В библиотеке GyverINA, в файле INA219.h нужно изменить одну строчку.


C++:
// Инициализация и проверка
    bool begin(void) {
        Wire.begin();                           // Инициализация шины I2c
        if (!testConnection()) return false;    // Проверка присутствия
        calibrate();                            // расчёт калибровочного значения и инициализация
        return true;                            // Вернуть true если все ок
    }
на
// Инициализация и проверка
    bool begin(void) {
        Wire.begin(33, 32);                     // Инициализация шины I2c (SDA 33, SCL 32)
        if (!testConnection()) return false;    // Проверка присутствия
        calibrate();                            // расчёт калибровочного значения и инициализация
        return true;                            // Вернуть true если все ок
    }

Теперь Lan8720 работает на стандартных портах (21, 22).
А INA219 подключена к портам (33, 32).

Все работает:) 3 часа - полет нормальный:)
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,837
592
44
Весьма странно. На одну шину I2C можно вешать несколько устройств, для того она и создавалась. Видать, библиотеки не умеют так работать, либо что то не так подключаете.