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

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.
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: 0x27Znaleziono urzadzenie: 0x3CLiczba znalezionych adresow: 2Jak 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łytka | SDA | SCL | Wskazówka |
|---|---|---|---|
| Arduino UNO R3 | A4 / pin SDA | A5 / pin SCL | Osobne złącza SDA/SCL są elektrycznie połączone z A4/A5. |
| Arduino Nano / Pro Mini (ATmega328P) | A4 | A5 | Nie pomyl z analogowymi A0–A3. |
| Arduino Mega 2560 | 20 | 21 | Nie używaj A4/A5 jako I2C. |
| Arduino Leonardo / Micro | 2 | 3 | Korzystaj 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.
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ład | Typowe adresy 7-bitowe | Od czego zależy adres? |
|---|---|---|
| LCD 16×2 z ekspanderem PCF8574 | 0x20–0x27, często 0x27 | Piny A0, A1 i A2 ekspandera |
| LCD 16×2 z PCF8574A | 0x38–0x3F, często 0x3F | Wersja układu i piny A0–A2 |
| OLED SSD1306 | 0x3C lub 0x3D | Stan pinu SA0 / konfiguracja modułu |
| RTC DS3231 | 0x68 | Stały adres układu zegara |
| BME280 / BMP280 | 0x76 lub 0x77 | Stan pinu SDO |
| MPU-6050 | 0x68 lub 0x69 | Stan pinu AD0 |
| ADS1115 | 0x48–0x4B | Połączenie pinu ADDR |
| MCP23017 | 0x20–0x27 | Piny 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:
- Sprawdź zasilanie. Zmierz napięcie pomiędzy VCC i GND bezpośrednio na module.
- Połącz wspólną masę. GND modułu i GND Arduino muszą być połączone.
- Sprawdź SDA i SCL. Upewnij się, że przewody nie są zamienione oraz trafiają na piny właściwe dla wybranej płytki.
- Skontroluj rezystory pull-up. Magistrala I2C wymaga podciągnięcia SDA i SCL. Wiele gotowych modułów ma już rezystory, ale nie każdy.
- Sprawdź napięcie logiki. Moduł 3,3 V może wymagać konwertera poziomów przy Arduino UNO pracującym z logiką 5 V.
- Odłącz pozostałe moduły. Testuj po jednym urządzeniu, aby wykryć konflikt adresów albo moduł blokujący magistralę.
- Sprawdź interfejs modułu. Niektóre płytki można skonfigurować jako SPI zamiast I2C.
- Skróć przewody. Na płytce stykowej zacznij od krótkich połączeń i standardowej częstotliwości 100 kHz.
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.
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
- Arduino UNO R3 — dokumentacja i pinout
- Arduino Wire — oficjalny kod biblioteki
- Specyfikacja magistrali I2C firmy NXP
- Dokumentacja PCF8574 i PCF8574A
- Dokumentacja czujnika BME280
- Dokumentacja przetwornika ADS1115
Przejdź także do działu kalkulatory i generatory Arduino lub sprawdź jak pisać program bez blokowania funkcją delay().