ESP8266-Arduino编程实例-I2C设备地址扫描

I2C设备地址扫描

I2C 总线是飞利浦在 80 年代初设计的,用于允许位于同一电路板上的组件之间轻松通信。有时总线称为 IIC 或 I²C 总线。

I2C 不仅用于单板,还用于连接通过电缆连接的组件。 简单性和灵活性是使该总线对许多应用程序具有吸引力的关键特性。

最重要的功能包括:

  • 只需要两根接线
  • 没有严格的波特率要求,例如 RS232,主机生成总线时钟
  • 所有组件之间存在简单的主/从关系
  • 连接到总线的每个设备都可以通过唯一地址进行软件寻址
  • I2C 是真正的多主机总线,提供仲裁和冲突检测

有时,不知道I2C设备的地址,需要查询设备地址。本实例将演示如何扫描I2C总线上从设备的地址。

1、硬件准备

  • ESP8266 NodeMCU开发板一块
  • 数据线一条
  • I2C传感器模块
  • I2C总线扩展板

2、软件准备

  • Arduino IDE或VSCode + PlatformIO

在前面的文章中,对如何搭建ESP8266开发环境做了详细的介绍,请参考:

ESP8266 NodeMCU的引脚介绍在前面的文章中做了详细的介绍,请参考:

3、代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#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); // wait 5 seconds for next scan
}

4、代码解析

1)导入依赖头文件

1
2
#include <Wire.h>

2)初始化I2C总线

1
2
3
4
5
6
7
void setup(){
Wire.begin();

Serial.begin(9600);
Serial.println("\nI2C Scanner");
}

3)扫描设备地址,从0~127。当设备有响应时,输出当前设备的地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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++;
}

文章来源: https://iotsmart.blog.csdn.net/article/details/126048898