Проблемы с подключением I2C на ESP8266 — 12F, какие контакты использовать?

Раньше я подключил датчик температуры/гула HDC1080 к Arduino, используя этот скетч, и все работало нормально. Теперь я хочу запустить его через ESP-12F, я загрузил его, но во время установления соединения I2C возникли проблемы. По сути, я не уверен, действительно ли в конце setup() началось соединение I2C, потому что я получаю это на последовательном мониторе:

serial_monitor

Насколько я вижу, код пропускает все, что связано с библиотекой Wire. Я виню в этом контакты SDA/SCL, но на самом деле ни один из контактов у меня не работает. Я обнаружил, что I2C GPIO по умолчанию — 2 и 14, я попробовал с ними, но не получил результата; позже я попробовал с 12/16, как сказано в прокомментированной строке Wire.begin, но получилось то же самое. Я даже прочитал некоторые возможные решения в этом посте, но у меня даже нет упомянутых библиотек.

Можете ли вы дать мне какое-нибудь предложение, пожалуйста? Это скетч, который я использую:

#include <Wire.h>

#define HDC 0x40 //B1000000 MSB
#define cociente 65536 //2^16

uint16_t humrawvalue;  //Необработанное значение данных, байт MS = valmsb, байт LS = vallsb
uint16_t temrawvalue;  //Необработанное значение данных, байт MS = valmsb, байт LS = vallsb
uint8_t humvalmsb, humvallsb;  //Необработанный 8-битный байт влажности
uint8_t temvalmsb, temvallsb;  //Необработанный 8-битный байт температуры
int incomingByte = 0; //Ввод действия
float humidity, temperature;

void setup() {
  delay(100);
  Serial.begin(9600);
  delay(100);
  Serial.println("Hello");
  //Wire.begin(12,16);
  Wire.begin();
  Wire.setClockStretchLimit(1500);
}

void loop() {
  if (Serial.available() > 0) {    //Пользователь нажимает 1, чтобы начать считывание данных с датчика
    // читаем входящий байт:
    incomingByte = Serial.read();
    yield();
    // скажем, что у вас есть:
    Serial.print("I received: ");
    Serial.println(incomingByte, DEC);
  }

  Serial.println("---g-");  //Просто рекомендация

  if (incomingByte == 49){
    Serial.println("IIIII");  //Просто рекомендация
    Wire.beginTransmission(HDC);
    Wire.write(0x00);
    Wire.endTransmission(true);
    delay(200);

    Wire.requestFrom(HDC,4,true); //Запрашивается 4 байта, по 2 байта на регистр
    if(Wire.available()){
      Serial.println("     ");
      Serial.println("Measuring: ");
      temvalmsb = Wire.read();
      temvallsb = Wire.read();
      humvalmsb = Wire.read();
      humvallsb = Wire.read();

      Serial.println("====TEMPERATURE====");
      Serial.print("MSB: "); Serial.println(temvalmsb, BIN);
      Serial.print("LSB: "); Serial.println(temvallsb, BIN);
      temrawvalue = temvalmsb <<8| temvallsb; //Находит каждый байт на своем месте
      Serial.print("Temp: "); Serial.println(temrawvalue, BIN);
      temperature = ((float)temrawvalue/(float)cociente)*165.0-40.0;
      Serial.print("Temperatura [C]: "); Serial.println(temperature);

      Serial.println("====HUMIDITY====");
      Serial.print("MSB: "); Serial.println(humvalmsb, BIN);
      Serial.print("LSB: "); Serial.println(humvallsb, BIN);
      humrawvalue = humvalmsb <<8| humvallsb;
      Serial.print("Hum: "); Serial.println(humrawvalue, BIN);
      humidity = ((float)humrawvalue/(float)cociente)*100.0;
      Serial.print("Humidity [%]: "); Serial.println(humidity);

      Serial.println("     ");
      delay(3000);
    }
  }
  Serial.println("++++"); //Просто рекомендация
  delay(3000);
}

С уважением!

, 👍2

Обсуждение

2 и 14? я думал, что 4+5 - это аппаратные контакты i2c... если вы не укажете, то это то, что используется, @dandavis

@dandavis, это основная проблема: в каждой таблице данных указана разная информация об I2C. Я только что попробовал использовать 4,5 и протестировать сигнал на прицеле, но разницы нет, я просто получаю сигнал постоянного тока., @Julio

Является ли устройство устройством 5 В?, @Code Gorilla

Обновление: это никогда не работало. ESP-12F все еще работал очень нестабильно, что делало невозможным подключение именно этого датчика. С последовательным протоколом для других устройств микро работало нормально, но при использовании I2C возникли проблемы., @Julio


2 ответа


0

Вы имеете в виду контакты I2C на Arduino? Вы можете просто пропустить Arduino и подключить его напрямую к ESP8266 и в своем коде определить, какие контакты вы используете для I2C, или соответствующим образом изменить библиотеку. Если вы пойдете по этому пути, убедитесь, что вы используете правильный сканер I2C для ESP8266. Его можно найти в этой инструкции, иначе ваш I2C не будет обнаружен.

http://www.instructables.com/id/ESP8266-I2C- Сканер портов и адресов/

Если вы все же придерживаетесь Arduino, убедитесь, что библиотека использует правильный адрес, еще раз проверив с помощью скетча сканера I2C Arduino, чтобы определить, какой адрес I2C она использует.

https://playground.arduino.cc/Main/I2cScanner

,

5

В отличие от большинства Arduino, ESP8266 не имеет аппаратного TWI, поэтому I²C программно урезан. Это означает, что вы можете использовать любые контакты GPIO. По умолчанию Wire.begin() инициализирует контакты 4 (SDA) и 5 (SCL), но вы можете указать другие контакты, используя Wire.begin(int sda, int scl).

Документация

(Примечание: в таблице данных GPIO2 указан как SDA, а GPIO14 как SCL, но это не имеет значения, AFAIK, это всего лишь соглашение.)

,

Провод не работает на ESP8266. См. проблему с GitHub: https://github.com/esp8266/Arduino/issues/3046., @S. Imp