#include <Wire.h>
下表显示了TWI引脚在各种Arduino板上的位置。
Board |
I2C / TWI pins |
Uno |
A4 (SDA), A5 (SCL) |
Mega2560 |
20 (SDA), 21 (SCL) |
Leonardo |
2 (SDA), 3 (SCL) |
库函数
函数 | 用途 | 参数说明 | 返回值 |
begin() begin(address) |
初始化Wire库,并以主机或从机身份加入I2C总线。 通常来说这个函数只调用一次。 |
address(可选):7位从机的地址; 如果这个参数未指定,则默认以主机身份加入总线。 注:地址从0到7 被保留了, 因此您在开发的时候请不要使用它们!!! 可以从8开始使用。 |
无 |
requestFrom(address , quantity) requestFrom(address , quantity, stop) |
由主设备用来向从设备请求字节。 请求发送之后可以使用available()和read()来接受并读取数据。 从Arduino 1.0.1开始,requestFrom()接受一个布尔参数来适配某些I2C设备来达到兼容的目的。 |
address: 设备的7位地址,用于请求字节 quantity: 请求的字节数 stop (bool): 值为true则在请求后发送停止消息,释放总线。值为 false则在请求后发送重启信息,以保持连接处于活动状态。默认值是true。 |
返回值类型 :byte 返回从设备响应的字节数 |
beginTransmission(address) | 使用指定的地址开始向I2C从设备进行传输。 在调用了Wire.beginTransmission(address)函数之后,使用write()函数对要传输的字节进行队列,并通过调用endTransmission()进行传输。 |
address: 要传输数据的目的设备的7位地址 | 无 |
endTransmission() endTransmission(stop) |
停止与从机的数据传输,与beginTransmission配对使用。 | stop(bool): 参数值为true时将在请求后发送停止指令并释放总线; 参数值为false时将在请求后发送重新启动的指令,保持连接状态。 |
返回值类型:byte 返回传输的状态值: 0: 成功 1: 数据量超过传送缓存容纳限制 2: 传送地址时收到 NACK 3: 传送数据时收到 NACK 4: 其它错误 |
write(value) wrtie(string) write(data, length) |
对于从设备来说: write()用于响应来自主设备的请求,即从设备写入数据 对于主设备来说: write()将数据进行队列, 用以从主设备传输到从设备, 这个函数通常在beginTransmission()和endTransmission()之间进行调用。 |
value: 一个要发送的单字节 string: 一系列要发送的字符串 data: 要作为字节发送的数组数据 length: 要传输的字节数 |
返回值类型 : byte 返回写入的字节数 |
available() | available() 函数可用于检查是否接收到数据。该函数将会返回等待读取的数据字节数。 应该在调用requestFrom()之后再在主设备上调用此函数,或者在从设备的onReceive()的事件处理函数内的调用此函数。 |
无 | 返回缓冲区中可读取的字节数。 |
read() | 读取在requestFrom()调用后从从设备响应发送到主设备的字节,或从主设备发送到从设备的字节。 | 无 | 读取的下一个字符,返回值为接读取到的数据流中的1个字符。 如果没有数据时,返回值为-1 |
setClock(clockFrequency) | SetClock()函数用于修改I2C通信的时钟频率。 I2C从设备没有最低的工作时钟频率,但是通常以100KHz为基准。 |
clockFrequency:所需通信时钟的值(以赫兹为单位)。 可接受的值为100000(标准模式)和400000(快速模式)。一些处理器还支持10000(低速模式),1000000(加快速模式)和3400000(高速模式)。请参考特定的处理器文档,以确保支持所需的模式。 |
无 |
onReceive(handler) | 当从设备接收到来自主机的传输时,注册要调用的函数。 | handler:从机接收数据时要调用的函数; 这个函数应该使用一个int参数(用于从主设备读取字节数),并且这个函数不应返回任何内容, 例如: void recHandler(int num) |
无 |
onRequest(handler) | 当主设备请求从从设备发送数据时,从设备通过onRequest设置调用的函数。 | handler:当主设备请求从从设备发送数据时,从设备要调用的函数。此函数不带参数,不返回任何值,例如: void reqHandler() |
无 |
将主设备开发板的引脚4(或SDA数据引脚)和引脚5(或SCL时钟引脚)连接到从设备开发板的对应引脚上。图示电路图以两块UNO为例进行连接
为了保证串口通信的运行,必须通过USB将开发板连接到计算机上并保证各个开发板的供电。
在这个示例中,将使用两块开发板通过I2C通讯协议在主设备读取/从设备发送的方式进行通信。
Arduino UNO主设备通过使用Wire库, 可以请求并读取从唯一寻址的从设备 Arduino UNO发送来的6字节数据。 收到该消息后,便可以在Arduino IDE 串口监视器窗中进行查看。
主设备读取
// 引入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);
}
从设备发送
// 引入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 ");
// 以此回应主设备的请求
}
在这个示例中,将使用两个开发板通过I2C同步串行协议以主机写入从机接受的方式相互通信。
Arduino UNO(主设备)经过编程,每半秒向唯一寻址的从设备发送6个字节的数据。 从设备收到该消息后,可以在Arduino IDE 的串口监视器窗口中查看该数据。
主设备写入
// 引入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);
}
从设备接受
// 引入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);
}
电子设计自动化(英语:Electronic design automation,缩写:EDA)是指利用计算机辅助设计(CAD)软件,来完成超大规模集成电路(VLSI)芯片的功能设计、综合、验证、物理设计(包括布局、布线、版图、设计规则检查等)等流程的设计方式。
ESP32系列(包括ESP32-S3)搭载Xtensa双核处理器,默认情况下Arduino框架仅使用单核运行用户代码,通过多核编程,可以充分利用硬件资源来提升系统响应和性能。
在本文中,先解释 MSB(最高有效位)和 LSB(最低有效位)的概念,以及 MSBFIRST 和 LSBFIRST。然后展示了 MSBFIRST 和 LSBFIRST 的使用如何影响移位寄存器的输出。
TB6612是一款双路H桥型的直流电机驱动芯片,可以驱动两个直流电机并且控制其转速与方向,输入电压在3V~12V,因此在集成化、小型化的电机控制系统中,它可以作为理想的电机驱动器件。
Arduino-ESP32项目提供的Preferences库是一个专为ESP32设计的非易失性存储解决方案,它替代了传统的Arduino EEPROM库,提供了更强大、更可靠的数据存储功能。
在Arduino中,通过串行端口接收数字通常涉及使用Serial.read()、Serial.readString()、Serial.parseInt()等方法。
要生成随机数,可以使用Arduino随机数函数random()。
本文收集整理在Arduino环境下字符串的相关用法,供参考。
ESP32在Arduino中的GPIO模式。
ESP32EA-MOC 开发板介绍和Arduino环境配置。