Hola a todos, hoy necesito alguna orientación sobre I2C.
Necesito comunicar 2 NodeMCU por I2C, en teoría sencillo, pero no lo consigo. Y no encuentro ningún proyecto que se haya implementado, ni comentarios al respecto sobre NodeMCU <-> NodeMCU. Debería ser aún más sencillo (en cuanto a la electrónica) que de NodeMCU a UNO al tener el mismo voltaje.
El que tengo como Master parece que envía la información, pero el Slave nunca activa la función de recepción. He probado con y sin resistencias de Pull-UP y de 1K y 4,7K.
¿Alguna idea o experiencia reveladora?
El código con el que estoy probando es de la página de Luis Llamas, con un añadido para que parpadee el led y ver que están en ejecución ambas placas.
Master:
#include "Wire.h"
const byte I2C_SLAVE_ADDR = 0x20;
long data = 100;
long response = 0;
long parpadeo;
long envio;
boolean On;
void setup()
{
Serial.begin(115200);
Wire.begin();
pinMode(D4, OUTPUT);
}
void loop()
{
if (millis() > parpadeo + 300) {
parpadeo=millis();
if (On) {
digitalWrite(D4, HIGH);
On=!On;
}
else {
digitalWrite(D4, LOW);
On=!On;
}
}
if (millis() > envio + 2000) {
envio=millis();
sendToSlave();
requestToSlave();
}
}
void sendToSlave()
{
Wire.beginTransmission(I2C_SLAVE_ADDR);
Wire.write((byte*)&data, sizeof(data));
Wire.endTransmission();
Serial.println("Enviamos Datos");
}
void requestToSlave()
{
response = 0;
Wire.requestFrom(I2C_SLAVE_ADDR, sizeof(response));
uint8_t index = 0;
byte* pointer = (byte*)&response;
while (Wire.available())
{
*(pointer + index) = (byte)Wire.read();
index++;
}
Serial.print("Respuesta: ");
Serial.println(response);
}
Slave:
//led D4 GPIO2
#include "Wire.h"
const byte I2C_SLAVE_ADDR = 0x20;
void setup()
{
Serial.begin(115200);
Wire.begin(I2C_SLAVE_ADDR);
Wire.onReceive(receiveEvent);
Wire.onRequest(requestEvent);
pinMode(D4, OUTPUT);
}
long data = 0;
long response = 200;
long parpadeo;
boolean On;
void receiveEvent(int bytes)
{
data = 0;
uint8_t index = 0;
while (Wire.available())
{
byte* pointer = (byte*)&data;
*(pointer + index) = (byte)Wire.read();
index++;
}
Serial.print("Recibimos datos: ");
Serial.println(data);
digitalWrite(D4, HIGH);
delay(1000);
digitalWrite(D4, LOW);
}
void requestEvent()
{
Wire.write((byte*)&response, sizeof(response));
Serial.print("Respondemos. Datos: ");
Serial.println(response);
digitalWrite(D4, HIGH);
delay(1000);
digitalWrite(D4, LOW);
}
void loop() {
if (millis() > parpadeo + 300) {
Serial.println("Estamos esperando");
parpadeo=millis();
if (On) {
digitalWrite(D4, HIGH);
On=!On;
}
else {
digitalWrite(D4, LOW);
On=!On;
}
}
if (data != 0)
{
Serial.println(data);
data = 0;
}
}
La protoboard, por si aporta algo:
Gracias de antemano por su atención.