I2C,Inter-Integrated Circuit,缩写也写作IIC。在Arduino里也叫TWI(Two-Wire Interface)。现在是应用最广泛的嵌入式总线。使用I2C的组件有:8X8点阵HT16K33、16路PWM舵机驱动板、TM1637 六位数码管显示按键扫描模块、GP2Y0E03红外测距传感器模块、Sparkfun的加速度计与陀螺仪、DS1307 RTC时钟模块、LCD1602A(带I2C扩展小板)、HT16K33(8X8单色点阵LED)、SHT35温湿度传感器、GY-49 MAX44009光照度传感器、VL53L1X VL53L0X激光测距传感器等等。你进淘宝用关键字“I2C”或“IIC”搜索,就可以知道,带I2C总线的组件有多少了。前面的“和爷爷一起学Arduino:玩LED点阵(HT16K33)1”一文,HT16K33就是使用I2C总线的。
I2C是一种总线,因此,挂在同一条I2C总线上的各个组件都必须有独一无二的地址,以确保无不冲突。地址范围是0~127(0~7FH)。即使你的Arduino只连接一个I2C组件,也需要知道这个组件的I2C地址,因为对I2C组件编程时需要知道它的总线地址。
#include <Wire.h>
void setup()
{
Wire.begin();
Serial.begin(9600);
while (!Serial); // Leonardo板用来等待串口监视器
Serial.println("\nI2C Scanner");
}
void loop()
{
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address )
{
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("I2C device found at address 0x");
if (address<16)
Serial.print("0");
Serial.print(address,HEX);
Serial.println(" !");
nDevices ;
}
else if (error==4)
{
Serial.print("Unknown error at address 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");
delay(5000); // 等待5秒后进行下一次扫描
}
在串口监视器里就可以读到被测组件的I2C总线地址。把它记下来,贴在组件上。
,