scanner-i2c.ino
Avant de pleurer sur un écran LCD muet, scannez le bus : ce programme interroge les 112 adresses I2C du Nano (broches A4/A5) et liste ce qui répond. Il démasque l'adresse 0x3F d'un PCF8574 mal documenté comme le câble SDA/SCL inversé.
Matériel requis
Un Arduino Nano classique (ATmega328P à 16 MHz, brochage DIL 30 broches sur breadboard, USB mini-B, logique 5 V, broche RESET en bas à gauche). Arduino Nano, périphérique I2C branché (LCD, BME280, PCF8574...) ; des pull-up 4,7 kΩ si le bus est bricolé.
Câblage
SDA→A4, SCL→A5, VCC/GND selon le module. Sur les modules tout faits, les pull-up sont déjà présents.
Fonctionnement
endTransmission() renvoie 0 quand un ACK revient de l'adresse testée. Les adresses hors plage (0x00-0x07, 0x78+) sont réservées, on ne les teste pas.
Exécution
Dans l'IDE Arduino, sélectionnez la carte Arduino Nano et le processeur ATmega328P, choisissez le port série puis téléversez. L'alimentation 5 V de la carte convient aux capteurs 5 V ; sinon utiliser le 3,3 V des broches adaptées.
Variantes
Gardez ce croquis en raccourci : chaque nouvel écran ou capteur I2C mérite son scan avant tout code applicatif.
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);
}