ARDUINO INA 226 Oled 128x32

Craftim

✩✩✩✩✩✩✩
4 Окт 2019
14
1
Здравствуйте господа! Пыжусь, обучаюсь тут... Пытаюсь подружить сабж, INA226 и oled 128x32 пользуясь батькиными библиотеками. Отдельно все работает)) INA выдает показания в монитор порта, а на дисплей всякий текст, но при попытке вывести показания ina на дисплей, сталкиваюсь с проблемками... скетч компилируется, загружается без ошибок, но на дисплей кроме приветственного текста ничего не выводится...

#include <GyverINA.h>
#include <GyverOLED.h>
/*
Внимание!!! Пределы измерения напряжения шунта у INA226 = +/- 81.92 мВ
При использовании модуля INA226 с шунтом 0.1 Ом макс. измеряемый ток будет I ~ 820 мА
При использовании другого шунта, рекомендуется рассчитать его так, чтобы падение напряжения не превышало 82мВ!
Пример:
Макс. ожидаемый ток = 5 A
Предел падения напряжения на шунте = 80 мВ
R шунта = 0.08 В / 5 А = 0,016 Ом
Шунт должен иметь сопротивление 0.016 Ом (160 мОм)
*/
// Создаем обьект: INA226 ina(Сопротивление шунта, Макс. ожидаемый ток, I2c адрес);
// INA226 ina(0x41); // Стандартные настройки для модуля, но измененный адрес
// INA226 ina(0.05f); // Стандартный адрес и макс. ток, но другой шунт (0.05 Ом)
// INA226 ina(0.05f, 1.5f); // Стандартный адрес, но другой шунт (0.05 Ом) и макс. ожидаемый ток (1.5 А)
// INA226 ina(0.05f, 1.5f, 0x41); // Полностью настраиваемый вариант, ручное указание параметров
INA226 ina; // Стандартный набор параметров для Arduino модуля (0.1, 0.8, 0x40)
GyverOLED<SSD1306_128x32, OLED_BUFFER> oled;
void setup() {
// Открываем последовательный порт
Serial.begin(115200);
oled.init();
oled.clear();
oled.update();
oled.home();
oled.setScale(2);
oled.println("Проба ");
oled.setCursor(5, 2);
oled.println("вольтметра");
oled.update();
delay(2000);
oled.clear();
oled.update();
Serial.print(F("INA226..."));
// Проверяем наличие и инициализируем INA226
if (ina.begin()) {
Serial.println(F("connected!"));

} else {
Serial.println(F("not found!"));

while (1);
}
// Можно веревести в режим сна, вызвав .sleep с аргументом true, чтобы разбудить - вызываем повторно с указанием false
// ina.sleep(true); // Усыпить INA226
// ina.sleep(false); // Разбудить INA226
// INA226 имеет возможность встроенной калибровки измерения тока, при помощи специального калибровочного значения
// После запуска библиотека автоматически рассчитает и запишет калибровочное значение на основе введенных данных
// Полученное значение можно прочитать, используя метод .getCalibration(); для изменения и/или сохранения в EEPROM
Serial.print(F("Calibration value: ")); Serial.println(ina.getCalibration());
// Далее полученное значение можно изменять для подстройки под реальное сопротивление шунта и сохранять в EEPROM
// Чтобы записать калибровочное значение в INA226 существует метод .setCalibration(value);
// ina.setCalibration(ina.getCalibration() + 10); // Прочитать-модифицировать-записать калибровочное значение
// Так же, можно использовать метод .adjCalibration(offset); для подстройки калибровки без непосредственного чтения
// ina.adjCalibration(10); // Увеличить калибровочное значение на 10
// ina.adjCalibration(-20); // Уменьшить калибровочное значение на 20
// Можно хранить в EEPROM и загружать в INA226 именно смещение калибровки вместо непосредственного значения
// Для повышения помехозащищенности INA226 имеет возможность настроить время выборки напряжения и тока
// INA226 будет захватывать "кусок" сигнала выбранной продолжительности, что повысит точность на шумном сигнале
// По умолчанию выборка занимает 1100 мкс, но может быть изменена методом .setSampleTime(канал, время);
// Варианты времени выборки см. в таблице (файл INA226.h)
ina.setSampleTime(INA226_VBUS, INA226_CONV_2116US); // Повысим время выборки напряжения вдвое
ina.setSampleTime(INA226_VSHUNT, INA226_CONV_8244US); // Повысим время выборки тока в 8 раз
// Так же имеется возможность использовать встроенное усреднение выборок
// Усреднение применяется и для напряжения и для тока и пропорционально увеличивает время оцифровки
// Рекомендуется на шумной нагрузке, устанавливается методом .setAveraging(кол-во усреднений) (см. таблицу в INA226.h)
ina.setAveraging(INA226_AVG_X4); // Включим встроенное 4х кратное усреднение, по умолчанию усреднения нет
Serial.println("");
}
void loop() {
// Читаем напряжение
Serial.print(F("Voltage: "));
Serial.print(ina.getVoltage(), 3);
Serial.println(F(" V"));
// Читаем ток
Serial.print(F("Current: "));
Serial.print(ina.getCurrent(), 3);
Serial.println(F(" A"));
// Читаем мощность
Serial.print(F("Power: "));
Serial.print(ina.getPower(), 3);
Serial.println(F(" W"));
// Читаем напряжение на шунте
Serial.print(F("Shunt voltage: "));
Serial.print(ina.getShuntVoltage(), 6);
Serial.println(F(" V"));
Serial.println("");
oled.clear();
oled.update();
char data1[] = "V:";
char data2[] = "A:";
oled.home();
oled.print(data1);
oled.println(ina.getVoltage());
oled.print(data2);
oled.println(ina.getCurrent());
oled.update();
delay(1000);
}

