TCA9548A I2C 多路复用器 Arduino 使用相同地址 I2C 设备

在本教程中,我们将学习如何将 TCA9548A I2C 多路复用器与 Arduino 结合使用。我们将讨论如何通过整合硬件解决方案来使用多个具有相同地址的 Arduino 的 I2C 设备。通过使用 TCA9548A I2C 多路复用器,我们将能够增加 Arduino 的 I2C 地址范围,并能够连接 8 个具有相同地址的 I2C 设备。

TCA9548A 是一款 1 至 8 I2C 多路复用器。通过将设备连接到多路复用器并选择要通过多路复用器进行通信的设备,您可以在单个微控制器上使用最多 8 个具有相同地址的 I2C 从设备。

Arduino I2C 通信引脚

对于 I2C 通信,不同的 Arduino 板有不同的引脚专用为 SDA 和 SCL 引脚。下面的列表显示了各种板上的这些引脚号。

  1. 在 Arduino UNO 中,引脚 A4 = SDA,引脚 A5 = SCL
  2. 对于 Arduino Mega2560,引脚 20 = SDA,引脚 21 = SCL
  3. 在 Arduino Leonardo 中,引脚 2 = SDA,引脚 3 = SCL
  4. 对于 Arduino Due,引脚 20 = SDA,引脚 21 = SCL、SDA1、SCL。

在 Arduino 中使用多个不同地址从属 I2C 设备

在本节中,我们将首先使用默认的 I2C 引脚将三个不同的 I2C 设备(OLED、SHT32(温度传感器)和 BME280(温度传感器))与 Arduino 连接。然后我们将对我们的板进行编程以运行 I2C 扫描仪。

所需组件

  1. Arduino
  2. SSD1306 OLED显示屏
  3. BME280传感器
  4. SHT31传感器
  5. 面包板
  6. 连接线

Arduino 与 OLED、BME280 和 SHT31 的接口

带有 SHT31、BME280 和 OLED 硬件的 Arduino

让我们看看如何将 Arduino 与 OLED、BME280 模块和 SHT31 模块连接在一起。我们将使用一条公共 I2C 线来连接所有设备。Arduino 将充当主机,BME280 传感器、SHT31 传感器和 OLED 将充当从机。

我们使用的四个设备之间的连接如下表所示。

ArduinoSSD1306 OLED显示屏BME280SHT31
3.3VVCCVCCVCC
A4SDASDASDA
A5SCLSCLSCL
接地GNDGNDGND

我们使用了上表中指定的相同连接。

Arduino I2C 扫描仪 Arduino 草图

每个 I2C 设备都有一个与其关联的地址。Arduino 使用该地址通过 I2C 协议与从机进行通信。

现在复制此代码并将其上传到您的开发板以及已连接的所有 I2C 设备。

此代码将扫描与 Arduino 连接的任何 I2C 设备,并指定串行终端中具有地址的设备数量。

#include <Wire.h>
 
void 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 (address<16) {
        Serial.print("0");
      }
      Serial.println(address,HEX);
      nDevices++;
    }
    else if (error==4) {
      Serial.print("Unknown error at address 0x");
      if (address<16) {
        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() {
      
}

Arduino I2C扫描仪串口终端

I2C 扫描器识别出 3 个连接到 I2C 接口的设备。OLED显示屏的I2C地址是0x3C,SHT31是0x44,BME280是0x76。

由于这三个 I2C 设备都有不同的地址,因此可以共享相同的 I2C 总线。

Arduino 在 OLED 上显示 BME280 和 SHT31 温度读数

从 I2C 扫描仪中可以看出,BME280、SHT31 和 OLED 具有不同的 I2C 地址,因此可以共享相同的 I2C 总线。让我们向您展示一个 Arduino 草图,它可以访问这两个传感器的温度读数并将其显示在 OLED 上。

我们将使用 Arduino IDE 对 Arduino 开发板进行编程。因此,您应该拥有最新版本的 Arduino IDE。

Arduino 多个具有不同地址的 I2C 设备 在 OLED 上显示温度

在 Arduino IDE 中安装 SSD1306 OLED 库

要在我们的项目中使用 OLED 显示屏,我们必须在 Arduino IDE 中安装 Adafruit SSD 1306 库。按照以下步骤即可成功安装。

打开 Arduino IDE 并单击 Sketch > Library > Manage Libraries。将打开以下窗口。

搜索库 Arduino IDE

在搜索选项卡中输入“SSD1306”并安装 Adafruit SSD1306 OLED 库。

安装OLED SSD1306库Arduino IDE

安装 BME280 Arduino 库

当我们将 BME280 传感器与 Arduino 连接时。因此,我们必须将 BME280 库安装到我们的模块中。该项目需要两个库:

  1. Adafruit_BME280 库
  2. Adafruit_传感器库

我们将使用 Arduino IDE 中的库管理器来安装最新版本的库。打开 Arduino IDE 并转到 Sketch > Include Libraries > Manage Libraries。 在搜索栏中输入 Adafruit BME280 库名称并安装它们。

Adafruit BME280 库 Arduino IDE

打开 Arduino IDE 并转到 Sketch > Include Libraries > Manage Libraries。 在搜索栏中输入 Adafruit 统一传感器库名称并安装。

Adafruit 统一传感器库安装

安装SHT31 Arduino库

由于我们将 SHT31 传感器模块与 Arduino 连接,因此我们必须安装库来访问传感器数据。该项目需要两个库:

  1. 阿达水果 SHT31
  2. Adafruit 总线IO

我们将使用 Arduino IDE 中的库管理器来安装最新版本的库。打开 Arduino IDE 并转到 Sketch > Include Libraries > Manage Libraries。 在搜索栏中输入 Adafruit SHT31 并安装最新版本。

安装 Adafruit SHT31 库

在搜索栏中输入 Adafruit BusIO 并安装它。

安装 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 具有不同地址的多个 I2C 设备 在 OLED 演示上显示温度

此外,您还可以在Arduino串口终端中查看温度读数。记得将波特率设置为115200。

Arduino 多个不同地址的I2C设备 显示温度终端

串行监视器

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 1 至 8 I2C 多路复用器 IC

TCA9548A 多路复用器

它是一种电子开关设备,使用户能够将多个 I2C 总线与其自身连接。所有具有相同地址的从站需要连接到不同的总线。为了与从机通信,连接到从机的总线由用户切换,然后寻址。

TCA9548A 多路复用器引脚分配

下图显示了用作 I2C 扩展器的 TCA9548A 多路复用器的引脚排列。

TCA9748A 多路复用器引脚分配

  • 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。我们需要以下组件:

所需组件

  1. Arduino
  2. 两个 SSD1306 OLED
  3. TCA9548A 多路复用器
  4. 四个 10k 欧姆上拉电阻
  5. 面包板
  6. 连接线

Arduino 与带有 OLED 的 TCA9548A 多路复用器的接口

让我们向您展示如何将 TCA9548A 多路复用器与 Arduino 和 OLED 连接。Arduino 将充当主机,OLED 将充当从机。

按照下面的示意图连接所有设备。

带有 TCA9748A 多路复用器和 OLED 的 Arduino 原理图

下表显示了 TCA9548A 与 Arduino 和两个 OLED 连接的引脚。

TCA9548A与其余设备的连接
vinArduino 的 3.3V,两个 OLED 的 VCC
GNDArduino 的 GND、两个 OLED 的 GND
SDAArduino的A4
SCLArduino的A5
SD0OLED1 的 SDA 带 10k 欧姆上拉电阻
SC0OLED1 的 SCL 带 10k 欧姆上拉电阻
SD1OLED2 的 SDA 带 10k 欧姆上拉电阻
SC1OLED2 的 SCL 带 10k 欧姆上拉电阻

带有 TCA9748A 多路复用器和 OLED 硬件的 Arduino

Arduino 使用 TCA9548A 多路复用器代码在 OLED 上显示文本

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Adafruit_SSD1306 display = Adafruit_SSD1306(128, 32, &Wire, -1);

void TCA9548A(uint8_t bus) //activate particular channel
{
  Wire.beginTransmission(0x70);  // TCA9548A address is 0x70
  Wire.write(1 << bus);          // send byte to select bus
  Wire.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 0x70
  Wire.write(1 << bus);          // send byte to select bus
  Wire.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 将开始显示各自的文本,如下所示:

带有 TCA9748A 多路复用器和 OLED 演示的 Arduino

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/211051.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

12.1平衡树(splay),旋转操作及代码

平衡树 变量定义 tot表示结点数量&#xff0c;rt表示根的编号 v[i]表示结点i的权值 fa[i]表示结点i的父亲节点 chi[i][2]表示结点i的左右孩子 cnt[i]表示结点i的权值存在数量&#xff0c;如1123&#xff0c;v[3]1&#xff0c;则cnt[3]2;就是说i3的三号结点的权值为1&…

深入理解贝叶斯分类与朴素贝叶斯模型(Naive Bayes, NB):从基础到实战

目录 贝叶斯分类 公式 决策规则 优点 贝叶斯分类器的例子——垃圾邮件问题 1. 特征&#xff08;输入&#xff09;&#xff1a; 2. 类别&#xff1a; 3. 数据&#xff1a; 4. 模型训练&#xff1a; 注&#xff1a;类别先验概率 5. 模型预测&#xff1a; 朴素贝叶斯模…

为自己创建的游戏编程源码申请软件著作权详细流程(免费分享模板)

以为我这篇文章制作的游戏申请软件著作权为例 Ren‘py 视觉小说 交互式故事游戏制作过程学习笔记(Windows下实现)(多结局游戏)-CSDN博客 一、网站注册 申请软著时&#xff0c;所有的著作权人都需要在中国版权保护中心官网注册账号&#xff0c;并进行实名认证后&#xff0c;才…

【LeetCode】链式二叉树OJ题---C语言版

链式二叉树OJ题 一、单值二叉树&#xff08;1&#xff09;题目描述&#xff1a;&#xff08;2&#xff09;思路表述&#xff1a;&#xff08;3&#xff09;代码实现&#xff1a; 二、二叉树最大深度&#xff08;1&#xff09;题目描述&#xff1a;&#xff08;2&#xff09;思路…

java学习part26线程安全

136-多线程-同步代码块解决两种线程创建方式的线程安全问题_哔哩哔哩_bilibili 1.安全问题 关键在于某些数据操作 2.解决 2.1同步代码块 相当于给数据操作加了互斥锁 2.1.1在实现runnable接口的方式下 锁对象要求必须是唯一的&#xff0c;因为可以看成是谁占了这个对象&…

SpringBoot 是如何启动一个内置的Tomcat

为什么说Spring Boot框架内置Tomcat 容器,Spring Boot框架又是怎么样去启动Tomcat的?我简单总结下学习过程。 一:简单了解SpringBoot的启动类 我们都知道Spring Boot框架的启动类上是需要使用 @SpringBootApplication 注解标注的, @SpringBootApplication 是一个复合注解…

Jupyter Markdown 插入图片

首先截图 注意 这一步是关键的&#xff01;&#xff01; 它需要使用电脑自带的截图&#xff0c;用qq啊vx啊美图秀秀那些都不行哦。 截图之后复制&#xff1a; 然后快捷键粘贴到jupyter里面&#xff0c;它会生成一段代码&#xff08;没有代码就是说截图形式不对&#xff09;&a…

深入计算机系统看性能优化

一&#xff0e;引言 “性能优化”&#xff0c;从计算机诞生之初就一直伴随着计算机技术的发展&#xff0c;直到现在。将来也必定不会消失。这是因为每个人都会追求性价比&#xff0c;花最少的钱&#xff0c;办最多的事。生活中也一样&#xff0c;就比如说泡茶&#xff0c;但凡…

2023年12月03日新闻简报(国内国际)

新闻简报 每天三分钟&#xff0c;朝闻天下事。今天是&#xff1a;2023年12月03日&#xff0c;星期日&#xff0c;农历十月廿一&#xff0c;祝工作愉快&#xff0c;身体健康&#xff0c;生活喜乐&#xff1a; &#x1f449;&#x1f449;国内新闻 1、1日凌晨&#xff0c;四川…

docker-速通

1.命令-镜像操作 docker pull nginx #下载最新版 docker pull nginx:1.20.1 #下载指定版本 镜像名:版本名&#xff08;标签&#xff09; docker images #查看所有镜像 # 如果只写镜像名实际就是redis redis:latest 记住这个不是命令 docker rmi 镜像名:版本号/镜像id…

Pandas教程06:DataFrame.merge数据的合并处理

DataFrame.merge() 是 pandas 库中用于合并两个DataFrame数据的方法。该方法主要用于根据一个或多个键&#xff08;键可以是列名或索引&#xff09;将两个 DataFrame 连接在一起&#xff0c;这个过程类似于 SQL 中的 JOIN 操作。 #我的Python教程 #微信公众号&#xff1a;wdPy…

【PTA-C语言】实验四-循环结构II

如果代码存在问题&#xff0c;麻烦大家指正 ~ ~有帮助麻烦点个赞 ~ ~ 实验四-循环结构II 7-1 跟奥巴马一起画方块&#xff08;分数 15&#xff09;7-2 打印九九口诀表&#xff08;分数 10&#xff09;7-3 求符合给定条件的整数集&#xff08;分数 15&#xff09;7-4 求特殊方程…

网络虚拟化场景下网络包的发送过程

网络虚拟化有和存储虚拟化类似的地方&#xff0c;例如&#xff0c;它们都是基于 virtio 的&#xff0c;因而在看网络虚拟化的过程中&#xff0c;会看到和存储虚拟化很像的数据结构和原理。但是&#xff0c;网络虚拟化也有自己的特殊性。例如&#xff0c;存储虚拟化是将宿主机上…

爬虫学习-基础(HTTP原理)

目录 一、URL和URI 二、HTTP和HTTPS &#xff08;1&#xff09;HTTP &#xff08;2&#xff09;HTTPS &#xff08;3&#xff09;HTTP与HTTPS区别 &#xff08;4&#xff09;HTTPS对HTTP的改进&#xff1a;双问的身份认证 三、TCP协议 &#xff08;1&#xff09;TCP三次握手…

2000-2021年上市公司过度负债数据

2000-2021年上市公司过度负债数据 1、时间&#xff1a;2000-2021年 2、指标&#xff1a; 证券代码、证券简称、会计期间、上市日期、行业代码、行业名称、是否剔除ST或*ST股、是否剔除当年新上市、已经退市或被暂停退市的公司、产权性质、盈利能力、杠杆率行业中位数、成长性…

ELK高级搜索,深度详解ElasticStack技术栈-下篇

前言&#xff1a;ELK高级搜索&#xff0c;深度详解ElasticStack技术栈-上篇 14. search搜索入门 14.1. 搜索语法入门 14.1.1 query string search 无条件搜索所有 GET /book/_search结果&#xff1a; {"took" : 969,"timed_out" : false,"_shar…

架构图是什么,怎么做?

架构图是一种用来描述系统或软件的结构和组成的图形表示。它展示了系统中各个组件之间的关系、交互和功能。通过绘制架构图&#xff0c;可以更好地理解和沟通系统的设计和实现。 绘制架构图的软件 目前市场上有许多用于绘制架构图的软件工具&#xff0c;下面简单…

Conmi的正确答案——“xxx.sh: 行 2: $‘\r‘: 未找到命令”

Ubuntu版本&#xff1a;23.10&#xff08;桌面版&#xff09; 问题原因&#xff1a; 这个sh文件被window编辑后会以DOS格式保存&#xff0c;但linux格式中回车只认“\n”&#xff0c;而DOS格式的回车则是“\r\n”。 解决方案&#xff1a; 使用nano打开一次文件&#xff0c;并且…

有两个篮子,分别为A 和 B,篮子A里装有鸡蛋,篮子B里装有苹 果,请用面向对象的思想实现两个篮子里的物品交换

问题&#xff1a; 有两个篮子&#xff0c;分别为A 和 B&#xff0c;篮子A里装有鸡蛋&#xff0c;篮子B里装有苹 果&#xff0c;请用面向对象的思想实现两个篮子里的物品交换 代码 package cn.ljh.algorithmic;/*** author JH*/ public class Demo07 {public static void main…

git rebase冲突说明(base\remote\local概念说明)

主线日志及修改 $ git log master -p commit 31213fad6150b9899c7e6b27b245aaa69d2fdcff (master) Author: Date: Tue Nov 28 10:19:53 2023 08004diff --git a/123.txt b/123.txt index 294d779..a712711 100644 --- a/123.txtb/123.txt-1,3 1,4 123 4^Mcommit a77b518156…