1、概述
当我们使用Arduino连接一些I2C接口的模块时,有时候程序运行后没有反应,首先我们就需要检查硬件已经连线是否有问题,如果在确认硬件没有问题的情况下,程序还是没有反应这时候我们就需要来查看软件是否有问题了,然而很多时候,在查看软件代码完后还是检测不出问题所在。其实我们容易忽略的一个问题是关于I2C地址的问题,我在做一些项目的过程中就遇到过很多因为I2C地址的问题使得调试花费了很多时间。因此这里提供一个简答有效的方法来解决此问题,从而提供工作的效率,原理很简单:通过扫描I2C地址的方法从而得到模块的正确的I2C地址,从而排除由于i2c地址的问题所造成的程序无反应的情况。
2、连线
将arduino开发板和传感器模块的I2C接口、电源、地已经其他必要的引脚相连接。
3、代码
#include <Wire.h>
void setup()
{
Wire.begin();
Serial.begin(9600);
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("Unknow 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); // 等待 5s 后继续扫描
}
4、结果
将代码上传到arduino开发板,打开串口监视器,如果没问题,就可以在串口监视器中看到检测出的模块正确的I2C地址。