scanner-i2c.ino

Arduino Nano (Classic, ATmega328P) · Fichier : scanner-i2c.ino · Langage : Arduino · Usage : Trouver l'adresse des périphériques I2C branchés

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);
}

← Retour à la fiche