Skaner I2C Arduino – znajdź adres urządzenia

Skaner I2C Arduino automatycznie sprawdza adresy urządzeń podłączonych do magistrali i pokazuje je w Monitorze portu szeregowego, na przykład 0x27, 0x3F albo 0x76. Przydaje się, gdy nie znasz adresu modułu lub program zgłasza błąd „I2C device not found”.

Schemat jednego Arduino UNO połączonego równolegle z kilkoma urządzeniami I2C przez VCC, SDA, SCL i GND
Schemat magistrali I²C: jedno Arduino i kilka odbiorników korzystających ze wspólnych linii SDA oraz SCL. Kliknij schemat, aby go powiększyć.
Szybki start: połącz wspólnie GND, podłącz SDA do SDA i SCL do SCL, wgraj kod z tej strony, a następnie otwórz Monitor portu szeregowego z szybkością 9600 baud.

Kod skanera I2C Arduino

Poniższy szkic korzysta z biblioteki Wire, która jest dołączona do Arduino IDE. Sprawdza wszystkie użyteczne 7-bitowe adresy od 0x08 do 0x77. Jeżeli urządzenie potwierdzi adres sygnałem ACK, skaner wypisze go w Monitorze portu szeregowego.

Kod_001 — skaner adresów I2C dla Arduino

Po wgraniu programu wybierz w Arduino IDE: Narzędzia → Monitor portu szeregowego i ustaw 9600 baud. Przykładowy wynik może wyglądać tak:

Znaleziono urzadzenie: 0x27
Znaleziono urzadzenie: 0x3C
Liczba znalezionych adresow: 2

Jak podłączyć SDA i SCL?

Wszystkie urządzenia na jednej magistrali I2C łączy się równolegle: linia SDA każdego modułu trafia do SDA Arduino, a linia SCL do SCL. Moduły i mikrokontroler muszą mieć również wspólną masę. Zasilanie dobierz do konkretnego modułu — oznaczenie VCC nie znaczy automatycznie, że układ toleruje 5 V.

PłytkaSDASCLWskazówka
Arduino UNO R3A4 / pin SDAA5 / pin SCLOsobne złącza SDA/SCL są elektrycznie połączone z A4/A5.
Arduino Nano / Pro Mini (ATmega328P)A4A5Nie pomyl z analogowymi A0–A3.
Arduino Mega 25602021Nie używaj A4/A5 jako I2C.
Arduino Leonardo / Micro23Korzystaj z oznaczeń SDA i SCL na płytce.

Jeśli używasz UNO, zobacz również interaktywny pinout Arduino UNO, który pokazuje położenie SDA, SCL, zasilania i masy.

Uwaga na poziomy napięć: linie SDA i SCL są podciągane do napięcia zasilania magistrali. Nie podciągaj ich do 5 V, jeżeli którykolwiek układ jest przeznaczony wyłącznie do logiki 3,3 V. W razie potrzeby zastosuj dwukierunkowy konwerter poziomów.

Jak działa skaner I2C?

Arduino działa jako kontroler magistrali. Dla każdego adresu wywołuje Wire.beginTransmission(adres), a następnie Wire.endTransmission(). Kod zwrotny równy 0 oznacza, że urządzenie odpowiedziało potwierdzeniem ACK. Brak potwierdzenia nie mówi jeszcze, co jest uszkodzone — może oznaczać zły adres, brak zasilania, problem z przewodami albo nieprawidłowe poziomy logiczne.

Skanowanie zaczyna się od 0x08 i kończy na 0x77, ponieważ skrajne zakresy 7-bitowej przestrzeni adresowej są zarezerwowane przez specyfikację I2C. Adres pokazywany przez skaner jest wartością 7-bitową, bez bitu odczytu/zapisu.

Popularne adresy urządzeń I2C

Adres zależy od zastosowanego układu oraz ustawienia pinów adresowych. Poniższa tabela pomaga zawęzić poszukiwania, ale nie zastępuje dokumentacji modułu.

Moduł lub układTypowe adresy 7-bitoweOd czego zależy adres?
LCD 16×2 z ekspanderem PCF85740x20–0x27, często 0x27Piny A0, A1 i A2 ekspandera
LCD 16×2 z PCF8574A0x38–0x3F, często 0x3FWersja układu i piny A0–A2
OLED SSD13060x3C lub 0x3DStan pinu SA0 / konfiguracja modułu
RTC DS32310x68Stały adres układu zegara
BME280 / BMP2800x76 lub 0x77Stan pinu SDO
MPU-60500x68 lub 0x69Stan pinu AD0
ADS11150x48–0x4BPołączenie pinu ADDR
MCP230170x20–0x27Piny A0, A1 i A2

Ten sam adres może należeć do różnych układów. Przykładowo 0x68 może oznaczać DS3231 albo MPU-6050. Skaner wykrywa odpowiedź, lecz nie odczytuje automatycznie identyfikatora modelu.

Adres LCD 0x27 czy 0x3F?

