Tìm kiếm I2C address cho board Arduino
09/04/2026
@ Saigon
Arduino
Tôi không sử dụng Arduino-IDE mà sử dụng arduino-cli để tạo project ($ arduino-cli sketch new i2c_address_finder).
Sau khi tạo xong project, hãy thay đổi nội dung của file .ino giống như dưới đây, trước khi copy-paste, hay để tôi giải thích về quy trình:
- Thư viện
Wiredành cho giao thức vớiI2C. MethodWire.begin()dùng để xác lập board arduino chúng ta đang sử dụng sẽ đóng vai trò làMAIN. Các linh kiện sensor, màn hình bên ngoài sẽ đóng vai trò làSUB. - Chúng ta muốn là arduino khi tìm được address
I2Csẽ in ra trên màn hình monitor cho chúng ta xem. Giai đoạn này sẽ phụ thuộc vàoSerialSerial.begin(__baudrate__): Xác định truyền tín hiệu với giao thức Serial cùngbaudrate. Trong code là9600(Liên quan đến bước )Serial.print("__text__"): In text trên màn hình monitor
- Địa chỉ I2C được miêu tả bởi
7 bit, có số lượng tối đa là 128 giá trị. Theo như tài liệu, trong số 128 giá trị khả dĩ, sẽ có các địa chỉ đặc biệt, không được sử dụng cho thiết bịSUB. Trong code dưới đây, chúng ta vẫn sẽ quét qua. Và sử dụng hai method sau:Wire.beginTransmission(__byte_address__): Khởi tạo kết nối đếnSUBvới địa chỉ__byte_address__Wire.endTransmission(): Đóng kết nối, nếu giá trị trả về bằng0thì nghĩa là đã kết nối và đóng thành công. Ta tìm được địa chỉI2Chợp lệ.Serial.println(i, HEX): In giá trị address ở dạng hexadecimal
#include <Wire.h>
void setup() {
Wire.begin();
Serial.begin(9600);
delay(1000);
Serial.println("Hexalink.xyz");
Serial.println("Scanning...");
}
void loop() {
for (byte i = 0; i < 128; i++) {
Wire.beginTransmission(i);
if (Wire.endTransmission() == 0) {
Serial.print("Found at 0x");
Serial.println(i, HEX);
}
}
delay(2000);
}
Bước 1: Find board & port
$ arduino-cli board list
Port Protocol Type Board Name FQBN Core
/dev/ttyACM0 serial Serial Port (USB) Arduino UNO arduino:avr:uno arduino:avr
- Fully Qualified Board Name (FQBN):
arduino:avr:uno - Port:
/dev/ttyACM0
Bước 2: Compile
$ arduino-cli compile --fqbn arduino:avr:uno
Sketch uses 3704 bytes (11%) of program storage space. Maximum is 32256 bytes.
Global variables use 428 bytes (20%) of dynamic memory, leaving 1620 bytes for local variables. Maximum is 2048 bytes.
Bước 3: Upload
$ arduino-cli upload --fqbn arduino:avr:uno --port /dev/ttyACM0
New upload port: /dev/ttyACM0 (serial)
Bước 4: Monitor
$ arduino-cli monitor -p /dev/ttyACM0 --config 9600
Monitor port settings:
baudrate=9600
bits=8
dtr=on
parity=none
rts=on
stop_bits=1
Connecting to /dev/ttyACM0. Press CTRL-C to exit.
Scat 0x27
Scanning...
Found at 0x27
Found at 0x27
Xem trên monitor, địa chỉ I2C 0x27 đã tìm được.
Credit
Kiến thức này là tôi lấy được từ nhiều nguồn, bao gồm cả ChatGPT để hiểu I2C và Serial trong bài viết này. Cảm ơn ChatGPT.