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.
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.