esp8266-01 и Arduino UNO обмен данными через i2c

Я не могу обмениваться данными через i2c с моим esp-01 в качестве ведущего устройства и UNO в качестве ведомого устройства. я получаю специальные символы, отправляемые обратно в esp, но мой esp отправляет правильно... выход на моем esp-01 выход на моем esp-01 вывод на моем UNO вывод на моем UNO

Подключения: esp-01 gpio-0 к uno A4 и gpio-2 к uno A5. это потому, что я не использую переключатель уровня или какая-то ошибка в моем коде?

вот мой мастер-код esp

#include <Wire.h>
#define I2CAddressESPWifi 6
int x=32;

void setup()
{
  Serial.begin(115200);
  Wire.begin(0,2);//Измените на Wire.begin() для не ESP.
}

void loop()
{
  Wire.beginTransmission(I2CAddressESPWifi);
  Wire.write(x);
  Wire.endTransmission();
  x++;
  delay(1);//Обязательно. Не знаю почему!

  Wire.requestFrom(I2CAddressESPWifi,10);
  Serial.print("Request Return:[");
  while (Wire.available())
  {
    delay(100);
    char c = Wire.read();
    Serial.print(c);
  }
  Serial.println("]");
  delay(500);
}

а вот мой подчиненный код Uno

#include <Wire.h>
#define I2CAddressESPWifi 6

void setup()
{
  Serial.begin(115200);
  Wire.begin(I2CAddressESPWifi);
  Wire.onReceive(espWifiReceiveEvent);
  Wire.onRequest(espWifiRequestEvent);
}

void loop()
{
  delay(1);
}

void espWifiReceiveEvent(int count)
{
  Serial.print("Received[");
  while (Wire.available())
  {
    char c = Wire.read();
    Serial.print(c);
  }
  Serial.println("]");
}

void espWifiRequestEvent()
{
  String ts = getTime();
  Serial.print("Sending:[");
  Serial.print(ts.c_str());
  Serial.println("]");
  Wire.write(ts.c_str());
}

String getTime(){
  int sec = millis() / 1000;
  int min = sec / 60;
  int hr = min / 60;
  String ts = "U:";
  if (hr<10) ts+="0";
  ts += hr;
  ts +=":";
  if ((min%60)<10) ts+="0";
  ts += min % 60;
  ts +=":";
  if ((sec%60)<10) ts+="0";
  ts += sec % 60;
  return(ts);
}

, 👍0

Обсуждение

Подтягивающие резисторы?, @Mikael Patel

нет... зачем мне это? и между чем?, @Vallabh Rao

Попробуйте выбрать адрес, который не зарезервирован для специальных целей. Тот, который находится между 8 и 119 включительно., @Majenko

Я попробовал 15, это не имело никакого значения... :(, @Vallabh Rao

Подтягивающие резисторы на шине I2C (SDA, SCK) необходимы, если они не предусмотрены на плате. Проверьте спецификацию I2C., @Mikael Patel


1 ответ


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

0

Возможно, Serial.print() в функции события запроса подчиненного устройства вызывают слишком большую задержку (растяжение часов?). Вам следует сделать Wire.write() вторым оператором в этой функции сразу после вызова getTime. Или вы можете использовать Wire.write("Hello") как единственный оператор в функции, чтобы сузить круг проблем.

,