0°

(六)ESPlorer 系列:NodeMCU I2C使用方法

介绍

I2C(Inter Integrated Circuit)是串行总线接口连接协议。它也被称为TWI(双线接口),因为它只使用两根电线进行通信。这两条线是SDA(串行数据)和SCL(串行时钟)。

I2C是基于确认的通信协议,即发送器在发送数据之后等待来自接收器的确认以知道接收器是否成功接收到数据。

I2Cworks有两种模式,

  • 主模式
  • 从模式

SDA(串行数据)线用于主设备和从设备之间的数据交换。SCL(串行时钟)用于主设备和从设备之间的同步时钟。

主设备启动与从设备的通信。主设备需要从设备地址启动与从设备的对话。从设备在主设备寻址时响应主设备。

NodeMCU的GPIO引脚具有I2C功能支持。由于ESP-12E的内部功能,我们无法将其所有GPIO用于I2C功能。因此,在将任何GPIO用于I2C应用程序之前,请先进行测试。

NodeMCU I2C功能

让我们看一下NodeMCU中可用于I2C接口的功能。

i2c.setup()

该功能用于初始化I2C模块。

句法: i2c.setup(id, SDApin, SCLpin, speed)

参数:

  • id总是0
  • SDApin 1到12,IO索引
  • SCLpin 1到12,IO索引
  • speedi2c.SLOW支持。它大约是100KHz

返回:它返回在参数中选择的SCL时钟速度。

 

i2c.address()

该功能用于设置I2C地址和读/写操作模式。

句法: i2c.address(id, device_addr, direction)

参数:

  • id总是0
  • device_addr 7位从设备地址。I2C器件地址是高7位,后跟单向(读/写)位。
  • direction i2c.TRANSMITTER用于写入模式,i2c。RECEIVER用于阅读模式

返回: true如果收到ack(确认),false如果没有收到确认。

 

i2c.start()

此函数用于发送I2C启动条件。

句法:i2c.start(id)

参数:

  • id总是0

返回: null

 

i2c.write()

该功能用于将数据写入I2C总线。数据项可以是多个数字,字符串或lua表。

句法: i2c.write(id, data1[, data2[, ..., datan]])

参数:

  • id总是0
  • data数据可以是数字,字符串或lua表。

返回:返回写入的字节数。

 

i2c.read()

此功能用于读取数据。

句法: i2c.read(id, len)

参数:

  • id总是0
  • len length即数据字节数

返回:接收数据的字符串

 

i2c.stop()

该功能用于发送I²C停止条件。

句法: i2c.stop(id)

参数:

id总是0

返回: null

 

让我们编写lua脚本,使用I2C协议在NodeMCU和Arduino Uno之间建立通信。

这里,NodeMCU充当I2C主设备,而Arduino Uno充当从设备。

主设备将向从设备发送hello字符串,从设备将响应主设备发送hello字符串。

在这里,我们正在使用

主设备: NodeMCU

从设备: Arduino Uno

从设备地址: 8

接口图如下图所示

(六)ESPlorer 系列:NodeMCU I2C使用方法

NodeMCU和Arduino I2C接口

 

NodeMCU的Lua脚本(主I2C设备)

id  = 0 -- always 0
sda = 1 -- set pin 1 as sda
scl = 2 -- set pin 2 as scl

i2c.setup(id, sda, scl, i2c.SLOW)   -- initialize i2c

i2c.start(id)       -- send start condition
if (i2c.address(id, 8, i2c.TRANSMITTER))-- set slave address and transmit direction
then
    i2c.write(id, 'Hello Arduino')  -- write string to slave arduino
    i2c.stop(id)    -- send stop condition
    i2c.start(id)   -- send start condition
    i2c.address(id, 8, i2c.RECEIVER)-- set slave address and receive direction
    response = i2c.read(id, 13)     -- read defined length response from slave
    i2c.stop(id)    -- send stop condition
print('Arduino responds with:',response) -- print response received from slave
else
print('Arduino Not responding..!')
end

适用于Arduino Uno的Arduino程序(从 I2C设备)

限制以下用户组阅读此隐藏内容

请先登录

您的用户组:

输出结果

从设备(Arduino Uno)串行监视器的输出窗口

(六)ESPlorer 系列:NodeMCU I2C使用方法

主设备(NodeMCU)上串行监视器的输出窗口

(六)ESPlorer 系列:NodeMCU I2C使用方法

 

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论