- Arduino 教程
- Arduino - 首页
- Arduino - 概述
- Arduino - 开发板说明
- Arduino - 安装
- Arduino - 程序结构
- Arduino - 数据类型
- Arduino - 变量和常量
- Arduino - 运算符
- Arduino - 控制语句
- Arduino - 循环
- Arduino - 函数
- Arduino - 字符串
- Arduino - 字符串对象
- Arduino - 时间
- Arduino - 数组
- Arduino 函数库
- Arduino - I/O 函数
- Arduino - 高级 I/O 函数
- Arduino - 字符函数
- Arduino - 数学库
- Arduino - 三角函数
- Arduino 高级
- Arduino - Due 和 Zero
- Arduino - 脉冲宽度调制
- Arduino - 随机数
- Arduino - 中断
- Arduino - 通信
- Arduino - 互联集成电路
- Arduino - 串行外设接口
- Arduino 项目
- Arduino - 闪烁 LED
- Arduino - 渐变 LED
- Arduino - 读取模拟电压
- Arduino - LED 条形图
- Arduino - 键盘注销
- Arduino - 键盘消息
- Arduino - 鼠标按钮控制
- Arduino - 键盘串口
- Arduino 传感器
- Arduino - 湿度传感器
- Arduino - 温度传感器
- Arduino - 水位检测器/传感器
- Arduino - PIR 传感器
- Arduino - 超声波传感器
- Arduino - 连接开关
- 电机控制
- Arduino - 直流电机
- Arduino - 伺服电机
- Arduino - 步进电机
- Arduino 和声音
- Arduino - 音调库
- Arduino - 无线通信
- Arduino - 网络通信
- Arduino 有用资源
- Arduino - 快速指南
- Arduino - 有用资源
- Arduino - 讨论
Arduino - 互联集成电路
互联集成电路 (I2C) 是一种用于新一代微控制器和专用集成电路之间进行串行数据交换的系统。当它们之间的距离较短时(接收器和发射器通常位于同一印刷电路板上),就会使用它。连接通过两根导线建立。一根用于数据传输,另一根用于同步(时钟信号)。
如下图所示,一个设备始终为主设备。它在通信开始前执行一个从设备芯片的寻址。这样,一个微控制器可以与 112 个不同的设备通信。波特率通常为 100 Kb/秒(标准模式)或 10 Kb/秒(慢波特率模式)。最近出现了波特率为 3.4 Mb/秒的系统。通过 I2C 总线通信的设备之间的距离限制在几米以内。
开发板 I2C 引脚
I2C 总线由两个信号组成 - SCL 和 SDA。SCL 是时钟信号,SDA 是数据信号。当前的总线主设备始终生成时钟信号。某些从设备有时可能会强制时钟为低电平以延迟主设备发送更多数据(或需要更多时间来准备数据,然后再让主设备尝试将其输出)。这称为“时钟拉伸”。
以下是不同 Arduino 开发板的引脚 -
- Uno、Pro Mini A4 (SDA)、A5 (SCL)
- Mega、Due 20 (SDA)、21 (SCL)
- Leonardo、Yun 2 (SDA)、3 (SCL)
Arduino I2C
我们有两种模式 - 主代码和从代码 - 用于使用 I2C 连接两个 Arduino 开发板。它们是 -
- 主发送器/从接收器
- 主接收器/从发送器
主发送器/从接收器
现在让我们看看什么是主发送器和从接收器。
主发送器
以下函数用于初始化 Wire 库并以主设备或从设备身份加入 I2C 总线。这通常只调用一次。
Wire.begin(address) - address 是 7 位从设备地址,在我们的例子中,由于主设备未指定,因此它将以主设备身份加入总线。
Wire.beginTransmission(address) - 开始向具有给定地址的 I2C 从设备发送数据。
Wire.write(value) - 将字节排队,以便从主设备传输到从设备(在 beginTransmission() 和 endTransmission() 调用之间)。
Wire.endTransmission() - 结束对从设备的传输,该传输由 beginTransmission() 开始,并传输由 wire.write() 排队的字节。
示例
#include <Wire.h> //include wire library void setup() //this will run only once { Wire.begin(); // join i2c bus as master } short age = 0; void loop() { Wire.beginTransmission(2); // transmit to device #2 Wire.write("age is = "); Wire.write(age); // sends one byte Wire.endTransmission(); // stop transmitting delay(1000); }
从接收器
以下函数用于 -
Wire.begin(address) - address 是 7 位从设备地址。
Wire.onReceive(received data handler) - 当从设备从主设备接收数据时要调用的函数。
Wire.available() - 返回可以使用 Wire.read() 检索的字节数。这应该在 Wire.onReceive() 处理程序内部调用。
示例
#include <Wire.h> //include wire library void setup() { //this will run only once Wire.begin(2); // join i2c bus with address #2 Wire.onReceive(receiveEvent); // call receiveEvent when the master send any thing Serial.begin(9600); // start serial for output to print what we receive } void loop() { delay(250); } //-----this function will execute whenever data is received from master-----// void receiveEvent(int howMany) { while (Wire.available()>1) // loop through all but the last { char c = Wire.read(); // receive byte as a character Serial.print(c); // print the character } }
主接收器/从发送器
现在让我们看看什么是主接收器和从发送器。
主接收器
主设备被编程为请求,然后读取从唯一寻址的从设备 Arduino 发送的数据字节。
以下函数用于 -
Wire.requestFrom(address,number of bytes) - 主设备用于向从设备请求字节。然后可以使用函数 wire.available() 和 wire.read() 函数检索这些字节。
示例
#include <Wire.h> //include wire library void setup() { Wire.begin(); // join i2c bus (address optional for master) Serial.begin(9600); // start serial for output } void loop() { Wire.requestFrom(2, 1); // request 1 bytes from slave device #2 while (Wire.available()) // slave may send less than requested { char c = Wire.read(); // receive a byte as character Serial.print(c); // print the character } delay(500); }
从发送器
以下函数用于。
Wire.onRequest(handler) - 当主设备从此从设备请求数据时,会调用一个函数。
示例
#include <Wire.h> void setup() { Wire.begin(2); // join i2c bus with address #2 Wire.onRequest(requestEvent); // register event } Byte x = 0; void loop() { delay(100); } // function that executes whenever data is requested by master // this function is registered as an event, see setup() void requestEvent() { Wire.write(x); // respond with message of 1 bytes as expected by master x++; }