红绿灯
第九部分 I2C通信
填空题
- Arduino Mega 2560上,I2C总线接口主要通过______和______两个引脚实现。
答案:SDA(数据),SCL(时钟) - I2C总线中的SDA代表______。
答案:串行数据线 - I2C总线中的SCL代表______。
答案:串行时钟线 - Arduino Mega 2560的I2C总线通信速率最高可达______kHz。
答案:400 - 在I2C通信中,______是主动发起通信的一方。
答案:主机(或主设备) - I2C设备地址通常由______位组成。
答案:7 - 在I2C通信中,ACK信号表示______。
答案:应答(或确认) - Arduino Mega 2560使用______库来实现I2C通信。
答案:Wire - 在I2C通信过程中,如果设备没有应答,主机可能会收到______信号。
答案:NACK(非应答) - I2C总线上的每个设备都有一个唯一的______。
答案:设备地址 - 使用
Wire.begin()
函数可以初始化I2C通信,并设置Arduino为______。
答案:I2C主机 - 在I2C通信中,从机在接收到数据后,通常会通过______线向主机发送应答信号。
答案:SDA - 使用
Wire.write()
函数可以向I2C从机发送______。
答案:数据 - 在I2C通信中,主机通过发送______来告知从机即将进行读或写操作。
答案:起始信号 - 当I2C通信结束时,主机会发送______来结束通信。
答案:停止信号
单选题
- 下列哪个函数用于初始化Arduino的I2C通信?
A.Serial.begin()
B.Wire.begin()
C.SPI.begin()
答案:B - 在I2C通信中,哪个信号标志着通信的开始?
A. ACK
B. NACK
C. 起始信号
答案:C - I2C总线上的设备地址通常有多少位?
A. 8位
B. 7位
C. 6位
答案:B - 下列哪个函数用于向I2C从机发送数据?
A.Wire.read()
B.Wire.write()
C.Wire.available()
答案:B - 在I2C通信中,哪个信号用于表示从机已经成功接收到数据?
A. 起始信号
B. 停止信号
C. ACK信号
答案:C - Arduino Mega 2560的I2C通信主要依赖于哪两个引脚?
A. 0和1
B. 20和21
C. A0和A1
答案:B(SDA为20,SCL为21) - 下列哪个函数用于请求从I2C从机读取数据?
A.Wire.requestFrom()
B.Wire.send()
C.Wire.beginTransmission()
答案:A - I2C总线上的通信速率是由谁决定的?
A. 从机
B. 主机
C. 总线上的所有设备共同决定
答案:B - 在I2C通信过程中,如果主机没有接收到从机的应答,会收到什么信号?
A. ACK
B. NACK
C. 起始信号
答案:B - 下列哪个不是I2C通信的特点?
A. 多主机支持
B. 高速通信
C. 远距离通信(超过100米)
答案:C - 使用
Wire.endTransmission()
函数时,如果参数为true
,则表示什么?
A. 发送停止信号
B. 发送起始信号
C. 发送重复起始信号
答案:C - 在I2C通信中,哪个信号标志着通信的结束?
A. 起始信号
B. 重复起始信号
C. 停止信号
答案:C - Arduino Mega 2560支持的I2C通信速率最高可达多少kHz?
A. 100
B. 200
C. 400
答案:C - 下列哪个函数用于检查I2C总线上是否有数据可读?
A.Wire.available()
B.Wire.read()
C.Wire.onReceive()
答案:A - 在I2C通信中,从机是如何被寻址的?
A. 通过设备地址
B. 通过引脚号
C. 通过设备名称
答案:A
判断题
- I2C总线只能支持一个主机和多个从机进行通信。()
答案:对 - 在I2C通信中,主机和从机都可以主动发起通信。()
答案:错(只有主机可以主动发起通信) - I2C总线上的设备地址是唯一的,不会重复。()
答案:对(在同一总线上) - Arduino Mega 2560的I2C通信速率是固定的,不能改变。()
答案:错(可以通过编程调整) - 使用
Wire.begin()
函数可以初始化Arduino为I2C从机。()
答案:错(该函数初始化Arduino为I2C主机) - 在I2C通信中,ACK信号表示从机没有成功接收到数据。()
答案:错(ACK信号表示从机成功接收到数据) - I2C总线上的通信是双向的,主机和从机都可以发送和接收数据。()
答案:对 - I2C总线上的设备可以通过任意两个引脚进行连接。()
答案:错(必须通过SDA和SCL引脚连接) - 在I2C通信过程中,如果主机没有接收到从机的应答,会立即停止通信。()
答案:对(可能会发送停止信号或重复起始信号进行错误处理) - Arduino Mega 2560的I2C通信不需要额外的硬件支持,只需要通过软件编程即可实现。()
答案:对(但需要使用到Arduino板上的SDA和SCL引脚) - 使用
Wire.read()
函数可以从I2C从机读取数据,但不需要先发送请求。()
答案:错(需要先使用Wire.requestFrom()
函数发送请求) - I2C总线上的通信速率是由从机决定的。()
答案:错(是由主机决定的) - 在I2C通信中,起始信号和停止信号都是由主机发送的。()
答案:对 - Arduino Mega 2560可以同时作为I2C主机和从机进行通信。()
答案:错(在同一时刻只能作为主机或从机之一) - I2C总线是一种串行通信协议,适用于短距离、低速率的通信场景。()
答案:错(I2C总线适用于短距离、中速率的通信场景,虽然速率不是非常高,但也不是低速)
//Created by cslg.
// 由cslg创建
// 引入LCD I2C库
#include <LiquidCrystal_I2C.h>
// 初始化LCD I2C对象,地址为0x27,16列2行
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
// 初始化LCD显示和背光
lcd.init(); // 初始化LCD
lcd.backlight(); // 打开LCD背光
// 设置LED引脚为输出模式
pinMode(2, OUTPUT); // 红色LED引脚
pinMode(3, OUTPUT); // 黄色LED引脚
pinMode(4, OUTPUT); // 绿色LED引脚
}
void loop() {
// 红色LED亮起,表示停止
lcd.setCursor(5, 0); // 设置光标到第1行第6列(列从0开始计数)
lcd.println("STOP!"); // 在LCD上显示"STOP!"
digitalWrite(2, HIGH); // 点亮红色LED
delay(11000); // 延迟11秒
digitalWrite(2, LOW); // 熄灭红色LED
lcd.clear(); // 清除LCD显示
// 黄色LED亮起,表示准备出发
lcd.setCursor(1, 0); // 设置光标到第1行第2列
lcd.println("Prepare to go!"); // 在LCD上显示"Prepare to go!"
digitalWrite(3, HIGH); // 点亮黄色LED
delay(1000); // 延迟1秒
digitalWrite(3, LOW); // 熄灭黄色LED
lcd.clear(); // 清除LCD显示
// 绿色LED亮起,表示可以出发
lcd.setCursor(6, 0); // 设置光标到第1行第7列
lcd.println("GO!"); // 在LCD上显示"GO!"
digitalWrite(4, HIGH); // 点亮绿色LED
delay(7000); // 延迟7秒
// 绿色LED闪烁三次
for (int i = 0; i < 3; i++) {
digitalWrite(4, LOW); // 熄灭绿色LED
delay(500); // 延迟0.5秒
digitalWrite(4, HIGH); // 点亮绿色LED
delay(500); // 延迟0.5秒
}
digitalWrite(4, LOW); // 最后熄灭绿色LED
lcd.clear(); // 清除LCD显示
// 黄色LED再次亮起,表示准备停止
lcd.setCursor(0, 0); // 设置光标到第1行第1列
lcd.println("Prepare to stop!"); // 在LCD上显示"Prepare to stop!"
digitalWrite(3, HIGH); // 点亮黄色LED
delay(1000); // 延迟1秒
digitalWrite(3, LOW); // 熄灭黄色LED
lcd.clear(); // 清除LCD显示
// 可以根据需要添加延迟或其他逻辑,以避免循环过快
}
这段代码是一个用于Arduino的简单程序,它结合了LCD显示屏(通过I2C接口)和LED灯(红色、黄色、绿色)来模拟一个交通信号灯或者某种状态指示器的行为。下面是对代码的详细解释:
引入库和初始化对象
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
cpp复制代码
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#include <LiquidCrystal_I2C.h>
: 引入LiquidCrystal_I2C库,这个库用于控制通过I2C接口连接的LCD显示屏。
-
LiquidCrystal_I2C lcd(0x27, 16, 2);
: 创建一个LiquidCrystal_I2C对象lcd
,指定I2C地址为0x27
(这个地址可能因LCD模块而异),并设置LCD为16列2行。
setup()
函数
void setup() {
lcd.init();
lcd.backlight();
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
}
cpp复制代码
void setup() {
lcd.init();
lcd.backlight();
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
}
lcd.init();
: 初始化LCD显示屏。
-
lcd.backlight();
: 打开LCD的背光。 -
pinMode(2, OUTPUT);
等: 设置数字引脚2、3、4为输出模式,这些引脚将用于控制红色、黄色和绿色的LED灯。
loop()
函数
loop()
函数是Arduino程序的主循环,它会不断重复执行其中的代码。
- 红色LED亮起,表示停止
lcd.setCursor(5, 0);
lcd.println("STOP!");
digitalWrite(2, HIGH);
delay(11000);
digitalWrite(2, LOW);
lcd.clear();
cpp复制代码
lcd.setCursor(5, 0);
lcd.println("STOP!");
digitalWrite(2, HIGH);
delay(11000);
digitalWrite(2, LOW);
lcd.clear();
设置LCD光标到第1行第6列,并显示"STOP!"。
- 点亮红色LED(引脚2)。
- 延迟11秒。
- 熄灭红色LED。
- 清除LCD显示。
- 黄色LED亮起,表示准备出发
lcd.setCursor(1, 0);
lcd.println("Prepare to go!");
digitalWrite(3, HIGH);
delay(1000);
digitalWrite(3, LOW);
lcd.clear();
cpp复制代码
lcd.setCursor(1, 0);
lcd.println("Prepare to go!");
digitalWrite(3, HIGH);
delay(1000);
digitalWrite(3, LOW);
lcd.clear();
设置LCD光标到第1行第2列,并显示"Prepare to go!"。
- 点亮黄色LED(引脚3)。
- 延迟1秒。
- 熄灭黄色LED。
- 清除LCD显示。
- 绿色LED亮起,表示可以出发
lcd.setCursor(6, 0);
lcd.println("GO!");
digitalWrite(4, HIGH);
delay(7000);
cpp复制代码
lcd.setCursor(6, 0);
lcd.println("GO!");
digitalWrite(4, HIGH);
delay(7000);
设置LCD光标到第1行第7列,并显示"GO!"。
- 点亮绿色LED(引脚4)。
- 延迟7秒。
- 绿色LED闪烁三次
for (int i = 0; i < 3; i++) {
digitalWrite(4, LOW);
delay(500);
digitalWrite(4, HIGH);
delay(500);
}
digitalWrite(4, LOW);
lcd.clear();
cpp复制代码
for (int i = 0; i < 3; i++) {
digitalWrite(4, LOW);
delay(500);
digitalWrite(4, HIGH);
delay(500);
}
digitalWrite(4, LOW);
lcd.clear();
绿色LED闪烁三次,每次闪烁包括熄灭0.5秒和点亮0.5秒。
- 最后熄灭绿色LED。
- 清除LCD显示。
- 黄色LED再次亮起,表示准备停止
lcd.setCursor(0, 0);
lcd.println("Prepare to stop!");
digitalWrite(3, HIGH);
delay(1000);
digitalWrite(3, LOW);
lcd.clear();
cpp复制代码
lcd.setCursor(0, 0);
lcd.println("Prepare to stop!");
digitalWrite(3, HIGH);
delay(1000);
digitalWrite(3, LOW);
lcd.clear();
设置LCD光标到第1行第1列,并显示"Prepare to stop!"。
- 点亮黄色LED(引脚3)。
- 延迟1秒。
- 熄灭黄色LED。
- 清除LCD显示。
总结
这个程序通过LCD显示屏和LED灯模拟了一个简单的状态指示器或交通信号灯。它按照特定的顺序和时间间隔点亮和熄灭不同颜色的LED,并在LCD上显示相应的文字信息。这种类型的程序可以用于教学、演示或作为更复杂项目的一部分。