两块UNO通过IIC进行板间通讯#
From: www.taichi-maker.com
主设备读取,从设备发送#
在这个示例中,将使用两块开发板通过I2C通讯协议在主设备读取/从设备发送的方式进行通信。
Arduino UNO主设备通过使用Wire库, 可以请求并读取从唯一寻址的从设备 Arduino UNO发送来的6字节数据。 收到该消息后,便可以在Arduino IDE 串口监视器窗中进行查看。
所需硬件#
2块Arduino或Genuino开发板
杜邦线
电路连接#
将主设备开发板的引脚4(或SDA数据引脚)和引脚5(或SCL时钟引脚)连接到从设备开发板的对应引脚上。图示电路图以两块UNO为例进行连接
为了保证串口通信的运行,必须通过USB将开发板连接到计算机上并保证各个开发板的供电。
Wire板间通讯电路图Arduino
程序#
主设备读取#
/**********************************************************************
程序名称/Program name : Wire Master Reader
团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author : Dapenson
日期/Date(YYYYMMDD) : 2020/06/30
程序目的/Purpose :
演示了Wire库的使用
从I2C / TWI从设备读取数据
-----------------------------------------------------------------------
修订历史/Revision History
日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description
-----------------------------------------------------------------------
其它说明:
本示例程序来源于以下链接, 由Dapenson整理注释,
旨在使初学者更好的理解Wire库的学习和应用
https://www.arduino.cc/en/Reference/Wire
***********************************************************************/
// 引入Wire库文件
#include <Wire.h>
void setup()
{
// Wire初始化, 加入i2c总线
// 如果未指定,则以主机身份加入总线。
Wire.begin();
// 初始化串口并设置波特率为9600
Serial.begin(9600);
}
void loop()
{
// 向从设备#8请求6个字节
Wire.requestFrom(8, 6);
// 当从从设备接收到信息时值为true
while (Wire.available())
{
// 接受并读取从设备发来的一个字节的数据
char c = Wire.read();
// 向串口打印该字节
Serial.print(c);
}
// 延时500毫秒
delay(500);
}
从设备发送#
/**********************************************************************
程序名称/Program name : Wire Slave Sender
团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author : Dapenson
日期/Date(YYYYMMDD) : 2020/07/01
程序目的/Purpose :
演示了Wire库的使用
作为I2C / TWI从设备发送数据给主设备
-----------------------------------------------------------------------
修订历史/Revision History
日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description
-----------------------------------------------------------------------
其它说明:
本示例程序来源于以下链接, 由Dapenson整理注释,
旨在使初学者更好的理解Wire库的学习和应用
https://www.arduino.cc/en/Reference/Wire
***********************************************************************/
// 引入Wire库文件
#include <Wire.h>
void setup()
{
// Wire初始化, 并以从设备地址#8的身份加入i2c总线
Wire.begin(8);
// 注册请求响应事件
Wire.onRequest(requestEvent);
}
void loop()
{
delay(100);
}
// 每当接收到来自主机的数据时执行的事件函数
// 此函数被注册为事件,调用请见setup()
void requestEvent()
{
// 用6个字节的消息进行响应
Wire.write("hello ");
// 以此回应主设备的请求
}
效果演示
通过主设备UNO硬件串口打开的串口监视器窗口视图
主设备写入, 从设备接受#
在这个示例中,将使用两个开发板通过I2C同步串行协议以主机写入从机接受的方式相互通信。
Arduino UNO(主设备)经过编程,每半秒向唯一寻址的从设备发送6个字节的数据。 从设备收到该消息后,可以在Arduino IDE 的串口监视器窗口中查看该数据。
所需硬件#
2块Arduino或Genuino开发板
杜邦线
电路连接#
将主设备开发板的引脚4(或SDA数据引脚)和引脚5(或SCL时钟引脚)连接到从设备开发板的对应引脚上。图示电路图以两块UNO为例进行连接
为了保证串口通信的运行,必须通过USB将开发板连接到计算机上并保证各个开发板的供电。
Wire板间通讯电路图Arduino
原理图#
Code#
主设备写入#
/**********************************************************************
程序名称/Program name : Wire Master Writer
团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author : Dapenson
日期/Date(YYYYMMDD) : 2020/07/01
程序目的/Purpose :
演示Wire库的使用
将数据写入到I2C / TWI从设备
-----------------------------------------------------------------------
修订历史/Revision History
日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description
-----------------------------------------------------------------------
其它说明:
本示例程序来源于以下链接, 由Dapenson整理注释,
旨在使初学者更好的理解Wire库的学习和应用
https://www.arduino.cc/en/Reference/Wire
***********************************************************************/
// 引入Wire库文件
#include <Wire.h>
void setup()
{
// Wire初始化, 加入i2c总线
// 如果未指定,则以主机身份加入总线。
Wire.begin();
}
// 定义一个byte变量以便串口调试
byte x = 0;
void loop()
{
// 将数据传送到从设备#8
Wire.beginTransmission(8);
// 发送5个字节
Wire.write("x is ");
// 发送一个字节
Wire.write(x);
// 停止传送
Wire.endTransmission();
x++;
delay(500);
}
从设备接受#
/**********************************************************************
程序名称/Program name : Wire Slave Receiver
团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author : Dapenson
日期/Date(YYYYMMDD) : 2020/07/01
程序目的/Purpose :
演示Wire库的使用
作为I2C / TWI从设备接收主设备写入的数据
-----------------------------------------------------------------------
修订历史/Revision History
日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description
-----------------------------------------------------------------------
其它说明:
本示例程序来源于以下链接, 由Dapenson整理注释,
旨在使初学者更好的理解Wire库的学习和应用
https://www.arduino.cc/en/Reference/Wire
***********************************************************************/
// 引入Wire库文件
#include <Wire.h>
void setup()
{
// Wire初始化, 并以从设备地址#8的身份加入i2c总线
Wire.begin(8);
// 注册接受事件函数
Wire.onReceive(receiveEvent);
// 初始化串口并设置波特率为9600
Serial.begin(9600);
}
void loop()
{
delay(100);
}
// 每当接收到来自主机的数据时执行的事件函数
// 此函数被注册为事件,调用请见setup()
void receiveEvent(int howMany)
{
// 循环读取数据(除了最后一个字符)
while (1 < Wire.available())
{
// 接收字节数据并赋值给变量c(char)
char c = Wire.read();
// 打印该字节
//太极创客团队 / Taichi-Maker (www.taichi-maker.com)
Serial.print(c);
}
// 以int整数的形式接受字节数据并赋值给x(int)
int x = Wire.read();
// 打印该int变量x
Serial.println(x);
}