scanner-i2c.ino
Before llorar sobre una pantalla LCD muda, escanea el bus: este programa consulta las 112 direcciones I2C del Nano (pines A4/A5) y lista lo que responde. Destapa la dirección 0x3F de un PCF8574 mal documentado igual que un cable SDA/SCL invertido.
Hardware
Un Arduino Nano clásico (ATmega328P a 16 MHz, formato DIL de 30 patillas para breadboard, USB mini-B, lógica de 5 V, pin RESET abajo a la izquierda). Arduino Nano, periférico I2C conectado (LCD, BME280, PCF8574...); pull-up de 4,7 kΩ si el bus es casero.
Cableado
SDA→A4, SCL→A5, VCC/GND según módulo. Los módulos comerciales ya traen los pull-up.
Funcionamiento
endTransmission() devuelve 0 cuando vuelve un ACK de la dirección probada. Las direcciones fuera de rango (0x00-0x07, 0x78+) están reservadas y no se prueban.
Ejecución
En el IDE de Arduino, selecciona la placa Arduino Nano y el procesador ATmega328P, elige el puerto serie y carga. El rail de 5 V de la placa conviene a sensores de 5 V; si no, usa 3,3 V en pines compatibles.
Variantes
Guarda este sketch como atajo: cada pantalla o sensor I2C nuevo merece su escáner antes de cualquier código de aplicación.
scanner-i2c.ino
// Scanner le bus I2C (A4=SDA, A5=SCL) : affiche chaque repondant.
// Indispensable quand l'ecran LCD ou le capteur ne repond pas.
#include <Wire.h>
void setup() {
Serial.begin(9600);
Wire.begin();
Serial.println(F("Scan I2C 0x08-0x77..."));
}
void loop() {
int trouves = 0;
for (byte adresse = 0x08; adresse <= 0x77; adresse++) {
Wire.beginTransmission(adresse);
byte erreur = Wire.endTransmission();
if (erreur == 0) {
Serial.print(F("peripherique a 0x"));
Serial.println(adresse, HEX);
trouves++;
}
}
if (trouves == 0) {
Serial.println(F("RIEN : verifier SDA=A4 SCL=A5, alim, pull-up"));
} else {
Serial.print(trouves);
Serial.println(F(" repondant(s)"));
}
// une seule passe : arreter ici pour eviter le spam serie
while (true);
}