Пробовал getVoltage и остальных во float поместить, либо ошибки, либо если дальше под спойлером - ошибок нет, но и не работает...
oled.clear();
oled.update();
char data1[] = "V:";
char data2[] = "A:";
float vol = ina.getVoltage();
float amp = ina.getCurrent();
oled.home();
oled.print(data1);
oled.println(vol);
oled.print(data2);
oled.println(amp);
oled.update();

Плата esp32 wroom, но тут думаю пофигу какая плата... Товарищи Гуру, направьте на путь истинный пожалуйста!
 

Craftim

✩✩✩✩✩✩✩
4 Окт 2019
14
1
Премного благодарен! Я когда писал пост, думал ща куча тухлых помидоров полетит...
Ушел в изучение темы, но хотел бы попросить по возможности поправить мой код или продемонстрировать аналогичную подходящую конструкцию. Чтоб и маны покурил и сравнил как надо в итоге сделать. Вариантов исполнения как понимаю более, чем один...
 

Alex_HF

★✩✩✩✩✩✩
11 Мар 2023
40
16
C++:
void loop() {
    // Читаем напряжение и переводим в строку
    String VoltageString = String(ina.getVoltage(), 3);

    Serial.print(F("Voltage: "));
    Serial.print(VoltageString);
    Serial.println(F(" V"));

    oled.clear();
    oled.home();
    oled.print("V:");
    oled.print(VoltageString);

    oled.update();
    delay(1000);
}
PS: Мне кажется у вас не работает из-за println: oled.println(ina.getVoltage()); - надо просто print() в случае с этой библиотекой дисплея
т.к. в примерах посмотрел - все там автоматически конвертируется, как и в случае с Serial - см. строки 20, 22
C++:
#include <GyverOLED.h>
GyverOLED<SSD1306_128x64, OLED_NO_BUFFER> oled;

void setup() {
  oled.init();        // инициализация
  oled.clear();       // очистка
  oled.setScale(3);   // масштаб текста (1..4)
  oled.home();        // курсор в 0,0
  oled.print("Привет!");

  delay(1000);

  oled.setScale(1);
  // курсор на начало 3 строки
  oled.setCursor(0, 3);
  oled.print("GyverOLED v1.3.2");

  // курсор на (20, 50)
  oled.setCursorXY(20, 50);
  float pi = 3.14;
  oled.print("PI = ");
  oled.print(pi);
}
void loop() {
}
 
Изменено: