微博网站可以做兼职吗,什么平台可以打广告做宣传,网站建设技术服务合同,天津网站建设市场在本教程中#xff0c;我们将学习如何将 TCA9548A I2C 多路复用器与 Arduino 结合使用。我们将讨论如何通过整合硬件解决方案来使用多个具有相同地址的 Arduino 的 I2C 设备。通过使用 TCA9548A I2C 多路复用器#xff0c;我们将能够增加 Arduino 的 I2C 地址范围#xff0c…
在本教程中我们将学习如何将 TCA9548A I2C 多路复用器与 Arduino 结合使用。我们将讨论如何通过整合硬件解决方案来使用多个具有相同地址的 Arduino 的 I2C 设备。通过使用 TCA9548A I2C 多路复用器我们将能够增加 Arduino 的 I2C 地址范围并能够连接 8 个具有相同地址的 I2C 设备。
TCA9548A 是一款 1 至 8 I2C 多路复用器。通过将设备连接到多路复用器并选择要通过多路复用器进行通信的设备您可以在单个微控制器上使用最多 8 个具有相同地址的 I2C 从设备。
Arduino I2C 通信引脚
对于 I2C 通信不同的 Arduino 板有不同的引脚专用为 SDA 和 SCL 引脚。下面的列表显示了各种板上的这些引脚号。
在 Arduino UNO 中引脚 A4 SDA引脚 A5 SCL对于 Arduino Mega2560引脚 20 SDA引脚 21 SCL在 Arduino Leonardo 中引脚 2 SDA引脚 3 SCL对于 Arduino Due引脚 20 SDA引脚 21 SCL、SDA1、SCL。
在 Arduino 中使用多个不同地址从属 I2C 设备
在本节中我们将首先使用默认的 I2C 引脚将三个不同的 I2C 设备OLED、SHT32温度传感器和 BME280温度传感器与 Arduino 连接。然后我们将对我们的板进行编程以运行 I2C 扫描仪。 所需组件
ArduinoSSD1306 OLED显示屏BME280传感器SHT31传感器面包板连接线
Arduino 与 OLED、BME280 和 SHT31 的接口 让我们看看如何将 Arduino 与 OLED、BME280 模块和 SHT31 模块连接在一起。我们将使用一条公共 I2C 线来连接所有设备。Arduino 将充当主机BME280 传感器、SHT31 传感器和 OLED 将充当从机。
我们使用的四个设备之间的连接如下表所示。
ArduinoSSD1306 OLED显示屏BME280SHT313.3VVCCVCCVCCA4SDASDASDAA5SCLSCLSCL接地GNDGNDGND
我们使用了上表中指定的相同连接。 Arduino I2C 扫描仪 Arduino 草图
每个 I2C 设备都有一个与其关联的地址。Arduino 使用该地址通过 I2C 协议与从机进行通信。
现在复制此代码并将其上传到您的开发板以及已连接的所有 I2C 设备。
此代码将扫描与 Arduino 连接的任何 I2C 设备并指定串行终端中具有地址的设备数量。
#include Wire.hvoid setup() {Wire.begin();Serial.begin(115200);Serial.println(\nI2C Scanner);byte error, address;int nDevices;Serial.println(Scanning...);nDevices 0;for(address 1; address 127; address ) {Wire.beginTransmission(address);error Wire.endTransmission();if (error 0) {Serial.print(I2C device found at address 0x);if (address16) {Serial.print(0);}Serial.println(address,HEX);nDevices;}else if (error4) {Serial.print(Unknown error at address 0x);if (address16) {Serial.print(0);}Serial.println(address,HEX);} }if (nDevices 0) {Serial.println(No I2C devices found\n);}else {Serial.println(done\n);}delay(5000); Serial.print(i2c devices found:);Serial.println(nDevices);
}void loop() {}I2C 扫描器识别出 3 个连接到 I2C 接口的设备。OLED显示屏的I2C地址是0x3CSHT31是0x44BME280是0x76。 由于这三个 I2C 设备都有不同的地址因此可以共享相同的 I2C 总线。
Arduino 在 OLED 上显示 BME280 和 SHT31 温度读数
从 I2C 扫描仪中可以看出BME280、SHT31 和 OLED 具有不同的 I2C 地址因此可以共享相同的 I2C 总线。让我们向您展示一个 Arduino 草图它可以访问这两个传感器的温度读数并将其显示在 OLED 上。
我们将使用 Arduino IDE 对 Arduino 开发板进行编程。因此您应该拥有最新版本的 Arduino IDE。 在 Arduino IDE 中安装 SSD1306 OLED 库
要在我们的项目中使用 OLED 显示屏我们必须在 Arduino IDE 中安装 Adafruit SSD 1306 库。按照以下步骤即可成功安装。 打开 Arduino IDE 并单击 Sketch Library Manage Libraries。将打开以下窗口。 在搜索选项卡中输入“SSD1306”并安装 Adafruit SSD1306 OLED 库。 安装 BME280 Arduino 库
当我们将 BME280 传感器与 Arduino 连接时。因此我们必须将 BME280 库安装到我们的模块中。该项目需要两个库
Adafruit_BME280 库Adafruit_传感器库
我们将使用 Arduino IDE 中的库管理器来安装最新版本的库。打开 Arduino IDE 并转到 Sketch Include Libraries Manage Libraries。 在搜索栏中输入 Adafruit BME280 库名称并安装它们。 打开 Arduino IDE 并转到 Sketch Include Libraries Manage Libraries。 在搜索栏中输入 Adafruit 统一传感器库名称并安装。 安装SHT31 Arduino库
由于我们将 SHT31 传感器模块与 Arduino 连接因此我们必须安装库来访问传感器数据。该项目需要两个库
阿达水果 SHT31Adafruit 总线IO
我们将使用 Arduino IDE 中的库管理器来安装最新版本的库。打开 Arduino IDE 并转到 Sketch Include Libraries Manage Libraries。 在搜索栏中输入 Adafruit SHT31 并安装最新版本。 在搜索栏中输入 Adafruit BusIO 并安装它。 Arduino 在 OLED 代码上显示 BME280 和 SHT31 温度读数
代码如何运作
现在让我们了解代码的每个部分是如何工作的。
代码首先包含代码正常功能所需的所有必要库。Wire.h 将允许我们通过 I2C 协议进行通信。其余的库是我们刚刚安装的用于 BME280 传感器、SHT31 传感器和 OLED 功能的库。
#include Wire.h
#include Adafruit_Sensor.h
#include Adafruit_BME280.h
#include Adafruit_SHT31.h
#include Adafruit_GFX.h
#include Adafruit_SSD1306.h
然后我们通过将其设置在默认 I2C GPIO 引脚上来定义名为“bme”的 Adafruit_BME280 对象并创建名为“sht31”的 Adafruit_SHT31 对象。
Adafruit_BME280 bme;
Adafruit_SHT31 sht31 Adafruit_SHT31();
现在我们创建另一个名为 display 的对象它将处理 OLED 显示。此外通过将参数传递给 Adafruit_SSD1306() 函数来定义 OLED 显示屏的尺寸。 Adafruit_SSD1306 display Adafruit_SSD1306(128, 32, Wire);
setup()
打开串口通讯波特率为115200。
Serial.begin(115200);
通过调用显示对象的 begin() 方法来初始化 OLED 显示。
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
接下来我们将通过调用clearDisplay()函数来清除OLED屏幕。此外我们使用 setTextColor() 函数设置文本的颜色并传递 WHITE 作为参数。如果我们有深色背景我们将以白色显示文本如果我们有明亮背景那么我们将以黑色显示文本。另外我们使用 setTextSize() 设置字体大小。 display.clearDisplay();display.display();display.setTextSize(1);display.setTextColor(WHITE);
然后BME280 传感器使用进行初始化如果发生故障串行监视器上会打印一条错误消息。同样SHT31 传感器也被初始化。如果传感器初始化不成功串行监视器上将打印相关消息。 bool status;status bme.begin(0x76); if (!status) {Serial.println(Could not find a valid BME280 sensor, check wiring!);while (1);}if (! sht31.begin(0x44)) { Serial.println(Check circuit. SHT31 not found!);while (1) delay(1);}
loop()
在loop()函数中我们分别使用bme.readTemperature()和sht31.readTemperature获取BME280和SHT31温度读数。这些信息每秒都会显示在 Arduino 串行监视器和 OLED 上。
void loop() { display.setCursor(0,0);Serial.print(Temperature BME280 ); Serial.print(bme.readTemperature()); Serial.println( °C);display.print(Temperature: ); display.print(bme.readTemperature()); display.println( C);display.setCursor(0,20);Serial.print(Temperature SHT31 ); Serial.print(sht31.readTemperature()); Serial.println( °C);display.print(Temperature: ); display.print(sht31.readTemperature()); display.println( C);Serial.println();display.display();display.clearDisplay();delay(1000);
}
示范
要查看上述代码的演示请将代码上传到 Arduino。但是在上传代码之前请确保从 Tools Board 选择 Arduino 板并从Tools Port选择 Arduino 板连接的正确 COM 端口 。
一旦代码成功上传到开发板OLED 将开始显示两个传感器的温度读数如下所示 此外您还可以在Arduino串口终端中查看温度读数。记得将波特率设置为115200。 串行监视器 TCA9548A 与 Arduino 具有相同地址的多个 I2C 设备
在上一节中我们能够在 Arduino 的相同 I2C 引脚上连接三个不同的 I2C 设备。这是因为 Arduino 能够通过其唯一的地址来识别它们。但是当我们想用Arduino连接多个设备进行I2C通信但它们的地址相同时会发生什么情况呢例如两个BME280传感器与Arduino连接或两个OLED与Arduino连接。
要在 Arduino 上使用相同的 I2C 设备我们要么必须更改设备的 I2C 地址要么使用 I2C 多路复用器。然而更改设备的地址并不是那么简单并且它只允许在同一 I2C 总线上使用有限的设备。因此我们可以使用多路复用器例如。TCA9548A 允许最多 8 个具有相同地址的设备连接到同一 I2C 总线。因此它的工作电压范围为 3-5.5 伏因此可以方便地与具有 3.3/5V 逻辑引脚的微控制器一起使用。
下图显示了 TCA9548A 多路复用器我们将其与具有相同地址的 I2C 设备一起使用以便与 Arduino 进行通信。 TCA9548A 多路复用器 它是一种电子开关设备使用户能够将多个 I2C 总线与其自身连接。所有具有相同地址的从站需要连接到不同的总线。为了与从机通信连接到从机的总线由用户切换然后寻址。 TCA9548A 多路复用器引脚分配
下图显示了用作 I2C 扩展器的 TCA9548A 多路复用器的引脚排列。 Vin这是为模块提供电源的引脚。将Arduino的3.3V或5V引脚与此引脚连接。GND这是提供公共接地的引脚。SDA这是与主设备连接的I2C串行数据引脚。SCL这是与主设备连接的I2C串行时钟引脚。RST该引脚负责复位多路复用器。A0、A1、A2这三个引脚用于更改多路复用器的 I2C 地址。默认情况下当这些引脚未连接时其地址为 0x70。借助该模块单个 I2C 地址最多可扩展为 8 个 I2C 地址。SDx、SCx这些是外部 I2C 通道通道 0 至通道 7。对于具有相同地址的每个 I2C 设备将 SDA 引脚与 SDx 连接将 SCL 引脚与 SCx 连接。
Arduino 使用 TCA9548A 多路复用器在 OLED 上显示文本
让我们向您展示如何使用 TCA9548A 多路复用器通过 Arduino 连接和编程具有相同地址 0x3C 的两个 OLED。我们需要以下组件
所需组件
Arduino两个 SSD1306 OLEDTCA9548A 多路复用器四个 10k 欧姆上拉电阻面包板连接线
Arduino 与带有 OLED 的 TCA9548A 多路复用器的接口
让我们向您展示如何将 TCA9548A 多路复用器与 Arduino 和 OLED 连接。Arduino 将充当主机OLED 将充当从机。 按照下面的示意图连接所有设备。 下表显示了 TCA9548A 与 Arduino 和两个 OLED 连接的引脚。
TCA9548A与其余设备的连接vinArduino 的 3.3V两个 OLED 的 VCCGNDArduino 的 GND、两个 OLED 的 GNDSDAArduino的A4SCLArduino的A5SD0OLED1 的 SDA 带 10k 欧姆上拉电阻SC0OLED1 的 SCL 带 10k 欧姆上拉电阻SD1OLED2 的 SDA 带 10k 欧姆上拉电阻SC1OLED2 的 SCL 带 10k 欧姆上拉电阻 Arduino 使用 TCA9548A 多路复用器代码在 OLED 上显示文本
#include Wire.h
#include Adafruit_GFX.h
#include Adafruit_SSD1306.hAdafruit_SSD1306 display Adafruit_SSD1306(128, 32, Wire, -1);void TCA9548A(uint8_t bus) //activate particular channel
{Wire.beginTransmission(0x70); // TCA9548A address is 0x70Wire.write(1 bus); // send byte to select busWire.endTransmission();
}void setup()
{Serial.begin(115200);Wire.begin();delay(100);TCA9548A(0);display.begin(SSD1306_SWITCHCAPVCC, 0x3C);display.clearDisplay();display.setTextSize(2);display.setCursor(20, 10);display.setTextColor(WHITE);display.println(OLED #1);display.display(); TCA9548A(1);display.begin(SSD1306_SWITCHCAPVCC, 0x3C);display.clearDisplay();display.setTextSize(2);display.setCursor(20, 10);display.setTextColor(WHITE);display.println(OLED #2);display.display(); }void loop() {}
该代码如何运作
现在让我们了解代码的每个部分是如何工作的。
代码首先包含正确代码功能所需的所有必要库。Wire.h 将允许我们通过 I2C 协议进行通信Adafruit_GFX.h 和 Adafruit_SSD1306.h 是 OLED 库。 #include Wire.h
#include Adafruit_GFX.h
#include Adafruit_SSD1306.h
现在我们创建一个名为 display 的对象它将处理 OLED 显示。此外通过将参数传递给 Adafruit_SSD1306() 函数来定义 OLED 显示屏的尺寸。
Adafruit_SSD1306 display Adafruit_SSD1306(128, 32, Wire, -1);
接下来我们为 TCA9548A() 定义一个函数它接受一个参数即 I2C 总线通道。每当我们想要激活特定的 I2C 通道时就会调用此函数。
void TCA9548A(uint8_t bus)
{Wire.beginTransmission(0x70); // TCA9548A address is 0x70Wire.write(1 bus); // send byte to select busWire.endTransmission();
}
设置
打开串口通信波特率115200发起I2C通信。 Serial.begin(115200);Wire.begin();
接下来我们通过调用 TCA9548A() 函数来激活 I2C 通道 0并将 0 作为其中的参数传递。我们的第一个 OLED 与 I2C 通道 0 连接。之后我们初始化 OLED 显示、清屏、设置文本颜色、设置字体大小和光标位置。然后我们在显示屏上打印文本“OLED #1”。 TCA9548A(0);display.begin(SSD1306_SWITCHCAPVCC, 0x3C);display.clearDisplay();display.setTextSize(2);display.setCursor(20, 10);display.setTextColor(WHITE);display.println(OLED #1);display.display();
接下来我们通过调用 TCA9548A() 函数作为传递 1 作为其中的参数来激活 I2C 通道 1。我们的第二个OLED与I2C通道1连接。之后我们初始化OLED显示屏清除屏幕设置文本颜色设置字体大小和光标位置。然后我们在显示屏上打印文本“OLED #2”。
TCA9548A(1);display.begin(SSD1306_SWITCHCAPVCC, 0x3C);display.clearDisplay();display.setTextSize(2);display.setCursor(20, 10);display.setTextColor(WHITE);display.println(OLED #2);display.display();
示范
要查看上述代码的演示请将代码上传到 Arduino。但是在上传代码之前请确保从 Tools Board 选择 Arduino 板并从Tools Port选择 Arduino 板连接的正确 COM 端口 。
一旦代码成功上传到开发板两个 OLED 将开始显示各自的文本如下所示