对于I2C通信,Arduino的不同电路板具有不同的引脚专用于SDA和SCL引脚。下面的列表显示了不同电路板中的这些引脚号。
下图显示了 Arduino UNO 中的 SDA 和 SCL 引脚,它们将在本文中使用。
“有线”库用于Arduino中的I2C通信。以下是此库的重要功能。
使用此命令启动导线库,并将 I2C 总线作为主总线或从总线连接。地址是可选的。此地址由从器件的七位组成。如果未指定;设备以主设备身份加入总线。
主设备使用此命令从设备请求字节。“Available ()” and “read ()” 函数可用于在之后收集这些字节。“地址”是要从其发出请求的特定从设备的地址,“数量”指定要请求的字节数。
此命令使用给定地址的从属设备启动字节的传输。之后,要传输的字节使用 write () 函数排队,这些字节使用 endTransmission() 函数进行传输。
使用此命令结束使用 wire.beginTransmission() 函数启动的字节的传输。
此函数接受参数。如果参数为 TRUE,则在传输字节后发送 stop 命令,并且 I2C 总线不受限制。
如果参数为 FALSE,它将在传输字节后发送重新启动命令,并且总线不能幸免,并且它阻止另一个主设备在消息之间传输。
此命令一次执行 2 个功能之一。
请求后从()命令,从从设备传输到主设备或主设备到从设备传输的字节;使用此命令读取。
此函数返回调用 read () 函数后可用于检索的字节数。在主设备中,它是在 requestFrom() 函数之后调用的,在从设备中,它是在 onReceive () 函数内部调用的。
这注册了一个函数,当从设备接收到来自主设备的传输时,该函数被调用。调用的函数由处理程序表示。
下图显示了两个Arduino板之间的I2C连接。此外,它还显示了LED与从属Arduino的D13的连接。通过一个 220 欧姆限流电阻器将 LED 的阳极引脚与 Arduino 数字引脚 13 连接起来。阴极引脚将接地。
此处已包含连线库,并启动了变量 x。此变量的值将传输到从设备。
#include
int x = 0;
这里已经调用了 wire.begin() 函数。详细信息可以在上面的部分找到。此外,内部缓冲区已启动。
void setup()
{
Wire.begin();
Serial.begin(9600);
pinMode(LED,OUTPUT);
}
此处的传输已从地址 9 启动。在此之后,x 的值已排队等待通过 I2C 总线传输。wire.write() 函数在 I2C 总线上传输当前值“x”。最后,x 的值已传输,并且使用 endTranmission () 命令保留了总线。
Wire.beginTransmission(9);
Wire.write(x);
Wire.endTransmission();
x 的值在循环中以 1 的步长递增,延迟为 200 毫秒,如果 x 的值大于 6,则此值重置为 0,然后从 0 再次递增。
x++;
if (x > 6)
{
x = 0;
}
delay(200);
#include
int LED=13;
int x = 0;
void setup()
{
Wire.begin();
Serial.begin(9600);
pinMode(LED,OUTPUT);
}
void loop()
{
Wire.beginTransmission(9);
Wire.write(x);
Wire.endTransmission();
x++;
if (x > 6)
{
x = 0;
}
delay(200);
}
首先,我们定义Arduino的引脚D13的符号名称。引脚D13将根据从主器件接收的值打开和关闭。此外,我们声明并初始化一个零变量 x。此变量 x 将用于存储从主 Arduino 接收的值。
#include // add i2c library
int LED = 13;
int x = 0;
在设置功能中,使用 pinMode() 函数将 LED 引脚设置为输出引脚。还将 Arduino 的从地址设置为 9。
pinMode(LED, OUTPUT);
Wire.begin(9);
Wire.onReceive(receiveEvent);
Serial.begin(9600);
声明和函数调用已按照上一节中的定义执行。这里接收事件 () 函数已通过调用 onReceive(处理程序) 函数进行注册。
void receiveEvent(int bytes)
{
x = Wire.read();
}
此接收事件 () 函数已在此处定义。它读取从1到6的值,该值将由主设备发送;然后将此值存储在变量 x 中,该变量已在程序的 setup 函数中声明。
void loop()
{
if (x <= 3)
{
digitalWrite(LED, HIGH);
}
else
{
digitalWrite(LED, LOW);
}
}
如果从主设备接收的 x 值小于或等于 3,则引脚 13 处的 LED 设置为导通,如果 x 的值大于 3,则引脚 13 处的 LED 设置为熄灭。
#include
int LED = 13;
int x = 0;
void setup()
{
pinMode (LED, OUTPUT);
Wire.begin(9);
Wire.onReceive(receiveEvent);
Serial.begin(9600);
}
void receiveEvent(int bytes)
{
x = Wire.read();
}
void loop()
{
if (x <= 3)
{
digitalWrite(LED, HIGH);
}
else
{
digitalWrite(LED, LOW);
}
}