Как выбрать альтернативные контакты I2C на ESP32?

Я новичок в Arduino, и это может быть основной вопрос, но я столкнулся с проблемой.

Я использую датчик HTU21D с ESP32. Этот датчик использует связь I2C. Внутри библиотеки Arduino есть эта функция, чтобы начать собирать данные:

//Start I2C communication
void HTU21D::begin(TwoWire &wirePort)
{
  _i2cPort = &wirePort; //Какой порт пользователь хочет, чтобы мы использовали

  _i2cPort->begin();
}

Как видите, мы можем задать в этой функции, какой порт мы хотим использовать. Идеальный. Но моя проблема в том, что я не знаю, как использовать тип TwoWire. Я проверил кое-какую документацию, но так и не смог найти решение. Я хочу использовать GPIO_16 как SDA и GPIO_17 как SCL. Поэтому я попробовал что-то подобное безрезультатно: htu21d.begin(Wire(16, 17));

Как установить вывод SDA и SCL в двухпроводном типе ? (в моем случае GPIO_16 и GPIO_17)

, 👍8

Обсуждение

вы пробовали htu21d.begin(Wire);? Wire - это объект, экземпляр класса TwoWire. он определяется в Wire.h в конце, @Juraj

Но как мне сказать Wire, что я хочу использовать pin 16 как SDA и pin 17 как SCL ?, @Gazouu

нашел это void TwoWire::begin(int sdaPin, int sclPin, uint32_t frequency) здесь https://github.com/espressif/arduino-esp32/blob/master/libraries/Wire/src/Wire.cpp#L49-L63, @jsotola

вы звоните по проводу., @Juraj


2 ответа


Лучший ответ:

7

Я смог решить свою проблему благодаря комментарию Юрая. Я так и сделал :

Wire.begin(16, 17);
htu21d.begin(Wire);
,

у меня тоже получилось, спасибо, Wire.begin(SDA, SCK); для библиотеки ssd1306 для oled ., @alireza

Некоторые контакты ESP32 не поддерживают SPI. Вы можете использовать контакты 11,12,13,18,23,24,25,26,29 и 30 только как SDA или SCK., @Georgi Peev


2

Вот пример того, как вы можете изменить контакты esp8266 i2c. Я использовал его для своих ESP8266 и bme280, но то же самое для Arduino и других датчиков.

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

void setup() {
  Wire.pins(12,2); //новые контакты SDA SCL (D6 и D4 для esp8266)

  Serial.begin(115200);
  delay(100);

  bme.begin(0x76, &Wire); //вот адрес моего bme280 и экземпляра объекта TwoWire
} 

Для моего ESP8266 я попытался использовать GPIO0 для SDA и GPIO2 для SCL, но безуспешно. Вероятно, потому, что GPIO0-это флэш-пин. Мне помогло изменение SDA на GPIO12 (или D6 pin).

,