Я использую ESP32-SIM800L с GPRS / MS5803-14BA / BME280 / SH1106 OLED
Настройка модема и датчика (с использованием TwoWire) следующая (только соответствующие выдержки):
#include <Wire.h>
...
#define I2C_SDA 21
#define I2C_SCL 22
#define I2C_SDA_2 18
#define I2C_SCL_2 19
...
#include <SparkFun_MS5803_I2C.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include "SH1106Wire.h"
TwoWire I2CPower = TwoWire(0);
TwoWire I2CMS = TwoWire(1); // I2C bus for MS5803 @ 0x77
TwoWire I2CBME = TwoWire(1); // I2C bus for BME280 @ 0x76
TwoWire I2CSH = TwoWire(1); // I2C bus for SH1106 OLED @ 0x3c
MS5803 sensor(ADDRESS_LOW); // default is ADDRESS_HIGH = 0x76 // ADDRESS_LOW = 0x77
Adafruit_BME280 bme;
SH1106Wire display(0x3c, I2C_SDA_2, I2C_SCL_2);
...
void setup() {
...
I2CPower.begin(I2C_SDA, I2C_SCL, 400000); // start I2C bus No. 1 for SIM800L
I2CMS.begin(I2C_SDA_2, I2C_SCL_2, 400000); // start I2C bus No. 2 for MS5803
I2CBME.begin(I2C_SDA_2, I2C_SCL_2, 400000); // start I2C bus No. 2 for BME280
I2CSH.begin(I2C_SDA_2, I2C_SCL_2, 400000); // start I2C bus No. 2 for SH1106 OLED
...
// Init BME280 @ 0x76
if (!bme.begin(0x76, &I2CBME)) {
Serial.println("No valid BME280 sensor @ 0x76, check wiring!");
} else {
Serial.println("BME280 @ 0x76 : Ok");
}
// Init MS5803 @ 0x77
sensor.reset();
delay(500);
//sensor.begin();
//delay(500);
if (!sensor.begin()) {
Serial.println("No valid MS5803 sensor @ 0x77");
} else {
Serial.println("MS5803 @ 0x77 : Ok");
}
// Init SH1106 OLED @ 0x3c
display.init();
Serial.println("SH1106 OLED @ 0x3c : SCREEN CHECK");
display.flipScreenVertically();
display.setFont(ArialMT_Plain_16);
display.setTextAlignment(TEXT_ALIGN_LEFT);
display.drawString(0,0,"SCREEN ON");
display.display();
...
} // End void setup()
void loop() {
read sensors and report & etc. ...
}
Модем, BME280 и SH1106 OLED обнаружены и работают, однако MS5803 не обнаружен.
Нет конфликтов адресов I2 C (0x76,0x33,0x77 соответственно).
Создание объекта или инициализация BME280 и SH1106 OL допускают явное назначение выводов SDA / SCL:
SH1106Wire display(0x3c, I2C_SDA_2, I2C_SCL_2);
...
bme.begin(0x76, &I2CBME)
, однако создание объекта MS5803 и его инициализация не предусмотрены для этого:
MS5803 sensor(ADDRESS_LOW);
...
sensor.begin();
Попытка ввести явные номера контактов или ссылку на его объект TwoWire в этих выражениях приводит к предупреждению об ошибке, что нет такой функции, позволяющей такое назначение.
В основном, если модем, BME280 и SH1106 OLED не используются, а TwoWire не требуется и не вызывается, тогда MS5803 отлично работает без назначения контактов с использованием контактов I2 C по умолчанию (которые для m y ESP32Sim800L - 21/22). Проблема в том, чтобы попытаться подключить датчик ко второму проводу I2 C, c.
Может ли кто-нибудь объяснить, как использовать MS5803 с TwoWire? Посмотрев на GitHub в Sparkfun .h &. cpp, я не вижу ни одного, ни того, как явно установить контакты SDA / SCL. Есть способ. Приветствуются любые указатели.