Conexión I2C Arduino Nano to Nodemcu esp8266

Buenas tardes.

Estoy trabajando en un proyecto e intentado conectar un Arduino Nano con un Nodemcu esp8266.

He visto que puedo hacer una conexión Master to Master entre los dos. El mensaje que envía el Nodemcu, lo recibo bien en el Arduino, el problema viene en el sentido contrario que no recibe mensajes.

¿Podría ser devido a la frecuencia a la que trabajan cada uno de ellos?

¿Como podría solucionarlo y que la comunicación fuese bidirecional?

Muchas gracias.

¿ Donde ha visto tal cosa?, ponga un LINK por favor. En un bus I2c solo puede haber un maestro.

@gonpezzi Perdón que te contradiga.
Puede haber más de un maestro, solo que no puede haber más de una placa en ese rol en el mismo momento.

@antonio_lopezz1 si subes tu código podríamos decirte algo más, adivinar se vuelve complicado.
Por otro lado, te recomiendo que leas
https://www.gammon.com.au/i2c

Saludos

Pues claro, si mediante codigo cambiamos las mcu de maestro a esclavo y viceversa podemos hacer los que queramos, pero en un mismo instante determinado solo puede existir un maestro. el modo Maestro-Maestro es imposible.

Es que es más un tema semántico, claramente no es comunicación "maestro-maestro" pero ambas placas son maestros y esclavos a la vez, ambas tienen código de maestro y de esclavo, el asunto pasa por quien interroga primero y por ende toma el control del bus. :wink:

Totalmente en acuerdo.

Gracias por contestarme y ayudarme con este tema, @gonpezzi y @anon90500195.

Lo que pretendo es que el Esp8266 mande un flag al Arduino nano y ejecute una function. Cuando este termine, se lo comunique al Esp8266.

Esp8266 --> Arduino Nano --> Function --> Aruino Nano --> Esp8266.

Para ello he visto este "tutorial":

Pero viendo vuestros comentarios, no se como hacer que solo uno tenga el rol de "master" en cada momento.

Me podeis ayudar con ello???

¿El Esp8266 con el flag manda algun dato al nano para que este lo procese en su funcion? y al contrario, ¿el nano devuelve algún dato calculado o simplemente avisa que ha terminado su funcion con otro flag?

@gonpezzi, Del Esp8266 al Arduino Nano, quiera pasarle un json (entiendo que tendría que ser un string) y luego en el Arduino formar el json y procesarlo para ejecutar la function.

La llamada entre el Arduino Nano y el Esp8266 me valdría con un bool indicando que ha terminado de ejecutarse.

Muchas gracias.

Momento. Y como tienes comunicados eléctricamente Arduino y ESP?
Adaptador de niveles de qué tipo. Directo no puede ser.

Esto es lo minimo que deberías usar.
image

@Surbyte Lo he probado directo por medio de los pins D1, D2 y A4, A5.

Entre Esp8266 manda el mensaje y lo recibe el Arduino nano, pero no en el sentido contrario.

Es posible que no lo este haciendo bien, no tengo muchos conocimientos con Arduino y electrónica.

No puedes comunicarte directamente entre Arduino y ESP porque los ESP son de 3.3V y cuando recibe datos puedes quemar el GPIO que estas usando.
Asi que detente y busca un adaptador de niveles o hazlo como te acabo de mencionar.
Todo o que va desde ESP a Arduino esta bien porque en la lógica digital 3.3V esta dentro de la tensión mínima (en realidad por encima de ella) que tolera para ser reconocido un nivel alto.
Pero al revés, o sea cuando el Arduino le envia un HIGH al ESP, éste no tolera 5V o digamos 4.8 por dar un valor, y su GPIO corre el riesgo de dañarse como entrada.
Entonces hay adaptadores de nivel comerciales o puedes hacerlos con el esquema que te pasé.
La opcion divisor de tensión no es valida porque tienes un sistema bidireccional.
Esto es lo mismo que yo te pasé pero que esta a la venta

Modulo Adaptador Conversor Nivel Logico 5v 3.3v 4canales I2c

Resuelve esto antes de continuar con las pruebas porque solo te llevarán a un camino sin retorno desde mi punto de vista.
Primero se debe tener todo bien configurado electrica/electrónicamente y luego se pasa al software.

Muchas gracias @Surbyte.

Y como tendría que hacer las conexiones entre el Arduino, convertido de señal y Esp8266???

Conectaria así:

Arduino --> D1 --> HV1
Arduino --> D2 --> HV2
Arduino --> GND --> GND

Esp8266 --> A5 --> LV1
Esp8266 --> A4 --> Lv2
ESP8266 --> GND --> GND

Sería así correcto???

Te faltan dos:
Arduino -->5V-->HV
Esp8266 --> 3.3V --> LV

Gracias, ya he pedido un Conversor, grabe error por mi parte.

Por otro lado, con relación al código de los dos masters, como se tendría hacer. Hago la comunicación en un sentido y finalizo la transmisión (Wire.endTransmission()) y luego se haría la transmisión en el otro sentido???

En el post #3 te dejé un link, ¿al menos lo miraste?
Yo creo que no sino no harías esta pregunta.