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)导入依赖头文件
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
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!