Dwa popularne adresy wyświetlaczy LCD wynikają najczęściej z użycia różnych wersji ekspandera portów. PCF8574 zajmuje zakres 0x20–0x27, a PCF8574A — 0x38–0x3F. Konkretna wartość zależy od zworek A0, A1 i A2 na płytce konwertera.

Nie wpisuj 0x27 „na ślepo” do biblioteki wyświetlacza. Najpierw uruchom skaner, odczytaj rzeczywisty adres i dopiero wtedy użyj go w konstruktorze, na przykład LiquidCrystal_I2C lcd(0x27, 16, 2);. Więcej informacji o samym ekranie znajdziesz w poradniku LCD 16×2 HD44780 z Arduino.

I2C device not found — co sprawdzić?

Jeżeli Monitor portu szeregowego pokazuje „Nie znaleziono urządzeń I2C”, wykonaj kontrolę w tej kolejności:

  1. Sprawdź zasilanie. Zmierz napięcie pomiędzy VCC i GND bezpośrednio na module.
  2. Połącz wspólną masę. GND modułu i GND Arduino muszą być połączone.
  3. Sprawdź SDA i SCL. Upewnij się, że przewody nie są zamienione oraz trafiają na piny właściwe dla wybranej płytki.
  4. Skontroluj rezystory pull-up. Magistrala I2C wymaga podciągnięcia SDA i SCL. Wiele gotowych modułów ma już rezystory, ale nie każdy.
  5. Sprawdź napięcie logiki. Moduł 3,3 V może wymagać konwertera poziomów przy Arduino UNO pracującym z logiką 5 V.
  6. Odłącz pozostałe moduły. Testuj po jednym urządzeniu, aby wykryć konflikt adresów albo moduł blokujący magistralę.
  7. Sprawdź interfejs modułu. Niektóre płytki można skonfigurować jako SPI zamiast I2C.
  8. Skróć przewody. Na płytce stykowej zacznij od krótkich połączeń i standardowej częstotliwości 100 kHz.
Szybka diagnostyka miernikiem: w stanie spoczynku SDA i SCL powinny mieć stan wysoki. Jeżeli jedna linia cały czas pozostaje blisko 0 V, odłączaj po kolei urządzenia — jedno z nich, przewód lub błędne połączenie może blokować magistralę.

Dwa urządzenia z tym samym adresem I2C

Jeżeli dwa moduły mają identyczny adres, skaner pokaże tylko jeden adres — nie potrafi policzyć, ile układów jednocześnie odpowiedziało. Najprościej zmienić adres za pomocą zworek lub pinów A0/A1/A2, AD0, SDO albo ADDR, zależnie od układu.

Gdy urządzenie ma stały adres, rozwiązaniem jest multiplekser I2C, na przykład TCA9548A. Rozdziela on moduły na osobne kanały, które program wybiera przed komunikacją.

Adres 7-bitowy a 8-bitowy

Biblioteka Wire oczekuje adresu 7-bitowego. Czasem dokumentacja podaje dwie wartości 8-bitowe: osobną dla zapisu i odczytu, na przykład 0x4E oraz 0x4F. W takim przypadku należy usunąć najmłodszy bit, czyli przesunąć wartość o jeden bit w prawo. Dla tej pary otrzymasz adres 7-bitowy 0x27.

Nie dziel każdego adresu przez dwa. Jeżeli dokumentacja już podaje adres 7-bitowy — a tak robi większość współczesnych bibliotek Arduino — użyj go bez zmian.

Najczęściej zadawane pytania

Jak znaleźć adres I2C w Arduino?

Wgraj kod skanera, otwórz Monitor portu szeregowego z szybkością 9600 baud i odczytaj adresy potwierdzone przez urządzenia, na przykład 0x27 lub 0x3C.

Gdzie są piny I2C w Arduino UNO?

SDA znajduje się na A4, a SCL na A5. Na UNO R3 te same sygnały są także wyprowadzone na osobne piny opisane SDA i SCL.

Dlaczego skaner I2C nic nie wykrywa?

Najczęstsze przyczyny to brak wspólnej masy, zamienione SDA i SCL, niewłaściwe zasilanie, brak rezystorów podciągających, zły tryb interfejsu modułu albo urządzenie blokujące magistralę.

Czy skaner może wykryć kilka urządzeń naraz?

Tak. Każdy różny adres, który odpowie sygnałem ACK, pojawi się osobno. Dwa urządzenia o identycznym adresie będą jednak widoczne jako jeden adres i zwykle spowodują konflikt podczas normalnej komunikacji.

Czy adres 0x27 zawsze oznacza wyświetlacz LCD?

Nie. Jest to częsty adres ekspandera PCF8574 w plecakach LCD, ale ten sam adres może być używany przez inny układ. Skaner potwierdza adres, nie model urządzenia.

Dokumentacja i powiązane materiały

Przejdź także do działu kalkulatory i generatory Arduino lub sprawdź jak pisać program bez blokowania funkcją delay().