Pedir y responder datos por I2C

El maestro pide un dato al esclavo y el esclavo responde, en lugar de enviarlo sin que se lo pidan.

Nivel: intermedioi2ccomunicacionredes

Qué vas a construir

Un esclavo que lee un potenciómetro y guarda el valor. Un maestro que le pide ese valor cada segundo y lo muestra en su monitor serial.

Lo que aprendes

  • La diferencia entre que el maestro envíe y que el maestro pida.
  • Cómo usar requestFrom() para leer datos de otro dispositivo.
  • Cómo responder automáticamente con onRequest().
  • Por qué el esclavo no envía nada hasta que lo llaman.

Idea clave

En Comunicación I2C entre dos Arduinos, el maestro decidía qué enviar. En las redes reales, muchas veces es al revés: un equipo central pide datos a sus sensores. El esclavo tiene el dato listo y solo responde cuando lo piden.

Materiales en Tinkercad

  • Dos Arduino Uno R3
  • Potenciómetro de 10 kΩ en el esclavo
  • Cables

Paso 1: Conecta el potenciómetro al esclavo

  • Un extremo a 5V.
  • El cursor a A0.
  • El otro extremo a GND.

El bus I2C se queda igual que en Comunicación I2C entre dos Arduinos: A4 con A4, A5 con A5 y GND con GND.

Paso 2: Código del esclavo

#include <Wire.h>

int valor = 0;

void setup() {
  Wire.begin(8);
  Wire.onRequest(responder);     // se ejecuta cuando el maestro pide datos
}

void loop() {
  valor = analogRead(A0) / 4;    // convierte 0-1023 a 0-255
  delay(100);
}

void responder() {
  Wire.write(valor);             // envía el último valor leído
}

El esclavo actualiza valor en loop(), pero no envía nada en ese momento. Solo responde en responder(), cuando el maestro lo pide.

Paso 3: Código del maestro

#include <Wire.h>

void setup() {
  Wire.begin();
  Serial.begin(9600);
}

void loop() {
  Wire.requestFrom(8, 1);        // pide 1 byte al esclavo 8
  if (Wire.available()) {
    int valor = Wire.read();
    Serial.print("Valor del esclavo: ");
    Serial.println(valor);
  }
  delay(1000);
}

Paso 4: Ejecuta la simulación

Gira el potenciómetro del esclavo y observa el monitor serial del maestro. Los valores deben cambiar al girar.

Cómo sabes que lo lograste

  • El maestro muestra un número entre 0 y 255.
  • Al girar el potenciómetro, el número del maestro cambia.
  • Puedes explicar por qué el esclavo no envía datos fuera de responder().

Qué salió mal

El maestro siempre muestra 0 o no muestra nada. Revisa que el esclavo tenga Wire.onRequest(responder) en setup().

El valor no cambia al girar. Confirma que el cursor del potenciómetro está en A0 y que el esclavo está en loop() leyendo ese pin.

Siguiente clase

En la siguiente clase vas a conectar dos esclavos al mismo bus y a pedirle datos a cada uno por su dirección.